web.xml(「サーブレットデプロイメントデスクリプター(Servlet deployment descriptor:配備記述子)」と呼ばれる)は、Javaのウェブアプリケーションの設定を書くファイル。
呼び出すサーブレットの制御等を記述する。
「ウェブアプリのコンテキストルート/WEB-INF/」の直下に置く。
(Tomcat5.5の場合は「webapps/ウェブアプリのコンテキストルート/WEB-INF/」の下となる)
|
|
|
web.xml:
<?xml version="1.0"?> <web-app> </web-app>
web.xmlのDTD・XMLスキーマ(xsd)の宣言方法。[2010-01-12]
バージョン | DTD・xsd |
---|---|
サーブレット2.3 J2EE1.3 JSP1.2 |
<?xml version="1.0" encoding="Shift_JIS" ?>
<!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>
〜
</web-app>
|
サーブレット2.4 J2EE1.4 JSP2.0 |
<?xml version="1.0" encoding="Shift_JIS"?> <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" id="WebApp_ID" version="2.4"> 〜 </web-app> |
サーブレット2.5 JavaEE5 JSP2.1 |
<?xml version="1.0" encoding="Shift_JIS"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 〜 </web-app> |
web.xmlのxsdファイルでは、JavaEEやJSPのxsdファイルをincludeしている。(したがって、それらのバージョンも1つに定まる)
web.xmlのルート要素であるweb-appに書ける属性。[2010-01-13]
属性 | 備考 | |
---|---|---|
id | ツール等が参照に使うことが出来るID。 | |
version | 2.4〜 | サーブレット仕様のバージョン。 |
metadata-complete | 2.5〜 | サーブレット2.5では、servletやfilter・listener・tagのフィールドやメソッドに特定のアノテーションを付けることが出来る。 このアノテーションの処理を行うかどうかをmetadata-completeで制御する。 trueの場合、アノテーションを無視する。 false(省略時のデフォルト)の場合はアノテーションを解釈する。 |
web.xmlの要素は、(当然の事ながら)バージョン毎に書ける内容が異なる。[2010-01-12]
バージョン2.3ではDTDに定義された順序通りに要素を書かないといけないが、2.4以降では(一部のグループを除いて)順番は定義されていない。(ただしTomcatでは互換性の為に順番通りでないといけないんだとか)
要素 | 内容 | 備考 | 型定義 | ||
---|---|---|---|---|---|
icon | ? | 〜2.3 | |||
display-name | ? | ||||
description | ? | ||||
description | * | 2.4〜 | descriptionGroup 順序性あり |
javaee | |
display-name | * | ||||
icon | * | ||||
distributable | ? | xsd定義上は複数記述可能だが、書いても1つしか無いように扱われる。 | javaee | ||
context-param | * | ウェブアプリの初期化パラメーター | javaee | ||
filter | * | フィルター定義 | web-app | ||
filter-mapping | * | ||||
listener | * | リスナー定義 | javaee | ||
servlet | * | サーブレット定義 | web-app | ||
servlet-mapping | * | ||||
session-config | ? | セッション定義 | xsd定義上は複数記述可能だが、1つしか書いてはいけない。 | web-app | |
mime-mapping | * | web-app | |||
welcome-file-list | ? | 〜2.3 | 複数記述すると、1つに結合されて扱われる。 | web-app | |
* | 2.4〜 | ||||
error-page | * | web-app | |||
taglib | * | 〜2.3 | アクションタグ(カスタムタグ)定義 | 2.4で、taglibはjsp-configの中に入るようになった。 jsp-configはxsd定義上は複数記述可能だが、1つしか書いてはいけない。 |
|
jsp-config | ? | 2.4〜 | jsp | ||
resource-env-ref | * | 〜2.3 | 2.4では後ろの方に移動した。 | ||
resource-ref | * | ||||
security-constraint | * | web-app | |||
login-config | ? | xsd定義上は複数記述可能だが、1つしか書いてはいけない。 | web-app | ||
security-role | * | javaee | |||
env-entry | * | jndiEnvironmentRefsGroup 順序性あり |
javaee | ||
ejb-ref | * | ||||
ejb-local-ref | * | ||||
service-ref | * | 2.4〜 | |||
resource-ref | * | 2.4〜 | |||
resource-env-ref | * | 2.4〜 | |||
message-destination-ref | * | 2.4〜 | |||
persistence-context-ref | * | 2.5〜 | |||
persistence-unit-ref | * | 2.5〜 | |||
post-construct | * | 2.5〜 | |||
pre-destroy | * | 2.5〜 | |||
message-destination | * | 2.4〜 | javaee | ||
locale-encoding-mapping-list | * | 2.4〜 | 複数記述すると、1つに結合されて扱われる。 | web-app |
ブラウザから指定されたURLに応じてどのサーブレットを呼び出すかをweb.xmlに記述する。
まず、web.xml内でのサーブレットクラスの名前を定義してやる。
web.xml:
<?xml version="1.0"?> <web-app> <servlet> <servlet-name>test</servlet-name> <servlet-class>jp.hishidama.sample.SampleServlet</servlet-class> </servlet> </web-app>
タグ | 概要 | 例 | 更新日 | |
---|---|---|---|---|
servlet | servlet-name | web.xml内で使用するサーブレット名 | test | |
servlet-class | 呼び出すサーブレットのクラス名 | jp.hishidama.sample.SampleServlet | ||
init-param | 初期化パラメーター | 2009-12-29 | ||
load-on-startup | 複数のサーブレット指定がある場合の、ウェブアプリ起動時の初期化順序(インスタンス化してinit()が呼ばれる順番)を示す。 1とか2とかの整数値を指定。若い方から実行される。 (0が一番早いと思われるが、APサーバーによって異なる?→Tomcatの場合) 同じ番号を指定すると、たぶんweb.xml内に書かれた順番で初期化される。 Servlet2.4では値は必須。 負数を指定するかload-on-startup自体を指定しないと、起動時には初期化されない(そのサーブレットが使われる時に初めて初期化される)。 |
2009-12-29 |
次に、ブラウザで指定されるURLに対し、どのパターンのときにどのサーブレットを呼び出すかを定義する。
web.xml:
<?xml version="1.0"?> <web-app> 〜 <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/sample.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/sub/zzz.do</url-pattern> </servlet-mapping> </web-app>
タグ | 概要 | 例 | |
---|---|---|---|
servlet-mapping | url-pattern | ブラウザから来たURLにマッチする条件(パターン) | /sample.do |
servlet-name | パターンにマッチしたときに使用するサーブレットの名前 | test |
servlet-mappingに、URLのコンテキストルートより後ろの部分に対するマッチ条件を書く。
servlet-mappingを複数書いて同じサーブレットを呼び出しても全然問題ない。というか、それが出来なきゃとっても面倒(爆)
Servlet2.5仕様では、一つのservlet-mappingの中に複数のurl-patternを書いても大丈夫になったんだそうだ。そっちの方が便利だわな。[2008-08-02]
<servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/sample.do</url-pattern> <url-pattern>/sub/zzz.do</url-pattern> </servlet-mapping>
コンテキストルートがabcのとき、URLは「http://サーバー/abc/sample.do」のようになる。
コンテキストルートより後ろが「/sample.do」であり、上記の例ではservlet-mappingの「sample.do」とマッチするのでそのサーブレットが使われる。
パターン | 例 | 概要 |
---|---|---|
固定 | /sample.do /sub/zzz.do |
完全に一致するときだけサーブレットが呼ばれる。 |
ワイルドカード | /* /foo/* |
前方一致したときにサーブレットが呼ばれる。 後ろは何でもよいので、「/*」であれば「/goo」でも「/sub/123」でもマッチする。 なお、「/*.do」や「/abc*」といった一部分の指定は出来ない。 |
拡張子 | *.do | (パスに関係なく、)拡張子が一致したときにサーブレットが呼ばれる。 |
URLに対して直接一致するファイル(jspファイルやhtmlファイル等)が存在していればそのファイルが返され、パターンマッチングは行われない(サーブレットは実行されない)。
web.xmlのservlet内にinit-paramを指定しておくと、そのサーブレット向けの初期情報を設定することが出来る。[2008-10-03]
web.xml:
<?xml version="1.0"?> <web-app> <servlet> <servlet-name>test</servlet-name> <servlet-class>jp.hishidama.sample.SampleServlet</servlet-class> <init-param> <param-name>property.name</param-name> <param-value>value1</param-value> </init-param> </servlet> 〜 </web-app>
SampleServlet.java:
public class SampleServlet extends HttpServlet { @Override public void init() throws ServletException { ServletConfig config = super.getServletConfig(); String paramValue = config.getInitParameter("property.name"); System.out.println(paramValue); } }