S-JIS[2007-07-07/2010-01-13] 変更履歴

web.xmlファイル

web.xml(「サーブレットデプロイメントデスクリプター(Servlet deployment descriptor:配備記述子)」と呼ばれる)は、Javaのウェブアプリケーションの設定を書くファイル。
呼び出すサーブレットの制御等を記述する。

「ウェブアプリのコンテキストルート/WEB-INF/」の直下に置く。
(Tomcat5.5の場合は「webapps/ウェブアプリのコンテキストルート/WEB-INF/」の下となる)


最小構成

web.xml:

<?xml version="1.0"?>
<web-app>
</web-app>

これにDTD・xsd宣言要素を追加していく。


DTD・XMLスキーマ

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ファイルでは、JavaEEJSPのxsdファイルをincludeしている。(したがって、それらのバージョンも1つに定まる)


web-appの属性

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の要素

web.xmlの要素は、(当然の事ながら)バージョン毎に書ける内容が異なる。[2010-01-12]
バージョン2.3ではDTDに定義された順序通りに要素を書かないといけないが、2.4以降では(一部のグループを除いて)順番は定義されていない。(ただしTomcatでは互換性の為に順番通りでないといけないんだとか)

web-appの直下に書ける要素
要素 内容 備考 型定義
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」とマッチするのでそのサーブレットが使われる。

url-patternのパターン
パターン 概要
固定 /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);
	}
}

サーブレットへ戻る / warファイルへ戻る / Java目次へ戻る
メールの送信先:ひしだま