Servlet J2EE I 第8回 / 2005-07-15
ここでの内容 Servlet の概要について学ぶ。特に、HTTPの要求と応答との関係に着目する。 Servlet の動かし方を学ぶ。
Servletの基本
Servlet とは (1) JSPと同じく、Webブラウザからのリクエストを処理して動的なページを作成するためのもの。 CGIと同じように、プログラムの中から HTMLを出力できる。 JSPと同じく、Tomcat などの Webコンテナの内部で動く。
Servlet とは (2) HttpServlet というクラスを継承したクラス。必要なメソッドをオーバーライドする。 public class HogeServlet extends HttpServlet { }
Servletの起動 Servletと結びついているURLにアクセスがあると、Servletのメソッドが実行される。
Servlet のメソッド HTTPのGETメソッドからServletが呼ばれたら doGet public void doGet( HttpServletRequest req, HttpServletResponse res) HTTPのPOSTメソッドからServletが呼ばれたら doPost public void doPost( HttpServletRequest req, HttpServletResponse res)
HttpServletRequest と HttpServletResponse
HttpServletRequest と HttpServletResponse HTTPの「要求」に対応するオブジェクト HttpServletResponse HTTPの「応答」に対応するオブジェクト
要求のヘッダ情報の取得 HttpServletRequest 型のオブジェクトである request から ヘッダ情報の Enumeration を取り出す。 Enumeration e = request.getHeaderNames();
Enumeration の考え方 Enumeration には複数のオブジェクトが含まれている。 これらのオブジェクトを while 文で次々と処理していく。 while文1回のループで、1つのオブジェクトを処理
Enumeration を使った処理 // e には(HTTPの)要求のヘッダの名前が複数ある Enumeration e = request.getHeaderNames(); // まだ未処理のヘッダが残っているかどうか while (e.hasMoreElements()) { // 次に処理するオブジェクト (=ヘッダ)を取り出す String name = (String)e.nextElement(); out.print(name + ": "); }
クエリーの処理 HttpServletRequest 型のオブジェクトである request を取得する。 request.getParameter(“familyName”) を実行。
HTMLの出力 HttpServletResponse 型のオブジェクトである response から PrintWriter オブジェクトを取り出す。 HTTPの応答で、HTMLの出力を行うから PrintWriter オブジェクトの println() あるいは print() メソッドで HTML を書き出す PrintWriter out = response.getWriter(); out.println(“<html>”);
TomcatでServletを動かす
Jarファイル J2SEに含まれていないJavaのプログラム (=クラスファイル)は「Jarファイル」にまとめられている。 Jarファイル Zip とほとんど同じフォーマット。つまり圧縮+アーカイブの機能を持っている。
Jarファイルの取り扱い (1) J2SE 添付の jar コマンドを使う Jarファイルを作る Jarファイルを展開 jar cvf sample.jar sample¥ sampleフォルダ以下を sample.jar にまとめる Jarファイルを展開 jar xvf sample.jar sample.jar を展開(解凍)する
Jarファイルの取り扱い (2) Jarファイルの中身を見てみる jar tvf sample.jar sample.jar の中身を見てみる jar コマンドのオプションは、Unix の tar コマンドとほとんど同じ
クラスパス あるプログラムをコンパイル・実行するとき、J2SE以外のjarファイルを必要とする場合、classpath オプションで jar ファイルを指定する コンパイル Javac -classpath hoge.jar Test.java 実行 java -classpath hoge.jar;. Test
Servlet のコンパイル 次のパッケージはJ2SEには入っていない。 javax.servlet パッケージ javax.servlet.http パッケージ Tomcat 中のjarファイルにこのパッケージが含まれているので、classpath に含めてコンパイル javac –classpath “%CATALINA_HOME%\common\lib\servlet-api.jar” LoopServlet.java
Tomcat への配置 Servlet はコンパイルしておくこと。 WEB-INF/classes フォルダに置く。 WEB-INF/ --- web.xml |- classes/ --- LoopServlet.class | |- DateServlet.class |- lib/
web.xml の編集 Servlet を置いただけでは動かない。 web.xml を編集する必要あり。
web.xml の例 (抜粋) <servlet> <servlet-name>loop</servlet-name> <servlet-class>LoopServlet</servlet-class> </servlet> (中略) <servlet-mapping> <url-pattern>/loop</url-pattern> </servlet-mapping>
Servlet へのアクセス web.xml の url-pattern 要素で指定した URL にアクセスする。 http://localhost:8080/test/loop http://localhost:8080/test/date