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就是过滤从客户端向服务器发送的请求。

目录

1、Servlet中的监听器

2、ServletContextListener监听器的使用

3、HttpSessionListener监听器的使用

4、ServletRequestListener监听器的使用

5、统计当前在线人数案例

6、监听三个域对象属性变更的监听器

 7、Filter入门

8、FilterConfig对象概述

9、过滤器案例分析


1、Servlet中的监听器

监听器中的常用术语如下:

  1. 事件源:指的是被监听对象(汽车)
  2. 监听器:指的是监听的对象(报警器)
  3. 事件源和监听器绑定:在汽车上安装报警器
  4. 事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。

在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和ServletRequest这三个域对象。

Servlet中监听器的分类主要如下:

  1. 一类:监听三个域对象的创建和销毁的监听器(三个)
  2. 二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
  3. 三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)

2、ServletContextListener监听器的使用

它是用来监听ServletContext域对象的创建和销毁的监听器。

  1. ServletContext
    1. 创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。
    2. 销毁:在服务器关闭的时候,或者项目从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对象的创建和销毁的。

  1. 创建:
    1. 服务器端第一次调用getSession()方法时候。
  2. 销毁:
    1. 非正常关闭服务器(正常关闭服务器session会被序列化)。
    2. Session过期(默认过期时间30分钟)。
    3. 手动调用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>

需要注意:

  1. 访问HTML是否创建Session          :不会
  2. 访问JSP是否创建Session               :会
  3. 访问Servlet是否创建Session        :不会(默认没有调用getSession方法)

4、ServletRequestListener监听器的使用

该监听器是用来监听ServletRequest对象的创建和销毁。

  1. 创建
    1. 从客户端向服务器发送一次请求,服务器就会创建request对象。
  2. 销毁
    1. 服务器对这次请求作出了响应之后,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>

注意:

  1. 访问HTML页面是否创建请求对象       :会
  2. 访问JSP页面是否创建请求对象            :会
  3. 访问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>配置:

  1. 完全路径匹配           :以/开始   比如/aaa  /aaa/bbb
  2. 目录匹配                    :以/开始 以*结束  比如/*  /aaa/*  /aaa/bbb/*
  3. 扩展名匹配               :不能以/开始 以*开始 比如*.jsp  *.do   *.action

<dispatcher>配置:

  1. 默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。
  2. dispatcher的取值
    1. REQUEST :默认值。默认过滤器拦截的就是请求。
    2. FORWARD:转发。
    3. INCLUDE  :页面包含的时候进行拦截
    4. 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之Filter&Listener

JavaWeb详解(第三篇)之Servlet基础简介-过滤器Filter&Listener监听器

JavaWeb之Filter和Listener技术

JavaWeb Listener之HttpSessionBindListener

JavaWeb Listener之HttpSessionActivationListener ,session钝化活化

Java实战之04JavaWeb-07Listener和Filter