WebApp/Tomcat

実行環境の整備

tomcatを実行するユーザーを作成

# useradd tomcat

jdkをインストールする

OracleのページからRPMパッケージをダウンロードし、そのまま実行する

# ./jdk-6u29-linux-i586-rpm.bin

tomcatをインストール

apache-tomcat-x.x.x.tar.gz を解凍して作成されたディレクトリが、そのままtomcatのHOMEディレクトリとなる
バージョンに依存させない為、シンボリックリンクを作成する

# mv apache-tomcat-x.x.x ~tomcat
# cd ~tomcat
# pwd
  /home/tomcat
# chown -R apache-tomcat-x.x.x
# ln -s apache-tomcat-x.x.x tomcat
# ls -l
  drwxr-xr-x. 9 tomcat tomcat 4096  3月 12 15:23 2012 apache-tomcat-6.0.35
  lrwxrwxrwx. 1 root   root     20  3月  1 17:05 2012 tomcat -> apache-tomcat-6.0.35

tomcatユーザーの.bash_profileに環境変数を追加

JDKや、tomcatのパスはインストール環境に合わせて変更すること

export JRE_HOME=/usr/java/jdk1.6.0_29
export CATALINA_HOME=/home/tomcat/tomcat
export CLASSPATH=.:$JRE_HOME/jre/lib:$JRE_HOME/lib:$JRE_HOME/lib/tools.jar:$CATALINA_HOME/lib/servlet-api.jar

tomcatの実行または停止

$CATALINA_HOME/bin/startup.sh
$CATALINA_HOME/bin/shutdown.sh

スタートアップスクリプトに登録する

/etc/rc.d/init.d/ に tomcat ファイルを作成、以下の内容を保存すること
chkconfig: 345 80 15 は任意で書き換えること(onにするRUNLEVEL 起動時の順番 終了時の順番)

#!/bin/bash
#
# Startup script for the tomcat
# chkconfig: 345 80 15
# description: Tomcat is a Servlet+JSP Engine.

# Source function library.
. /etc/rc.d/init.d/functions
source /etc/profile

TOMCAT_USER=tomcat
source ~tomcat/.bash_profile

start(){
    if [ -z $(/sbin/pidof java) ]; then
        echo "Starting tomcat"
        su - $TOMCAT_USER -c "$CATALINA_HOME/bin/startup.sh"
        touch /tmp/tomcat
    else
        echo "tomcat allready running"
    fi
}

