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>
<param-name>testParam</param-name>
<param-value>"cat"</param-value>
</context-param>
7行目のcontext-paramは、パラメータです。nameとvalueがあります。コードから参照できます。
<listener>
<listener-class>com.example.test1.ListenerTest</listener-class>
</listener>
12行目は、リスナーです。セッション生成時などのイベントでキャッチできます。
<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>
16行目は、フィルターです。18行目のクラスが実行されます。フィルターでは文字コードの変換等で使われます。
22行目の/*はすべてのURLが対象になります。
<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>
26行目のservlet-nameは、サーブレット名です。31行目とひも付きます。
27行目は、パッケージ(com.example.test1)とクラス(MainController)を指定します。
28行目のload-on-startupは、サーブレットを初期化する順序です。
ここではservletは1のみですがservletが2つある場合は、1,2とふっていきます。
32行目は、URLの一部になります。
<session-config>
<session-timeout>1</session-timeout>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</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
関連の記事