Webとデータモデリング Javaによるサーバサイドプログラミング 北 川 博 之, 森 嶋 厚 行, 天 笠 俊 之 1 内 容 Javaによるサーバサイドプログラミング サーブレット JSP (Java Server Pages) Javaからのデータベースアクセス JDBC (Java Database Connectivity) 2 1
使 用 するソフトウェア サーブレット,JSP Apache Tomcat http://tomcat.apache.org/ apache org/ JDBC MySQL Connector/J MySQLに 付 属 3 Java Servletの 利 用 4 2
Java Servlet ウェブアプリケーションを 実 現 するためのサーバサイド 技 術 動 的 コンテンツ 生 成 1. アプリケーションロジック 実 行 2. 結 果 のHTML 化 動 的 コンテ ンツ 生 成 HTTPリクエスト 要 求 による 振 り 分 け Servletコンテナ クライアント HTTPレスポンス Webサーバ HTML 画 像 静 的 コンテンツ 5 HTTP 通 信 の 概 要 メッセージヘッダ ボディ 送 信 データ リクエストメッセージ HTTPクライアント メッセージヘッダ HTML 画 像 HTTPサーバ バ ボディ HTML 画 像 動 画... レスポンスメッセージ 6 シャープAjax 研 修 2008/12/16-17 3
URL (Uniform Resource Locator) http://www.coins.tsukuba.ac.jp:80/syllabus/timetable_com.html スキーム ホスト 名 (IPアドレス) ポート 番 号 パス 名 Webサーバ www.coins.tsukuba.ac.jp 130.158.86.207 代 表 的 なスキーム: ftp: news: wais: gopher: nntp: file: mailto: 7 telnet: prospert: / (document root) +-syllabus/ +-timetable_com.html HTTPメッセージの 例 % telnet www.coins.tsukuba.ac.jp 80 GET /index.html HTTP/1.0 HTTP/1.1 200 OK Date: Wed, 17 May 2006 15:02:58 GMT Server: Apache/2.0.55 (Unix) PHP/4.4.2 Last Modified: Mon, 17 Apr 2006 09:38:56 GMT ETag: 12295c 4ba9 30f8ec00 Accept Ranges: bytescontent Length: 19369Connection: closecontent Type: text/html <!DOCTYPE HTML PUBLIC " //W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http equiv= Content Type content="text/html; charset=shift_jis"> <title> 筑 波 大 学 第 三 学 群 情 報 学 類 </title>... 8 マルチメディアの 舞 台 裏 I 2008/5/26 4
HTTPメッセージの 構 造 リクエストメッセージ レスポンスメッセージ リクエストライン ステータスライン リクエストヘッダ フィールド メッセージヘッダ 一 般 ヘッダフィールド エンティティヘッダ フィールド その 他 空 行 (CR + LF) メッセージボディ レスポンスヘッダ フィールド メッセージヘッダ 一 般 ヘッダフィールド エンティティヘッダ フィールド その 他 空 行 (CR + LF) メッセージボディ 9 リクエストメッセージ リクエストメッセージのヘッダには, 先 頭 行 に 必 ず リクエ ストライン が 含 まれる メソッド リクエストURI HTTPバージョン 10 マルチメディアの 舞 台 裏 I 2008/5/26 5
メソッド メソッド HTTPバージョン 機 能 HEAD 指 定 したURL 取 得 の 結 果 レスポンスのヘッダー のみ 取 得 する GET 指 定 したURLが 示 すリソースを 取 得 する POST 指 定 したURLが 示 すサーバーのコマンドに 対 して データを 転 送 する PUT 指 定 したURLが 示 すリソースに 対 して データを 転 送 して 置 き 換 える DELETE 指 定 したURLが 示 すリソースを 削 除 する TRACE サーバーやプロキシの 動 作 を 診 断 するための 情 報 を 返 答 する OPTIONS 使 用 できるメソッドやオプションの 一 覧 を 取 得 す る CONNECT プロキシでのトンネリング 接 続 を 行 う 11 レスポンスメッセージ サーバが 返 答 するメッセージ. 先 頭 行 には 必 ず ステー タスライン が 含 まれる HTTPバージョン ステータスコード 結 果 フレーズ 主 なステータスコード 200 OK 400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 12 マルチメディアの 舞 台 裏 I 2008/5/26 6
Servletプログラミング 13 Tomcatのディレクトリ 構 成 ディレクトリ bin/ common/ conf/ logs/ server/ 役 割 Tomcatのバイナリファイル, 起 動, 終 了 スクリプト 等 実 行 に 必 要 なJavaのclassファイル サーブレットのコンパイルに 必 要 なライブラリ 群 Tomcat 全 体 の 設 定 ファイル web.xml, server.xml ログ サーブレットコンテナの 実 行 に 必 要 なプログラム shared/ Webアプリケーションから 利 用 するライブラリ webapps/ work/ Webアプリケーションのインストールディレクトリ 一 時 ファイルの 保 存 (JSPが 実 行 時, 初 回 にコンパイルされ サーブレットとなったファイルが 配 置 される) 14 7
Webアプリケーションのディレクトリ 構 成 アプリケーションのルートディレクトリ 任 意 のファイル 任 意 のディレクトリ WEB-INF/ web.xml classes/ サーブレットのクラスファイル lib/ サーブレットで 利 用 するクラスライブラリ 15 サーブレットコンテキスト http://www.site-cooler.com/java/tomcat/#5 16 8
Servletプログラミング HttpServletクラスを 拡 張 HTTP 特 有 のリクエスト 処 理 メソッドをオーバーライド init(), it() destroy() doget(), dopost(), 引 数 HttpServletRequest request HttpServletResponse response web.xmlの 記 述 と 配 置 17 JDBCによるデータベースアクセス 18 9
JDBCとは Javaとデータベースとの 接 続 のためのAPI SQLを 使 ってデータベースにアクセス JDBCドライバド 各 データベースシステム 毎 に 提 供 ドライバのロード Class.forName("ドライバクラス 名 ") メソッドを 利 用 19 DriverManager インターフェイスを 使 用 して MySQL に 接 続 import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception; // Notice, do not import com.mysql.jdbc.* // or you will have problems! public class LoadDriver { public static void main(string[] args) { try { // The newinstance() call is a work around for some // broken Java implementations Class.forName("com.mysql.jdbc.Driver").newInstance(); catch (Exception ex) { // handle the error 20 http://dev.mysql.com/doc/refman/5.1/ja/connector-j-usagenotes-basic.html# connector-j-usagenotes-connect-drivermanager 10
ステートメントを 使 用 してSQLを 実 行 (1/2) // assume that conn is an already created JDBC connection Statement stmt = null; ResultSet rs = null; try { stmt = conn.createstatement(); rs = stmt.executequery("select foo FROM bar"); // or alternatively, if you don't know ahead of time that // the query will be a SELECT... if (stmt.execute("select foo FROM bar")) { rs = stmt.getresultset(); // Now do something with the ResultSet... finally { 21 http://dev.mysql.com/doc/refman/5.1/ja/connector-j-usagenotes-basic.html# connector-j-usagenotes-connect-drivermanager ステートメントを 使 用 してSQLを 実 行 (2/2) finally { // it is a good idea to release // resources in a finally{ block // in reverse order of their creation // if they are no longer needed if (rs!= null) { try { rs.close(); catch (SQLException sqlex) { // ignore rs = null; if (stmt!= null) { try { stmt.close(); catch (SQLException sqlex) { // ignore stmt = null; 22 http://dev.mysql.com/doc/refman/5.1/ja/connector-j-usagenotes-basic.html# connector-j-usagenotes-connect-drivermanager 11
StatementとPreparedStatement Statementの 例 Statement stmt = conn.createstatement(); for ( int id = 0 ; id < 10000 ; id++ ) { String sql = "SELECT NAME FROM ITEM WHERE I_ID = " + id; ResultSet rs = stmt.executequery(sql); while ( rs.next() ) { // 表 示 などの 処 理 PreparedStatementの 例 String sql = "SELECT NAME FROM ITEM WHERE I_ID =?"; PreparedStatement ps = conn.preparestatement(sql); for ( int id = 0 ; id < 10000 ; id++ ) { ps.setint(1,id); ResultSet rs = ps.executequery(); while ( rs.next() ) { // 表 示 などの 処 理 23 StatementとPreparedStatementの 違 い Statement 毎 回 構 文 解 析 を 実 行 PreparedStatement t t 動 的 に 変 化 する 部 分 をプレースホルダ(?)で 置 き 換 える 構 文 解 析 は 一 度 だけ 24 12
StatementとPreparedStatementの 違 い 25 http://www.atmarkit.co.jp/fjava/rensai2/webopt11/webopt11.html 13