stop(){
    if [ ! -z $(/sbin/pidof java) ]; then
        echo "Shutting down tomcat"
        su - $TOMCAT_USER -c "$CATALINA_HOME/bin/shutdown.sh"
        until [ -z $(/sbin/pidof java) ]; do :; done
        \rm -f /tmp/tomcat
    else
        echo "tomcat not running"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        su -s /bin/bash - $TOMCAT_USER -c "$CATALINA_HOME/bin/catalina.sh version"
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
esac
exit 0

サービス登録を行う

# chkconfig --add tomcat


Windowsでコンパイル環境を整えるには以下の環境変数を定義する

環境変数設定値
PATH.;%JAVA_HOME%\bin
JAVA_HOMEC:\j2sdk1.6_37
CATALINA_HOMEC:\Program Files\Apache Software Foundation\Tomcat 5.5
CLASSPATH.;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\atmarkit\WEB-INF\classes;


構成ディレクトリ($CATALINA_HOME)

bin

Tomcatの起動や停止に使うスクリプトを格納

common

Webアプリケーションからアクセス可能なクラスを格納
サブディレクトリのclassesには展開済みのクラスが、libディレクトリにはJARファイルを格納する
servlet-api.jarやjsp-api.jarもここに入ってる

conf

各種設定ファイル(サーバ設定ファイル、ユーザリストなど)が入ってる

logs

サーバに対して出されたリクエストのログ、標準出力、標準エラーメッセージのログ、Tomcat同梱のサンプルアプリケーションのログファイルもここに格納

server

Catalina(サーブレットAPIの実装エンジン)だけが使用できるクラスがサブディレクトリのclassesとlibに入ってる
これにはCGIや正規表現をサポートするためのライブラリや、Webサーバとの連携用のコネクタなどが含まれる

shared

Webアプリケーションからアクセスできるクラスが入る。commonと違いCatalinaはアクセス不可

temp

一時的なファイルの保存先

webapps

Webアプリケーションを配置するディレクトリ
server.xmlの<Host name="localhost" appBase="webapps">で定義されている
http://<IPアドレス>:8080/ と指定した場合 webapp/ROOT のディレクトリ内のファイルが参照される
ROOT以外のフォルダ(webapp/docs)などは、http://<IPアドレス>:8080/docs/のパスになる
ROOTにdocsがある場合もwebapp/docsが優先される

work

一時ファイル、プリコンパイルされたJSPページ、その他の中間ファイルが入る

設定ファイル

server.xml

Tomcatのメインの設定ファイル。Tomcatの使用ポートやWebアプリケーションのための宣言などもここに記述

server-minimal.xml

独自のserver.xmlを作成するためのテンプレート
コメントなどが削除されており、必要最小限の情報しか記載されない
サーバの設定をカスタマイズする場合は、このファイルを編集してserver.xmlという名前に変更するのがもっとも簡単

tomcat-users.xml

ユーザとパスワード、およびその権限情報を記述

web.xml

デフォルトの配備記述子(deployment descriptor)ファイル
Tomcatで実行されているすべてのアプリケーションから参照される
すべてのアプリケーションに適用できるサーブレットの基本定義とMIMEマッピングを記述
独自のweb.xmlを持っていないWebアプリケーションのための配備記述子としても使われる

Webアプリケーションの標準構成

Webアプリケーションのルートディレクトリ($CATALINA_HOME/webapps/ROOT/)
ルート以下の階層は $CATALINA_HOME/webapps/ で定義する(webapps/docs なら http://〜/docs/ になる)
ROOT/docs/ もある場合は、webapps/docs が優先される

/WEB-INF

パブリックにアクセスできないファイルが置かれる(web.xmlなど)
各ディレクトリ毎に作成可能

/WEB-INF/classes

Webアプリケーションのクラスファイルがすべて個々に置かれる

WEB-INF/lib

クラスファイルをJAR形式でアーカイブしたファイルを置くことが可能

Webアプリケーション(サーブレット)の作成

HelloWorld.java

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet{

    public void service(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World</h1>");
        out.println("</body>");
        out.println("</html>");

        out.close();
    }
}

Classファイルの配置

$ javac HelloWorld.java
$ mkdir -p $CATALINA_HOME/webapps/helloworld/WEB-INF/lib $CATALINA_HOME/webapps/helloworld/WEB-INF/classes
$ mv -i HelloWorld.class $CATALINA_HOME/webapps/helloworld/WEB-INF/classes

Hello Worldアプリケーションのweb.xml

WEB-INFディレクトリにweb.xmlファイルを作成し、サーブレットマッピングを記述する
サーブレットマッピングにより、特定のURLとサーブレットクラスが結び付けられる
サーブレットマッピングはweb.xmlの<web-apps></web-apps>要素の間に記述する

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

  <servlet>
    <servlet-name>
      hello
    </servlet-name>
    <servlet-class>
      HelloWorld
    </servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>
      hello
    </servlet-name>
    <url-pattern>
      /hello
    </url-pattern>
  </servlet-mapping>
</web-app>
要素説明
servlet-name任意の名称、 <servlet>と<servlet-mapping>で同じ名前を使うことでマッピングさせる
servlet-class実行したいJavaのClassファイル名
url-patternここに記述した文字列に一致した場合、<servlet-name>で指定されたClassファイルが実行される


url-pattern説明
/ から始まる/login の場合、/login/ や、/login などにマッチ
/ から始まり、* で終わる/login/* の場合、/login/abc や、/login/abc/test/ にマッチ。拡張子の指定は不可
*.拡張子*.do の場合、URLの末尾が.doの場合にマッチ

ブラウザからアクセス

http://localhost:8080/helloworld/hello

$CATALINA_HOME/webapps/helloworld/ が http://localhost:8080/helloworld/ に紐付き
/hello が サーブレット名 helloHelloWorldクラスに紐付いている

 

管理画面へのアクセス

tomcatのトップページから、管理画面(http://<IPアドレス>:8080/)へアクセスしサーバーのステータスや、アプリケーション配置などが可能

管理ユーザーの作成

$CATALINA_HOME/conf/tomcat-users.xml に 以下の2行を追加する

<role rolename="manager"/>
<user username="admin" password="admin" roles="manager"/>

tomcatのVersionが7以上の場合はロール名が変更されているので以下のようにする

<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>

アクセスした際のUIDとPASSに、adminを入力すればログインできる

Apacheと連携させる

Apache 2.2系にはAJPプロトコル通信を可能にするmod_proxy_ajpモジュールがあり、
これにより相互通信が可能になります(Apache2.0以前はmod_jkモジュールを利用)
rpmなどでインストールするとデフォルトで使用可能

ソースからビルドする場合は、
./configure --enable-proxy --enable-proxy-ajp のようにオプションをつけてコンパイルすることでmod_proxy_ajpモジュールが利用可能

AJP用の設定ファイル作成

/etc/httpd/conf/extra ディレクトリ以下に httpd-helloworld.conf を作成する

<Location /helloworld/>
    ProxyPass ajp://localhost:8009/helloworld/
</Location>

8009は、Tomcat側の連携コネクタのポート番号
http://ドメイン/helloworld/ 以下にアクセス(Locationで指定したパス)したら、
Tomcatのhelloworld(ProxyPassで指定した)ディレクトリへ転送されることを意味する

httpd.conf修正

以下の3行を追加する(記述されている可能性あり)

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
Include conf/extra/*.conf

server.xml修正

以下の行が記述されていること(デフォルトで記述されている)

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Tomcatの直接アクセス(8080ポート)を禁止する

$CATALINA_HOME/conf/server.xml 以下の行をコメントアウトする

<!--
<Connector
    port="8080"
    redirectPort="8443"
    minSpareThreads="25"
    connectionTimeout="20000"
    maxThreads="150"
    maxSpareThreads="75">
</Connector>
-->

連携確認

tomcat 及び apacheを再起動
http://localhost/helloworld/hello/
でサーブレットが表示されること

アクセスログ

コンテキストに設置されたJSP、サーブレット、HTML、GIFファイルなどのアクセス状況を表すログ(Tomcat動作ログではない)
server.xml の <Valve>タグ にて指定する。Tomcat動作ログは <Logger>タグ
Valveタグは以下の子要素として指定可能

  • <Engine> すべてのアクセスログ
  • <Host>  仮想ホスト単位でのアクセスログ
  • <Context> コンテキスト内でのアクセスログ
Value属性内容
classNameログを生成するJavaクラスを指定。値はorg.apache.catalina.valves. AccessLogValve固定
directoryログ出力先のディレクトリ指定。$CATALINA_HOMEからの相対パスか絶対パスで指定
patternログフォーマット指定。%a、%qなど。標準で用意された common / combined の指定も可能
prefixログ名の前に付与する文字列を指定。0指定でprefixなし
resolveHostsIPアドレスをDNSによりホスト名変換を行うか
suffixログ名の後に付与する文字列を指定
rotatableログファイルのローテートを行うかどうか
conditionServletRequest.getAttribute("指定した値") == nullの場合のみログ出力を行う
fileDateFormatログローテートの際、ファイル名に付与される日付フォーマット(Java標準ClassのSimpleDateFormatに準拠)
ローテートのタイミングを指定すること可能。yyyy-MM-dd.HHと設定することにより毎時ローテート


JSP(JavaServer Pages)

HTMLの中にタグを埋め込みJavaを実行することで動的なページをクライアントに渡すことが出来る

<%@ %> ディレクティブ

ページを処理する方法についてさまざまな指定を行うために使用

<%@ page import="java.util.*" %>           ←import "java.util.*"; と同じ
<%@ page contentType="text/html; charset=euc-jp" %> ←文字コードを変更(デフォルトは)

<% %> スクリプトレット

実際の処理の内容を指定のスクリプト言語(デフォルトでJava言語)で記述する

テストを10回出力する
<% for(int i = 0; i < 10; i++) { %>
    テスト<br>
<% } %>

<%= %> 式

出力文を生成するのに使用

<%= テスト %> は <% out.println(テスト); %> と同じ

<%! %> 宣言

JSPページに固有の変数とメソッドを定義するのに使用

<% String blueText = getColoredHTML("青いテキスト", "blue"); %>
<%!
/**
 * フォントカラーの指定を行ったHTML文を作成する
 * @param str 色を付けて表示する文字列
 * @param color 色を指定する文字列
 * @return フォントカラーの指定を行ったHTML文
*/
public String getColoredHTML(String str, String color) {
    return "<font color=\"" + color + "\">" + str + "</font>";
}
%>
<html><body>
    <%= redText %><br>
</body></html>


サーバー変数

変数名変数の値を取得するメソッド説明
REMOTE_HOSTgetRemoteHost()ページを要求してきたクライアントのホスト名
REMOTE_ADDRgetRemoteAddr()ページを要求してきたクライアントのIPアドレス
SERVER_NAMEgetServerName()サーバ側のホスト名
PATH_INFOgetPathInfo()要求されたURLのパス部分
PATH_TRANSLATEDgetPathTranslated()要求されたパスをサーバ側のパスに変換したもの


JSPサンプル

名前と、誕生日をフォームから入力し、action.jspで、入力された値を表示する

index.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%
    // 現在の時刻を取得
    java.util.Date nowTime = new java.util.Date();
%>
<html>
<head><title>入力ページ</title></head>
<body>
    <p>-- 入力ページ --</p>
    <p><form action="action.jsp" method="POST">
    お名前: <input type="text" name="name" size=32><br>
    生年月日: <input type="text" name="birthday" size=20><br><br>
    <input type="submit" value="OK">
    </form></p>
</body>
</html>

action.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%
    // パラメータを取得
    String name = request.getParameter("name");
    String birthday = request.getParameter("birthday");

    // 文字コードの変換を行う
    name = new String(name.getBytes("8859_1"), "EUC_JP");
    birthday = new String(birthday.getBytes("8859_1"), "EUC_JP");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>ユーザーからの入力を出力する</title></head>
<body>
    <p>-- ユーザーからの入力を出力する --</p>
    <p><ul>
    <li>お名前 : <%= name %>
    <li>生年月日: <%= birthday %>
    </ul></p>
</body>
</html>



トップ   編集 凍結解除 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-04-15 (水) 23:52:29 (805d)