JavaWeb_通过Listener理解域对象生命周期
通过Listener理解域对象生命周期
- 1.利用 ServletRequestListener、HttpSessionListener 以及 ServletContextListener 可以把 request,session
及 application 的生命周期进一步的做一了解。
1)request:是一个请求,当一个响应返回时,即被销毁。当发送一个请求时被创建。注意,请求转发的过程是一个 request 对象,重定向是两个请求。
2)session:当第一次访问 WEB 应用的一个 JSP 或 Servlet 时,且该 JSP 或 Servlet 中还需要创建 session 对象。此时服务器会 创建一个 session 对象。
> session 销毁:session 过期,直接调用 session 的 invalidate 方法,当前 web 应用被卸载(session 可以被持久化)。
> 关闭浏览器,并不意味着 session 被销毁,还可以通过 sessionId 找到服务器中的 session 对象。
> JSESSIONID=1409ABDC12E71ACCA45F74D39B685664
http://localhost:8080/Listener/session.jsp;JSESSIONID=1409ABDC12E71ACCA45F74D39B685664
> application:贯穿于当前的 WEB 应用的生命周期。当前 WEB 应用被加载时创建 application 对象,当前 WEB 应用被卸载时销毁 application 对象。 - 2.实现代码
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Index Page</h4>
<a href="test.jsp">To Test Page</a>
<br>
<a href="testServlet">To TestServlet</a>
<%--
request.setAttribute("requestKey", "requestValue");
<jsp:forward page="/test.jsp"></jsp:forward>
--%>
</body>
</html>
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--
session.invalidate();
--%>
<h4>Test Page</h4>
<%= request.getAttribute("requestKey") %>
</body>
</html>
session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Session Page</h4>
<%
HttpSession session = request.getSession(true);
//session.setMaxInactiveInterval(10);
//session.invalidate();
%>
</body>
</html>
HelloServletContext.java
/**
* All rights Reserved,Designed By XS
* @Title: HelloServletContextListener.java
* @Package com.xs.javaweb.test
* @Description: TODO
* @author: XS
* @date: 2019年3月20日 上午9:58:42
* @version V1.0
*/
package com.xs.javaweb.test;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @ClassName: HelloServletContextListener
* @Description: TODO
* @author: XS
* @date: 2019年3月20日 上午9:58:42
* @version V1.0
*/
public class HelloServletContextListener implements ServletContextListener, ServletRequestListener, HttpSessionListener {
/**
* <p>Title: contextInitialized</p>
* <p>Description: </p>
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
* @param sce
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建。" + sce.getServletContext());
}
/**
* <p>Title: contextDestroyed</p>
* <p>Description: </p>
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
* @param sce
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象被销毁。" + sce.getServletContext());
}
/**
* <p>Title: requestInitialized</p>
* <p>Description: </p>
* @see javax.servlet.ServletRequestListener#requestInitialized(javax.servlet.ServletRequestEvent)
* @param sre
*/
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequest 对象被创建。" + sre.getServletRequest());
}
/**
* <p>Title: requestDestroyed</p>
* <p>Description: </p>
* @see javax.servlet.ServletRequestListener#requestDestroyed(javax.servlet.ServletRequestEvent)
* @param sre
*/
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequest 对象被销毁。" + sre.getServletRequest());
}
/**
* <p>Title: sessionCreated</p>
* <p>Description: </p>
* @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
* @param se
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSession 对象被创建。" + se.getSession());
}
/**
* <p>Title: sessionDestroyed</p>
* <p>Description: </p>
* @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
* @param se
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSession 对象被销毁。" + se.getSession());
}
}
TestServlet.java
package com.xs.javaweb.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("requestKey", "requestValue2");
// request.getRequestDispatcher("/test.jsp").forward(request, response);
response.sendRedirect("test.jsp");
}
}
web.xml
<?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_4_0.xsd"
id="WebApp_ID" version="4.0">
<listener>
<listener-class>com.xs.javaweb.test.HelloServletContextListener</listener-class>
</listener>
</web-app>