Tomcat 入門
投稿日: | |
---|---|
タグ: |
本稿はtomcatの基本的な部分または最低限必要な部分に関するメモである。
Tomcatとは
Tomcatとは,Apacheソフトウェア財団謹製のJavaサーブレットコンテナである。要するにJavaでWebアプリを作成・実行するためのソフトウェアである。
Tomcat実行環境構築
私の環境(Debian)では,Tomcatは次のコマンド一発でインストール可能であった。
user% sudo aptitude install tomcat7
パッケージ管理を使わずともTomcatの公式ページからダウンロードし,それを解凍すればそれでも十分である。ただしその場合はいくつかの環境変数が必要だったり,起動するのに起動スクリプトではなくtomcatホームのbin/startup.shで起動したりする,といった違いがある。
Webアプリの作成
はじめに以下のディレクトリやファイルを作る。
ファイル(ディレクトリ) | 説明 |
---|---|
hello/WEB-INF/web.xml | 設定ファイル |
hello/WEB-INF/classes | 使用するクラス |
hello/WEB-INF/lib | 使用するライブラリ(JAR) |
web.xmlの中身は後述する。
次にWebアプリに必要なページを生成する。
- hello/login.html
<!doctype html> <html> <head> <title>login</title> </head> <body> <form action="/hello/Top" method="post"> <input name="username" type="text"> <input name="pass" type="password"> <input type="submit"> </form> </body> </html>
- TopServlet.java
作成したソースファイルをコンパイルしたものをhello/WEB-INF/classes/の下に配置する。import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class TopServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException { PrintWriter pw = res.getWriter(); res.setContentType("text/html; charset=UTF-8"); pw.println("<html>"); pw.println("<head><title>hoge</title></head>"); pw.println("<body>"); pw.println("<h1>" + req.getParameter("username") + "のページ</h1>"); pw.println("</body>"); pw.println("</html>"); } }
classpathはライブラリのパスを指定するオプションで,-dはクラスファイルを配置するルートを指定するオプションである。-dはなくても良いが,パッケージをユーザが意識しなくて済むので使った方が便利である。user% javac -classpath /usr/share/tomcat7/lib/servlet-api.jar -d hello/WEB-INF/classes TopServlet.java
- hello/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Top</servlet-name> <servlet-class>TopServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Top</servlet-name> <url-pattern>/Top</url-pattern> </servlet-mapping> </web-app>
最後に生成したディレクトリを圧縮する。
user% cd hello/
user% jar -cvf hello.war *
これによって生成されたhello.warをTomcat実行環境のwebapps直下に配置する。
user% mv hello.war /var/lib/tomcat7/webapps/.
そして,Tomcatを起動すればWebアプリが実行される。
user% sudo service tomcat7 start
user% sudo /
特別にポート番号などを指定しない場合,デフォルトでは次のURLにアクセスすれば作成したページにアクセスできる。
http://localhost:8080/hello/login.html
おまけ
HttpServlet
GETとPOST
HTTPやHTMLのFORMタグに出てくるアクセス方法(メソッド)は,それぞれ以下のHttpServletの関数で処理する。
post | doPost |
get | doGet |
initとdestroy
doGetやdoPostはページが開かれる度に処理される。 これに対して,Tomcatの起動時(正しくは最初のアクセス時)と終了時に処理される処理を書きたい場合,それぞれinitメソッドとdestroyメソッドをオーバーライドする。
@Override
public void init throws ServletException (){}
@Override
public void destroy(){}
forward
Webアプリでは,あるアクセスに対して,複数のサーブレットで処理を行いたい場合がある。 そのような時,次のようなコードを記述する。
- FirstServlet.java(First)
public class FirstServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException { String username = req.getParameter("username"); 〜〜 RequestDispatcher dispatch = request.getRequestDispatcher("/Second"); req.setAttribute("username", username); dispatch.forward(req, res); } }
- SecondServlet.java(Second)
public class SecondServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException { String username = (String)req.getAttribute("username"); 〜〜 } }
スコープ
page | サーブレットに要求が来てから,フォワードするかレスポンスを返すまでの間 |
request | ユーザにレスポンスを返すまでの間 |
session | 異なるリクエストを超えて保持したい場合に使用される。 |
application | Webアプリケーション内 |
JSP
サーブレットを作成する場合,簡単な内容であればJSPを使用してより簡易に記述することができる。
<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello</title>
<%
ArrayList<String> ary = new ArrayList<String>();
String tbody = "";
ary.add("hoge");
ary.add("fuga");
ary.add("piyo");
for (int i=0;i<3;i++){
tbody += "<tr><td>" + i + "</td><td>" + ary.get(i) + "</td></tr>";
}
%>
</head>
<body>
<!-- 見出し -->
<div align="center">
<table>
<tbody>
<%= tbody %>
</tbody>
</table>
</div>
</body>
</html>
このファイルが例えばhello/Hello.jspであれば,URLは"http://localhost:8080/hello/Hello"になる。
JSPは,以下のタグと,新たに拡張したタグを記述することで,簡単にサーブレットを作成できる。
| ディレクティブ | 設定を行う。例えばpageディレクティブはエンコード方式やインポートなどを行う。 |
| 宣言 | Webアプリが起動直後に1回だけ行う処理を記述する(ページを開き直しても処理されない)。 |
| スクリプトレット | Javaのコードを記述する。 |
| 式 | 評価結果を出力する。 |
| アクションタグ | 別ファイルの展開やページフォワードなどサーブレットの処理を行う |
暗黙オブジェクト
JSPでは宣言せずに利用できるオブジェクトがいくつかある。以下にいくつか例を挙げる。
- request
- response
- session
例えばrequestはrequest.getParameter("username")のようにして使用できる。