Java サーブレットのweb.xmlの確認

Java サーブレットのweb.xmlの確認のサンプルです。
(確認環境:JDK 8,Tomcat 9)

目次

サンプル 確認するプロジェクト
  Web.xmlの設定
メインの処理(MainController.java)
フィルター(FilterTest.java)
リスナー(ListenerTest.java)
実行結果
URLのプロジェクト部分を変更する(server.xml)

確認するプロジェクト

Web.xmlを設定し以下を確認します。

・Web.xmlの値をコードから参照して出力する
・リスナーとフィルターを設置し実行順序を確認
・サーブレットとURLの設定
・セッションタイムアウトの設定

WebContentのWEB-INF配下にweb.xml(デプロイ記述子)が配置されています。

環境の作成は以下を参照願います。
Java サーブレットを作成してHello Worldを表示

以下のURLでアクセスできます。
http://localhost:8881/servlet-webxml/testWeb

githubにコードがあります。
https://github.com/ut23405/Java/tree/main/servlet-webxml

Web.xmlの設定

5行目は、Servletのバージョンで3.1となっています。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">

	<context-param>
		<param-name>testParam</param-name>
		<param-value>"cat"</param-value>
	</context-param>

	<listener>
		<listener-class>com.example.test1.ListenerTest</listener-class>
	</listener>

	<filter>
		<filter-name>FiterTest</filter-name>
		<filter-class>com.example.test1.FilterTest</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>FiterTest</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>MainServlet</servlet-name>
		<servlet-class>com.example.test1.MainController</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>MainServlet</servlet-name>
		<url-pattern>/testWeb</url-pattern>
	</servlet-mapping>

	<session-config>
		<session-timeout>1</session-timeout>
		<cookie-config>
			<http-only>true</http-only>
		</cookie-config>
		<tracking-mode>COOKIE</tracking-mode>
	</session-config>
</web-app>
<context-param>

7行目のcontext-paramは、パラメータです。nameとvalueがあります。コードから参照できます。

<listener>

12行目は、リスナーです。セッション生成時などのイベントでキャッチできます。

<filter>

16行目は、フィルターです。18行目のクラスが実行されます。フィルターでは文字コードの変換等で使われます。
22行目の/*はすべてのURLが対象になります。

servlet-name

26行目のservlet-nameは、サーブレット名です。31行目とひも付きます。
27行目は、パッケージ(com.example.test1)とクラス(MainController)を指定します。
28行目のload-on-startupは、サーブレットを初期化する順序です。
ここではservletは1のみですがservletが2つある場合は、1,2とふっていきます。
32行目は、URLの一部になります。

<session-config>

35行目は、セッションの設定です。
36行目は、1分でタイムアウトになる設定です。
38行目は、cookieがHttpOnly属性になりJavaScriptからcookieにアクセス不可になります。
40行目は、URL Rewriting機能(Cookieが使用不可のときGETで渡す機能)が無効化されます。

 

メインの処理(MainController.java)

package com.example.test1;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/MainController")
public class MainController extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public MainController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");

		System.out.println("main");
		HttpSession session = request.getSession();
		session.setAttribute("s1", "testSession");

        ServletContext sc = getServletConfig().getServletContext();
        String param = sc.getInitParameter("testParam");
		System.out.println(param);
		response.getWriter().append("Hello Worldあいうえお");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

25,26行目は、セッションを生成しています。リスナーで確認します。
28,29行目は、web.xmlのパラメータを取得しています。

 

フィルター(FilterTest.java)

package com.example.test1;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class FilterTest
 */
@WebFilter("/FilterTest")
public class FilterTest implements Filter {

    public FilterTest() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("filterTest");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}
}

26行目は、フィルターが実行された時文字列が出力されます。

 

リスナー(ListenerTest.java)

package com.example.test1;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Application Lifecycle Listener implementation class ListenerTest
 */
@WebListener
public class ListenerTest implements ServletContextListener, HttpSessionListener, ServletRequestListener {

    public ListenerTest() {
    }

    public void sessionCreated(HttpSessionEvent arg0)  {
    	System.out.println("sessionCreated");
    }

    public void requestDestroyed(ServletRequestEvent arg0)  {
    }

    public void requestInitialized(ServletRequestEvent arg0)  {
    	System.out.println("requestInitialized");
    }

    public void sessionDestroyed(HttpSessionEvent arg0)  {
    }

    public void contextDestroyed(ServletContextEvent arg0)  {
    }

    public void contextInitialized(ServletContextEvent arg0)  {
    }
}

21行目は、リスナーのセッションが生成されたときに文字列が出力されます。
28行目は、リクエストが来たときに文字列が出力されます。

 

実行結果

画面に最初にアクセスしたとき

以下の順番で実行されます。

1.リスナーのrequestInitialized
2.フィルターのfilterTest
3.メイン処理
4.リスナーのsessionCreated
5.パラメータを取得

 

画面に2回目にアクセスしたとき

リスナーのsessionCreatedは行っていません。

1.リスナーのrequestInitialized
2.フィルターのfilterTest
3.メイン処理
4.パラメータを取得

URLのプロジェクト部分を変更する(server.xml)

URLのプロジェクト部分を変更する場合server.xmlのpathの部分を修正します。

<!--   <Context docBase="servlet-webxml" path="/servlet-webxml" reloadable="false" source="org.eclipse.jst.jee.server:servlet-webxml"/></Host>-->
      <Context docBase="servlet-webxml" path="/" reloadable="false" source="org.eclipse.jst.jee.server:servlet-webxml"/></Host>
    </Engine>
  </Service>
</Server>

1行目をコメントにし、2行目のpathを/にしています。

before

http://localhost:8881/servlet-webxml/testWeb

after

http://localhost:8881/testWeb

関連の記事

EclipseにTomcatを登録する手順

△上に戻る