http://www0.info.kanagawa-u.ac.jp/~kaiya/wa/ dotcampus ショートコード 179067 ウエブアプリケーション 2015 第 12 回 Servlet 2015/12/10 海 谷 治 彦 1
演 習 解 答 例 期 末 試 験 について 目 次 JSP/Servletの 対 比 (ほぼ 復 習 ) Servletの 記 述 Servletのコンパイル Servletの 配 置 redirect と forward ウエブアプリに 利 用 可 能 な 通 常 Javaクラス 本 日 の 演 習 2
期 末 試 験 について やります. シラバスにそうかいちゃったんで. 本, 紙 類 は 持 ち 込 み 可 能 とします. PC, スマフォ, 携 帯 電 話,タブレット 等 はダメよ. 基 本, 知 識 を 問 う 問 題 ではなく, 理 由 を 問 う 問 題 中 心 になると 思 います. 3
復 習 ++ セットアップしてほしい 構 成 Lenovo : クライアント Firefox 等 : ウエブブラウザ HTTP CentOS 6.5 : サーバー MySQL 5.1 : データベース apache 2.2 : ウエブサーバー PHP 5.3 : モジュール Tomcat6 : アプリケーションサーバー JVM : モジュール 4
復 習 共 通 点 JSP どちらもサーバーで 実 行 される. JSP and Servlet すなわち,クライアントに 届 いた 時 にはただのHTML コレがJavaScriptとの 大 きな 違 い HTMLにJavaっぽいものを 埋 め 込 む. 雰 囲 気 はJavaScriptに 似 てるが, 上 記 のようにサーバー 内 で 実 行 される. phpはコレに 考 え 方 が 似 ている. オリジナルのクラス 等 を 作 成 する 場 合 は,Servletとの 連 携 が 必 要. Servlet Javaそのもの. mainメソッドは 書 かないのが 普 通. そもそも スーパークラスがフレームワーク 的 にできている. Javaのprint 機 能 でHTMLの 行 を 表 示 しないと,クライアント 側 で 解 釈 不 能 になる. どちらかといえば,JSPのサブルーチン 的 に 使 われるのが 普 通. 5
復 習 <HTML> <HEAD> <TITLE> JSP loop </TITLE> </HEAD> <BODY> <ul> <% int i; for(i=0; i<10; i++){ %> <li> number <%= i*3 %> <% } %> </ul> </BODY> </HTML> サンプル // Simple Servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Another extends HttpServlet { } public void doget( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>another!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>another!</h1>"); out.println("</body>"); out.println("</html>"); } 6
Tomcat6の 基 本 事 項 を 復 習 (JSP) HTMLにJavaの 断 片 を 埋 め 込 む 感 じ. 以 下 のフォルダの 下 の 個 々のフォルダがアプリケー ションである, 例 えば, /var/lib/tomcat6/webapps/アプリ/ JSPファイルはアプリのフォルダに 直 接 置 けばよい. JSPに 関 しては 特 にコンパイル 等 はいらない. DBにアクセスするためには, /var/lib/tomcat6/webapps/アプリ/meta-inf/context.html に 設 定 を 書 かないといけない. 7
Tomcat6の 基 本 事 項 (Servlet) Javaプログラムそのもの. 以 下 のフォルダの 下 の 個 々のフォルダがアプリケーションである. /var/lib/tomcat6/webapps/ ServletはJavaそのものなので 事 前 にコンパイルする 必 要 がある. クラスファイルは /var/lib/tomcat6/webapps/アプリ/web-inf/classes/ の 下 におく.パッケージに 分 けているなら,フォルダ 階 層 も 必 要. クラスファイルとページの 対 応 表 を 以 下 のファイルにかかないといけない. /var/lib/tomcat6/webapps/アプリ/web-inf/web.xml DBにアクセスするためには, /var/lib/tomcat6/webapps/アプリ/meta-inf/context.html に 設 定 を 書 かないといけない. 8
Servletソースの 構 造 アップしたサンプルを 見 ながら 聞 いてください. 例 えば,WhereApi.java 等. javax.servlet.http.httservletクラスのサブクラスとし て 構 成 する. 大 抵,doGet もしくは dopostメソッドをオーバーライ ドする. 独 自 にhtmlページを 構 成 する 場 合, respnseの 型 を 設 定 printlnで 一 行 一 行 htmlを 書 く という 面 倒 をしないといけない. JSPにあった 暗 黙 変 数 の 取 り 方 は 次 頁 へ. 9
復 習 JSPの 暗 黙 オブジェクト 以 下 のようなオブジェクト(インスタンス)が 宣 言 なしで 使 える. 主 にウエブとの 情 報 共 有 に 用 いられる. 宣 言 部 (<%! %>)では 使 えないことを 注 意. オブジェクト 名 application config exception out page 概 要 コンテナに 関 する 情 報 等 設 定 ファイルへのアクセス ページ 内 で 発 生 した 例 外 情 報 を 管 理 クライアントにデータを 出 力 する 手 段.out.printlnはよくつかう. JSPページそのもの. pagecontext ページ 単 位 で 利 用 可 能 な 情 報. request response httpリクエストへのアクセスを 提 供 httpレスポンスを 修 正 する 場 合 に 利 用 session セッションの 情 報, 次 回 以 降. 10
Servletでの 対 応 JSPでの 暗 黙 オブジェクトは 以 下 のようにSevletで は 取 得 できる. JSP application config exception out page pagecontext request response session Servlet javax.servlet.servletcontext a=this.getservletcontext(); javax.servlet.servletconfig c=this.getservletconfig(); 各 メソッドによる APIを 見 ること java.io.printwriter out=response.getwriter(); なし なし dopost 等 の 引 数 dopost 等 の 引 数 javax.servlet.http.httpsession s=request.getsession(); 11
主 なメソッド 基 本 的 にはHTTPのメソッドの 種 類 に 対 応.よく 使 うものは, doget ブラウザからGETメソッドでサーバーに 接 続 する 際 に 呼 び 出 される. dopost こちらはPOSTメソッドの 場 合. 引 数 の 構 成 はほぼ 同 じ 軽 くAPIを 見 直 してみてください. 12
Javaのコンパイル ( 一 般 論, 復 習 ) Eclipse 等 を 使 っていると 忘 れ 気 味 だが,javac というコマン ドラインのコンパイラが 存 在 する. servletでは 非 標 準 APIを 使 う 必 要 があるので, 自 身 でこの 準 備 を 行 う 必 要 がある. 具 体 的 には, 本 授 業 の 環 境 では, 以 下 のように,-cp オ プションを 付 ける 必 要 がある. 面 倒 だと 思 う 人 は shell scriptなり,alias なりにしてみること. サンプル 中 には,compile.sh というスクリプトが 入 っている. CLASSPATH という 環 境 変 数 を 設 定 してもよい. javac -classpath /usr/share/tomcat6/lib/../servlet.jar なんとか.java 13
Javaのパッケージ ( 一 般 論 ) Javaでは 同 じ 名 前 のクラスが 衝 突 しないように,パッ ケージという 概 念 がある. これによって, 例 えば, org.acm.kaiya.jindai クラスと, jp.ac.nii.kaiya.jindai クラスは, クラス 名 は 同 じでも, 別 のクラスとして 扱 える. パッケージ 名 は, 上 記 のように,.で 区 切 った 英 数 文 字 (-は 使 えない)の 列 で 構 成 される. 上 記 のように, 慣 例 として,ドメイン 名 を 逆 したした 名 前 をパッケージ 名 とすることが 多 い. kaiya.acm.org ならば org.acm.kaiya コンパイルは 問 題 無 いが, 実 行 時 点 の 配 置 には 考 慮 が 必 要.( 後 述 ) 14
サンプル // ごく 普 通 のクラス // パッケージの 定 義, 本 来 は,org.acm.kaiya 等, // ドメイン 逆 の 名 前 にすべきだが, // 面 倒 だから 単 に 一 語 のパッケージ 名 とした package kaiya; public class ImportTest2{ public int val=314; // public ImportTest2(){} public String say(){ return "I was imported!"; } } public static String saystatic(){ return "I am static and packaged. 2nd."; } 15
Servletのコンパイル javax.servletクラスは 標 準 的 なAPIではない. よって, 前 述 の-cpオプション 等 でライブラリが 入 っ ているフォルダもしくはjarファイルを 指 定 しないと いけない. 本 演 習 の 標 準 的 な 設 定 では, /usr/share/tomcat6/lib/../servlet.jar にSerlet 関 連 のクラスが 入 っている. よって, 以 下 のようにコンパイル javac -classpath /usr/share/tomcat6/lib/../servlet.jar なんとか.java 16
再 掲 載 Tomcat6の 基 本 事 項 (Servlet) Javaプログラムそのもの. 以 下 のフォルダの 下 の 個 々のフォルダがアプリケーションである. /var/lib/tomcat6/webapps/ ServletはJavaそのものなので 事 前 にコンパイルする 必 要 がある. クラスファイルは /var/lib/tomcat6/webapps/アプリ/web-inf/classes/ の 下 におく.パッケージに 分 けているなら,フォルダ 階 層 も 必 要. クラスファイルとページの 対 応 表 を 以 下 のファイルにかかないといけない. /var/lib/tomcat6/webapps/アプリ/web-inf/web.xml DBにアクセスするためには, /var/lib/tomcat6/webapps/アプリ/meta-inf/context.html に 設 定 を 書 かないといけない. 17
Servletの 配 置 コンパイルしたプログラムや 設 定 ファイルを 実 行 のために サーバーの 特 定 のフォルダにおくことを, 配 置 もしくはディ プロイ(deploy)と 呼 ぶ. 単 純 なアプリと 違 い,ウエブアプリを 含 めた 複 雑 なアプリは, この, 配 置 だけでわりと 一 苦 労 である. Servletやウエブアプリで 使 うJavaのclassファイルは, /var/lib/tomcat6/webapps/アプリ/web-inf/classes/ におけばよい. ただし,パッケージにした 場 合,パッケージに 応 じたフォル ダ 階 層 を 構 成 しないといけない( 次 頁 ). アプリとclassファイルの 対 応 表,web.xml については 後 述. 18
// サンプル acm.zip にはいってます package org.acm.kaiya; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Acm extends HttpServlet { public void doget( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ パッケージ 対 応 の 例 左 記 のようなパッケージに, クラスAcmを 定 義 した 場 合, 以 下 のように, わりと 深 いフォルダ 階 層 を 掘 らないといけない. メンドい response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); // 中 略 out.println("</html>"); } } 19
web.xml クラスファイルをブラウザからアクセスするための 対 応 表 で ある. 特 に 慣 例 は 無 い 様 だが,Strutsというフレームワークを 使 う 場 合 は.do とするようだ. 以 下, 例, 青 字 は 解 説 <servlet> <servlet-name>id20141210</servlet-name> 名 前 は 一 意 ならなんでもOK <servlet-class>org.acm.kaiya.acm</servlet-class> パッケージを 含 めたクラス 名 </servlet> <servlet-mapping> <servlet-name>id20141210</servlet-name> servletで 定 義 した 名 前 <url-pattern>/welcome</url-pattern> URLの 最 後 にコレがつく </servlet-mapping> 20
Servletの 実 行 アプリのURLに web.xml で 定 義 したurl-patternを くっつければ 実 行 できる. 普 通 のHTMLやJSPが 実 際 のフォルダ 階 層 に 合 致 しているのに 対 して,servletはそうでは 無 いので 注 意 が 必 要. 21
Form 等 からの 値 処 理 From 等 から 入 力 されたkey-valueをrequestから 取 り 出 す 典 型 的 なインタラクション 処 理 もJSP 同 様 に 記 述 可 能. 例 : svltform.zip を 参 照 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Register extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException{ String email = req.getparameter("email"); // 以 下, 略 } } 22
ServletからのDBアクセス JSPでのコードがほぼそのまま 利 用 できる. サンプルソース Sql1.java アプリ /tomcat/tomcat01/sql1 別 途, 本 日 のサンプル 中 に dbclass.zip というのも ある. これは,DB 操 作 部 分 を 独 立 したJavaクラスとして ある.( 後 述 ) 23
redirect と forward ユーザーからの 入 力 をトリガーとして, 他 のページ に 遷 移 することはformで 実 現 できる. ユーザーからのトリガー 無 く 他 のページに 処 理 を 移 すための 技 術 としてredirectとforwardがある. 例 えば,Servletで 何 か 計 算 をして,その 結 果 をJSPで 表 示 したい 場 合 等 はとても 便 利. Servletで 表 示 するのは 面 倒 だし. 無 論,Servlet Servlet, JSP JSP もOK キーとなるポイントはページ 間 でどのようにデータ を 共 有 するかである. redirect セッション 等 を 利 用 するしかない. forward リクエストの 情 報 がそのまま 引 き 継 がれる. の 違 いがある. 24
redirectのサンプル redict.zipを 参 照 // 略 Redirect.java public class Redirect extends HttpServlet { public void dopost(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException{ String email = req.getparameter("email"); if(email==null) email="unknown"; HttpSession s=req.getsession(); s.setattribute("email", email); res.sendredirect("/tomcat/redirect/show.jsp"); } } <body> <%-- show.jsp --%> <% String email= (String)session.getAttribute("email"); %> <div> <table border> <tr> <th>email address</th><tr> <tr> <td> <%=email%> </td></tr> </table> </div> <a href="form.html">[again]</a> </body> 25
forward.zipを 参 照. Forward.java から 抜 粋 forwardのサンプル public void dopost(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException{ // 折 角 なので,Servletで 追 加 情 報 をつけた req.setattribute("add", "ServletObjectID="+this); // 最 初 のJSPで 入 力 されたemailについては 何 も 対 処 してない 単 に 転 送 される this.getservletcontext().getrequestdispatcher("/show.jsp").forward(req, res); } show.jsp から 抜 粋 <% // 最 初 のJSPで 入 力 された 情 報 String email = request.getparameter("email"); if(email==null) email="unknown"; // Servletで 意 図 的 に 付 け 加 えた 情 報 String add = (String)request.getAttribute("add"); %> <div> <table border> <tr> <th>email address</th> <th>object ID</th> <tr> <tr> <td><%=email%></td> <td><%=add%></td> </tr> </table> </div> 26
自 作 のクラスについて JSP/Servlet 双 方 で 自 作 のクラスが 当 然 使 える. 配 置 等 については Servletの 配 置 や 次 頁 を 参 照. JSP/Servletはブラウザ 等 との 直 接 の 窓 口 に 過 ぎな いので, 業 務 に 特 化 した 処 理 内 容 やデータは, 別 途, 普 通 のクラスで 構 築 したほうがよい. 後 述 のMVCの 話. サンプル: インストール 時 に 配 布 した, tomcat01/simple2.jsp tomcat01/web-inf/classes/kaiya/importtest2.class 本 日 の dbclass.zip もサンプルの 一 種. 27
Tomcat6の 基 本 事 項 ( 一 般 クラス) 当 たり 前 だがJavaプログラムそのもの. 以 下 のフォルダの 下 の 個 々のフォルダがアプリケーションであり,アプリ 毎 に 使 うクラスを 準 備 する. /var/lib/tomcat6/webapps/ 事 前 にコンパイルする 必 要 がある. クラスファイルは /var/lib/tomcat6/webapps/アプリ/web-inf/classes/ の 下 におく.パッケージに 分 ける 必 要 があるらしく,フォルダ 階 層 が 必 要. web.xml は 特 に 書 かなくて 良 い. DBにアクセスするためには, /var/lib/tomcat6/webapps/アプリ/meta-inf/context.html に 設 定 を 書 かないといけない. 28
MVCについて Model-View-Controller の 略. オブジェクト 指 向 プログラミングで 習 ったかもしれない. アプリケーションを 作 る 際 に 上 記 の 三 つに 分 けて 設 計 すると 良 い という 指 針. Model アプリで 扱 う 業 務 や 活 動 のみを 扱 う 部 分. ショッピングサイトの 業 務 なら 商 品, 注 文, 顧 客 等 がコレに 相 当. 基 本,システムとは 関 係 ない 業 務 依 存 の 部 分. 主 に 普 通 のクラスやJavaBeans 等 で 実 現 される. View システムとしてユーザーと 相 互 作 用 する 部 分. 入 出 力. ウエブアプリならウエブページに 相 当 し, 主 にJSPが 担 当. Controller ModelとViewを 関 連 付 け, 業 務 の 進 行 を 制 御 する 部 分. 主 にServletが 担 当. 29
MVCのメリット 特 にModelと 他 を 分 離 することで, 実 現 方 法 を 簡 単 に 変 更 できる. 例 えば,ウエブアプリをやめて,アンドロイドの 専 用 アプ リを 作 ろうという 時 にも,Modelはそっくりそのまま 流 用 できる.(Javaの 場 合, 特 に) Modelで 表 現 される 業 務 は 往 々にして 類 似 したも のが 多 いので, 再 利 用 ができる. 我 々が 想 像 する 以 上 に 業 務 というのはワンパターン アマゾンも 楽 天 もやってることはほぼ 同 じ. 吉 野 家, 松 屋,すき 家 もほぼ 同 じ. アプリケーションフレームワーク 等. 30
JSP/Servletの 挙 動 が 変 になったら 以 下 をrootで 実 行 する. localhostのところは,127.0.0.1 かもしれない. # cd /var/cache/tomcat6/work/catalina/localhost/ # rm -rf アプリ 名 # cd /etc/tomcat6/catalina/localhost/ # rm アプリ 名.xml プログラムを 修 正 する. # /etc/rc.d/init.d/tomcat6 restart # /etc/rc.d/init.d/httpd restart # /etc/rc.d/init.d/tomcat6 force-reload でもよさそう. 31
本 日 の 演 習 dotcampusに 出 してください. 問 題 もdotcampusのほうを 参 照. 今 回 も 締 切 は 来 週 とします. そろそろインストも 落 ち 着 いてきたと 思 いますが, 問 題 の 規 模 も 微 妙 に 大 きくなってきたので. 本 日 は 以 上 32