魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

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
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>");
    }
}
作成したソースファイルをコンパイルしたものをhello/WEB-INF/classes/の下に配置する。
user% javac -classpath /usr/share/tomcat7/lib/servlet-api.jar -d hello/WEB-INF/classes  TopServlet.java
classpathはライブラリのパスを指定するオプションで,-dはクラスファイルを配置するルートを指定するオプションである。-dはなくても良いが,パッケージをユーザが意識しなくて済むので使った方が便利である。
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の関数で処理する。

postdoPost
getdoGet
2つのメソッドは返却値を引数も同じであり,ほぼ同じように作成することができる。

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異なるリクエストを超えて保持したい場合に使用される。
applicationWebアプリケーション内
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:〜 >
アクションタグ別ファイルの展開やページフォワードなどサーブレットの処理を行う
暗黙オブジェクト

JSPでは宣言せずに利用できるオブジェクトがいくつかある。以下にいくつか例を挙げる。

  • request
  • response
  • session

例えばrequestはrequest.getParameter("username")のようにして使用できる。

一覧