在request、session、application对象创建、销毁或往其中添加修改删除属性时自动执行代码的组件。
reques监听:servletRequestListener(监听request对象创建销毁)、
servletRequestAttributeListener(监听对象的属性的增删改)。
session监听:HttpSessionListener((监听session对象创建销毁)、
HttpSessionAttributteListener(监听session对象的属性的增删改)、
HttpSessionBindingListener(监听对象和session的绑定和解除)、
HttpSessionActivationListener(对session数据的钝化和活化的监听)。
ServletContext监听:servletContextListener(监听器对象的创建和销毁)、
ServletContextAttributeListener(监听其对象属性的增删改)。
servletContext对象
context域对象:web容器(tomcat)启动时,会为每一个web应用创建一个ServletContext上下文对象,它代表当前web应用。可在servlet中通过ServletConfig.getServletContext方法获其web应用中共享的唯一上下文对象,并利用其进行通信。其随web应用销毁而销毁。
其方法有setAttribute、getAttribute、removeAttribute。
servlet初始化参数和servlertContext初始化参数:
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--servletContext上下文对象的初始化参数-->
<context-param>
<param-name>contextName</param-name>
<param-value>zhangsan</param-value>
</context-param>
<context-param>
<param-name>contextPassword</param-name>
<param-value>hello123</param-value>
</context-param>
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.kdy.web.servlet.UserServlet</servlet-class>
<!--该servlet的初始化参数-->
<init-param>
<param-name>userServletName</param-name>
<param-value>zhangsan666</param-value>
</init-param>
<init-param>
<param-name>userServletPassword</param-name>
<param-value>hello666666</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
</web-app>
userServlet
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String contextName = context.getInitParameter("contextName");
String contextPassword = context.getInitParameter("contextPassword");
System.out.println(contextName+":"+contextPassword);
context.setAttribute("contextName",contextName);
context.setAttribute("contextPassword",contextPassword);
//Enumeration<String> initParameterNames = context.getInitParameterNames();//一次性获取所有初始化参数
String userServletName = getInitParameter("userServletName");
String userServletPassword = getInitParameter("userServletPassword");
System.out.println(userServletName+":"+userServletPassword);
req.getRequestDispatcher("/jsp/hello.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
<h1L>hello jsp~</h1L><br/>
contextName:${contextName}<br/>
contextPassword:${contextPassword}<br/>
<%
System.out.println("到达jsp...");
%>
</body>
</html>
ServletContextListener
package com.kdy.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("web服务器启动时要处理的代码...");
/*
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute("app",app);
*/
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("web应用关闭时要处理的代码...");
}
}
如果上面的监听器类不使用@WebListener注解,需要在web.xml中加上声明监听器的以下代码
<listener>
<listener-class>com.kdy.listener.ContextLoaderListener</listener-class>
</listener>