JavaWeb开发之Listener&Filter
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb开发之Listener&Filter相关的知识,希望对你有一定的参考价值。
监听器(Listener)就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用或者属性的改变。当被监听对象发生上述事件后,监听器某个方法将会立即被执行。Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截,从而实现一些特殊的功能。Filter就是过滤从客户端向服务器发送的请求。
目录
2、ServletContextListener监听器的使用
4、ServletRequestListener监听器的使用
1、Servlet中的监听器
监听器中的常用术语如下:
- 事件源:指的是被监听对象(汽车)
- 监听器:指的是监听的对象(报警器)
- 事件源和监听器绑定:在汽车上安装报警器
- 事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。
在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和ServletRequest这三个域对象。
Servlet中监听器的分类主要如下:
- 一类:监听三个域对象的创建和销毁的监听器(三个)
- 二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
- 三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)
2、ServletContextListener监听器的使用
它是用来监听ServletContext域对象的创建和销毁的监听器。
- ServletContext
- 创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。
- 销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。
监听ServletContext对象的创建和销毁方法:
下面编写一个类实现ServletContextListener接口并重写监听方法,如下:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener
@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
System.out.println("ServletContext对象被创建了");
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent)
System.out.println("ServletContext对象被销毁了");
需要在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">
<listener>
<listener-class>listener.MyServletContextListener</listener-class>
</listener>
</web-app>
3、HttpSessionListener监听器的使用
该监听器是用来监听HttpSession对象的创建和销毁的。
- 创建:
- 服务器端第一次调用getSession()方法时候。
- 销毁:
- 非正常关闭服务器(正常关闭服务器session会被序列化)。
- Session过期(默认过期时间30分钟)。
- 手动调用session.invalidate()方法。
用于监听HttpSession对象的创建和销毁的方法:
下面编写代码实现监听HttpSession对象的创建和销毁:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent)
System.out.println("HttpSession对象被创建了");
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
System.out.println("HttpSession对象被销毁了");
需要在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">
<listener>
<listener-class>listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>listener.MyHttpSessionListener</listener-class>
</listener>
</web-app>
需要注意:
- 访问HTML是否创建Session :不会
- 访问JSP是否创建Session :会
- 访问Servlet是否创建Session :不会(默认没有调用getSession方法)
4、ServletRequestListener监听器的使用
该监听器是用来监听ServletRequest对象的创建和销毁。
- 创建
- 从客户端向服务器发送一次请求,服务器就会创建request对象。
- 销毁
- 服务器对这次请求作出了响应之后,request对象就销毁了。
监听ServletRequest对象的创建和销毁的方法如下:
编写该监听器代码如下:
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent)
System.out.println("servletRequest对象被创建了");
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent)
System.out.println("servletRequest对象被销毁了");
在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">
<listener>
<listener-class>listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>listener.MyHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>listener.MyServletRequestListener</listener-class>
</listener>
</web-app>
注意:
- 访问HTML页面是否创建请求对象 :会
- 访问JSP页面是否创建请求对象 :会
- 访问Servlet是否创建请求对象 :会
5、统计当前在线人数案例
对上述案例的实现,编写一个显示在线人数的JSP页面,如下:
<%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2022-08-19
Time: 20:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>显示当前在线人数</title>
</head>
<body>
<h1>在线人数:$count</h1>
</body>
</html>
编写监听器类,如下:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent)
HttpSession httpSession = httpSessionEvent.getSession() ;
System.out.println(httpSession.getId()+"上线了");
Integer count = (Integer) httpSession.getServletContext().getAttribute("count");
count ++ ;
httpSession.getServletContext().setAttribute("count",count);
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
HttpSession httpSession = httpSessionEvent.getSession() ;
System.out.println(httpSession.getId()+"离线了");
Integer count = (Integer) httpSession.getServletContext().getAttribute("count");
count -- ;
httpSession.getServletContext().setAttribute("count",count);
需要在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">
<listener>
<listener-class>listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>listener.MyHttpSessionListener</listener-class>
</listener>
</web-app>
6、监听三个域对象属性变更的监听器
通过实现响应的接口就可以对属性的变更进行监听,和上面的监听类似,这里不再演示。
7、Filter入门
Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截,从而实现一些特殊的功能。Filter就是过滤从客户端向服务器发送的请求。
Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。每次filter进行拦截的时候,都会执行doFilter的方法。当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象。
首先编写一个类实现Filter接口,进行过滤操作,并在web.xml文件中配置Filter.
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
System.out.println("MyFilter被执行了...");
//放行
filterChain.doFilter(servletRequest,servletResponse);
@Override
public void destroy()
<?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">
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8、FilterConfig对象概述
它是用来获得Filter的相关的配置的对象。该对象的常用API如下:
演示代码如下:
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class MyFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
//获得过滤器的名称
String name = filterConfig.getFilterName() ;
System.out.println(name);
//获得初始化参数
String username = filterConfig.getInitParameter("username") ;
String password = filterConfig.getInitParameter("password") ;
System.out.println(username + " " + password);
//获得所有的初始化参数
Enumeration<String> names = filterConfig.getInitParameterNames();
while (names.hasMoreElements())
String name1 = names.nextElement() ;
String value = filterConfig.getInitParameter(name1) ;
System.out.println(name1 + " " + value);
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
System.out.println("MyFilter被执行了...");
//放行
filterChain.doFilter(servletRequest,servletResponse);
@Override
public void destroy()
在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">
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>filter.MyFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<url-pattern>配置:
- 完全路径匹配 :以/开始 比如/aaa /aaa/bbb
- 目录匹配 :以/开始 以*结束 比如/* /aaa/* /aaa/bbb/*
- 扩展名匹配 :不能以/开始 以*开始 比如*.jsp *.do *.action
<dispatcher>配置:
- 默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。
- dispatcher的取值
- REQUEST :默认值。默认过滤器拦截的就是请求。
- FORWARD:转发。
- INCLUDE :页面包含的时候进行拦截
- ERROR :页面出现全局错误页面跳转的时候进行拦截
9、过滤器案例分析
案例需求:
现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录直接在地址栏上输入后台页面地址。
编写一个过滤器:可以对没有登录的用户进行拦截。(没有登录,回到登录页面。如果已经登录,放行。)
过滤器的拦截代码如下:如果得到的用户为null,说明未登录,则提示msg信息回写到浏览器,否则过滤器放行。
import com.domain.User;
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.http.HttpServletRequest;
/**
*
*/
public class PrivilegeFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
// 判断:判断用户是否已经登录了。如果已经登录,放行。如果没有登录,回到登录页面!
HttpServletRequest req = (HttpServletRequest) request;
User existUser = (User) req.getSession().getAttribute("existUser");
// 判断:
if(existUser == null)
// 没有登录:
req.setAttribute("msg", "您还没有登录!没有权限访问!");
req.getRequestDispatcher("/login.jsp").forward(req, response);
else
// 已经登录:
chain.doFilter(req, response);
@Override
public void destroy()
首先需要做数据准备,创建数据库和表,并写入一些数据,如下:
create database if not exists web05;
use web05;
create table if not exists user(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
);
insert into user values (null,'aaa','123');
视图层的登录页面login.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录页面</h1>
<h3><font color="red">$ msg </font></h3>
<form action="$ pageContext.request.contextPath /UserServlet" method="post">
<table border="1" width="400">
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>
视图层登录成功的success.jsp代码入下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>您已经登录成功!欢迎:$ existUser.username </h1>
<a href="$ pageContext.request.contextPath /jsp/sub.jsp">提交数据</a>
</body>
</html>
控制层的servlet代码如下:
import com.domain.User;
import com.model.UserModel;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用户登录的Servlet
*/
public class UserServlet extends HttpServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
try
// 接收数据:
String username = request.getParameter("username");
String password = request.getParameter("password");
// 封装数据:
User user = new User();
user.setUsername(username);
user.setPassword(password);
// 处理数据:
UserModel userModel = new UserModel();
User existUser = userModel.login(user);
// 根据处理结果页面跳转:
if(existUser == null)
// 登录失败
request.setAttribute("msg", "用户名或密码错误!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
else
// 登录成功
request.getSession().setAttribute("existUser", existUser);
response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");
catch(Exception e)
e.printStackTrace();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
doGet(request, response);
封装用户信息的JavaBean代码如下:
public class User
private Integer id;
private String username;
private String password;
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public String getUsername()
return username;
public void setUsername(String username)
this.username = username;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
处理查询任务的Model层代码如下:
import java.sql.SQLException;
import com.domain.User;
import com.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
public class UserModel
public User login(User user) throws SQLException
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from user where username = ? and password = ?";
User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
return existUser;
使用的获得连接池的工具类如下:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils
// 创建一个连接池:但是这个连接池只需要创建一次即可。
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 获得连接的方法
* @throws SQLException
*/
public static Connection getConnection() throws SQLException
return dataSource.getConnection();
/**
* 获得连接池:
*/
public static DataSource getDataSource()
return dataSource;
数据库的参数配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web05</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
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">
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.controller.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>PrivilegeFilter</filter-name>
<filter-class>com.filter.PrivilegeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrivilegeFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
</web-app>
网站,需要向后台提交中文的数据(有可能是GET也有可能是POST)。中文处理根据不同的请求方式,处理的方式也是不一样的。
需要调用request.getParameter();方法接收数据,但是这个时候无论是get还是post接收的数据都是存在乱码。现在调用request.getParameter()方法无论是get还是post请求提交的中文,都没有乱码。
此处使用增强的类对字符串乱码进行处理,使用过滤器直接调用即可。
提交数据的jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>get提交方式</h1>
<form action="$ pageContext.request.contextPath /ServletDemo1" method="get">
姓名:<input type="text" name="name"/><br>
<input type="submit" value="提交">
</form>
<h1>post提交方式</h1>
<form action="$ pageContext.request.contextPath /ServletDemo1" method="post">
姓名:<input type="text" name="name"/><br>
<input type="submit" value="提交">
</form>
</body>
</html>
接收数据的servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 接收数据的Servlet
*/
public class ServletDemo1 extends HttpServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
String name = request.getParameter("name");
System.out.println("GET方式接收的名称:"+name);
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
String name = request.getParameter("name");
System.out.println("POST方式接收的名称:"+name);
增强的类,处理乱码问题:
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class MyHttpServletRequest extends HttpServletRequestWrapper
private HttpServletRequest request;
public MyHttpServletRequest(HttpServletRequest request)
super(request);
this.request = request;
@Override
// 增强request.getParameter()方法:
public String getParameter(String name)
// 获得请求方式:
String method = request.getMethod();
// 根据get还是post请求进行不同方式的乱码的处理:
if("GET".equalsIgnoreCase(method))
// get方式的请求
String value = super.getParameter(name);
try
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
catch (UnsupportedEncodingException e)
e.printStackTrace();
return value;
else if("POST".equalsIgnoreCase(method))
// post方式的请求
try
request.setCharacterEncoding("UTF-8");
catch (UnsupportedEncodingException e)
e.printStackTrace();
return super.getParameter(name);
通用字符编码过滤器:
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.http.HttpServletRequest;
public class GenericEncodingFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
// 在过滤器中增强request对象,并将增强后的request对象传递给Servlet:
HttpServletRequest req = (HttpServletRequest) request;
// 增强req:
MyHttpServletRequest myReq = new MyHttpServletRequest(req);
chain.doFilter(myReq, response);
@Override
public void destroy()
在web.xml配置servlet和filter:
<?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">
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.controller.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.controller.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
<filter>
<filter-name>PrivilegeFilter</filter-name>
<filter-class>com.filter.PrivilegeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrivilegeFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>GenericEncodingFilter</filter-name>
<filter-class>com.filter.GenericEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GenericEncodingFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
</web-app>
以上是关于JavaWeb开发之Listener&Filter的主要内容,如果未能解决你的问题,请参考以下文章
JavaWeb详解(第三篇)之Servlet基础简介-过滤器Filter&Listener监听器
JavaWeb Listener之HttpSessionBindListener