• 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接口并重写监听方法,如下:

    1. import javax.servlet.ServletContextEvent;
    2. import javax.servlet.ServletContextListener;
    3. public class MyServletContextListener implements ServletContextListener {
    4. @Override
    5. public void contextInitialized(ServletContextEvent servletContextEvent) {
    6. System.out.println("ServletContext对象被创建了");
    7. }
    8. @Override
    9. public void contextDestroyed(ServletContextEvent servletContextEvent) {
    10. System.out.println("ServletContext对象被销毁了");
    11. }
    12. }

    需要在web.xml中配置监听器,如下:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <listener>
    7. <listener-class>listener.MyServletContextListenerlistener-class>
    8. listener>
    9. web-app>

    3、HttpSessionListener监听器的使用

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

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

    用于监听HttpSession对象的创建和销毁的方法:

     下面编写代码实现监听HttpSession对象的创建和销毁:

    1. import javax.servlet.ServletContextEvent;
    2. import javax.servlet.ServletContextListener;
    3. import javax.servlet.http.HttpSessionEvent;
    4. import javax.servlet.http.HttpSessionListener;
    5. public class MyHttpSessionListener implements HttpSessionListener {
    6. @Override
    7. public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    8. System.out.println("HttpSession对象被创建了");
    9. }
    10. @Override
    11. public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    12. System.out.println("HttpSession对象被销毁了");
    13. }
    14. }

    需要在web.xml文件中配置监听器,具体如下:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <listener>
    7. <listener-class>listener.MyServletContextListenerlistener-class>
    8. listener>
    9. <listener>
    10. <listener-class>listener.MyHttpSessionListenerlistener-class>
    11. listener>
    12. web-app>

    需要注意:

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

    4、ServletRequestListener监听器的使用

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

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

    监听ServletRequest对象的创建和销毁的方法如下:

     编写该监听器代码如下:

    1. import javax.servlet.ServletRequestEvent;
    2. import javax.servlet.ServletRequestListener;
    3. public class MyServletRequestListener implements ServletRequestListener {
    4. @Override
    5. public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
    6. System.out.println("servletRequest对象被创建了");
    7. }
    8. @Override
    9. public void requestInitialized(ServletRequestEvent servletRequestEvent) {
    10. System.out.println("servletRequest对象被销毁了");
    11. }
    12. }

    在web.xml中配置监听器如下:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <listener>
    7. <listener-class>listener.MyServletContextListenerlistener-class>
    8. listener>
    9. <listener>
    10. <listener-class>listener.MyHttpSessionListenerlistener-class>
    11. listener>
    12. <listener>
    13. <listener-class>listener.MyServletRequestListenerlistener-class>
    14. listener>
    15. web-app>

    注意:

    1. 访问HTML页面是否创建请求对象       :会
    2. 访问JSP页面是否创建请求对象            :会
    3. 访问Servlet是否创建请求对象              :会

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

     对上述案例的实现,编写一个显示在线人数的JSP页面,如下:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: nuist__NJUPT
    4. Date: 2022-08-19
    5. Time: 20:06
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>显示当前在线人数title>
    12. head>
    13. <body>
    14. <h1>在线人数:${count}h1>
    15. body>
    16. html>

    编写监听器类,如下:

    1. import javax.servlet.ServletContextEvent;
    2. import javax.servlet.ServletContextListener;
    3. import javax.servlet.http.HttpSession;
    4. import javax.servlet.http.HttpSessionEvent;
    5. import javax.servlet.http.HttpSessionListener;
    6. public class MyHttpSessionListener implements HttpSessionListener {
    7. @Override
    8. public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    9. HttpSession httpSession = httpSessionEvent.getSession() ;
    10. System.out.println(httpSession.getId()+"上线了");
    11. Integer count = (Integer) httpSession.getServletContext().getAttribute("count");
    12. count ++ ;
    13. httpSession.getServletContext().setAttribute("count",count);
    14. }
    15. @Override
    16. public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    17. HttpSession httpSession = httpSessionEvent.getSession() ;
    18. System.out.println(httpSession.getId()+"离线了");
    19. Integer count = (Integer) httpSession.getServletContext().getAttribute("count");
    20. count -- ;
    21. httpSession.getServletContext().setAttribute("count",count);
    22. }
    23. }

    需要在web.xml中配置监听器:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <listener>
    7. <listener-class>listener.MyServletContextListenerlistener-class>
    8. listener>
    9. <listener>
    10. <listener-class>listener.MyHttpSessionListenerlistener-class>
    11. listener>
    12. 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.

    1. import javax.servlet.*;
    2. import java.io.IOException;
    3. public class MyFilter implements Filter {
    4. @Override
    5. public void init(FilterConfig filterConfig) throws ServletException {
    6. }
    7. @Override
    8. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    9. System.out.println("MyFilter被执行了...");
    10. //放行
    11. filterChain.doFilter(servletRequest,servletResponse);
    12. }
    13. @Override
    14. public void destroy() {
    15. }
    16. }
    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <filter>
    7. <filter-name>MyFilterfilter-name>
    8. <filter-class>filter.MyFilterfilter-class>
    9. filter>
    10. <filter-mapping>
    11. <filter-name>MyFilterfilter-name>
    12. <url-pattern>/*url-pattern>
    13. filter-mapping>
    14. web-app>

    8、FilterConfig对象概述

    它是用来获得Filter的相关的配置的对象。该对象的常用API如下:

     演示代码如下:

    1. import javax.servlet.*;
    2. import java.io.IOException;
    3. import java.util.Enumeration;
    4. public class MyFilter implements Filter {
    5. @Override
    6. public void init(FilterConfig filterConfig) throws ServletException {
    7. //获得过滤器的名称
    8. String name = filterConfig.getFilterName() ;
    9. System.out.println(name);
    10. //获得初始化参数
    11. String username = filterConfig.getInitParameter("username") ;
    12. String password = filterConfig.getInitParameter("password") ;
    13. System.out.println(username + " " + password);
    14. //获得所有的初始化参数
    15. Enumeration names = filterConfig.getInitParameterNames();
    16. while (names.hasMoreElements()){
    17. String name1 = names.nextElement() ;
    18. String value = filterConfig.getInitParameter(name1) ;
    19. System.out.println(name1 + " " + value);
    20. }
    21. }
    22. @Override
    23. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    24. System.out.println("MyFilter被执行了...");
    25. //放行
    26. filterChain.doFilter(servletRequest,servletResponse);
    27. }
    28. @Override
    29. public void destroy() {
    30. }
    31. }

    在web.xml中配置过滤器如下:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <filter>
    7. <filter-name>MyFilterfilter-name>
    8. <filter-class>filter.MyFilterfilter-class>
    9. <init-param>
    10. <param-name>usernameparam-name>
    11. <param-value>rootparam-value>
    12. init-param>
    13. <init-param>
    14. <param-name>passwordparam-name>
    15. <param-value>123param-value>
    16. init-param>
    17. filter>
    18. <filter-mapping>
    19. <filter-name>MyFilterfilter-name>
    20. <url-pattern>/*url-pattern>
    21. filter-mapping>
    22. web-app>

    配置:

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

    配置:

    1. 默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。
    2. dispatcher的取值
      1. REQUEST :默认值。默认过滤器拦截的就是请求。
      2. FORWARD:转发。
      3. INCLUDE  :页面包含的时候进行拦截
      4. ERROR      :页面出现全局错误页面跳转的时候进行拦截

    9、过滤器案例分析

    案例需求:

    现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录直接在地址栏上输入后台页面地址。

    编写一个过滤器:可以对没有登录的用户进行拦截。(没有登录,回到登录页面。如果已经登录,放行。)

    过滤器的拦截代码如下:如果得到的用户为null,说明未登录,则提示msg信息回写到浏览器,否则过滤器放行。

    1. import com.domain.User;
    2. import java.io.IOException;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. import javax.servlet.http.HttpServletRequest;
    10. /**
    11. *
    12. */
    13. public class PrivilegeFilter implements Filter{
    14. @Override
    15. public void init(FilterConfig filterConfig) throws ServletException {
    16. }
    17. @Override
    18. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    19. throws IOException, ServletException {
    20. // 判断:判断用户是否已经登录了。如果已经登录,放行。如果没有登录,回到登录页面!
    21. HttpServletRequest req = (HttpServletRequest) request;
    22. User existUser = (User) req.getSession().getAttribute("existUser");
    23. // 判断:
    24. if(existUser == null){
    25. // 没有登录:
    26. req.setAttribute("msg", "您还没有登录!没有权限访问!");
    27. req.getRequestDispatcher("/login.jsp").forward(req, response);
    28. }else{
    29. // 已经登录:
    30. chain.doFilter(req, response);
    31. }
    32. }
    33. @Override
    34. public void destroy() {
    35. }
    36. }

    首先需要做数据准备,创建数据库和表,并写入一些数据,如下:
     

    1. create database if not exists web05;
    2. use web05;
    3. create table if not exists user(
    4. id int primary key auto_increment,
    5. username varchar(20),
    6. password varchar(20)
    7. );
    8. insert into user values (null,'aaa','123');

    视图层的登录页面login.jsp如下:
     

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title heretitle>
    8. head>
    9. <body>
    10. <h1>登录页面h1>
    11. <h3><font color="red">${ msg }font>h3>
    12. <form action="${ pageContext.request.contextPath }/UserServlet" method="post">
    13. <table border="1" width="400">
    14. <tr>
    15. <td>用户名td>
    16. <td><input type="text" name="username">td>
    17. tr>
    18. <tr>
    19. <td>密码td>
    20. <td><input type="password" name="password">td>
    21. tr>
    22. <tr>
    23. <td colspan="2"><input type="submit" value="登录">td>
    24. tr>
    25. table>
    26. form>
    27. body>
    28. html>

    视图层登录成功的success.jsp代码入下:
     

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title heretitle>
    8. head>
    9. <body>
    10. <h1>您已经登录成功!欢迎:${ existUser.username }h1>
    11. <a href="${ pageContext.request.contextPath }/jsp/sub.jsp">提交数据a>
    12. body>
    13. html>

    控制层的servlet代码如下:

    1. import com.domain.User;
    2. import com.model.UserModel;
    3. import java.io.IOException;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. /**
    9. * 用户登录的Servlet
    10. */
    11. public class UserServlet extends HttpServlet {
    12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    13. try{
    14. // 接收数据:
    15. String username = request.getParameter("username");
    16. String password = request.getParameter("password");
    17. // 封装数据:
    18. User user = new User();
    19. user.setUsername(username);
    20. user.setPassword(password);
    21. // 处理数据:
    22. UserModel userModel = new UserModel();
    23. User existUser = userModel.login(user);
    24. // 根据处理结果页面跳转:
    25. if(existUser == null){
    26. // 登录失败
    27. request.setAttribute("msg", "用户名或密码错误!");
    28. request.getRequestDispatcher("/login.jsp").forward(request, response);
    29. }else{
    30. // 登录成功
    31. request.getSession().setAttribute("existUser", existUser);
    32. response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");
    33. }
    34. }catch(Exception e){
    35. e.printStackTrace();
    36. }
    37. }
    38. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    39. {
    40. doGet(request, response);
    41. }
    42. }

    封装用户信息的JavaBean代码如下:
     

    1. public class User {
    2. private Integer id;
    3. private String username;
    4. private String password;
    5. public Integer getId() {
    6. return id;
    7. }
    8. public void setId(Integer id) {
    9. this.id = id;
    10. }
    11. public String getUsername() {
    12. return username;
    13. }
    14. public void setUsername(String username) {
    15. this.username = username;
    16. }
    17. public String getPassword() {
    18. return password;
    19. }
    20. public void setPassword(String password) {
    21. this.password = password;
    22. }
    23. }

    处理查询任务的Model层代码如下:

    1. import java.sql.SQLException;
    2. import com.domain.User;
    3. import com.utils.JDBCUtils;
    4. import org.apache.commons.dbutils.QueryRunner;
    5. import org.apache.commons.dbutils.handlers.BeanHandler;
    6. public class UserModel {
    7. public User login(User user) throws SQLException {
    8. QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
    9. String sql = "select * from user where username = ? and password = ?";
    10. User existUser = queryRunner.query(sql, new BeanHandler(User.class), user.getUsername(),user.getPassword());
    11. return existUser;
    12. }
    13. }

    使用的获得连接池的工具类如下:

    1. import java.sql.Connection;
    2. import java.sql.ResultSet;
    3. import java.sql.SQLException;
    4. import java.sql.Statement;
    5. import javax.sql.DataSource;
    6. import com.mchange.v2.c3p0.ComboPooledDataSource;
    7. public class JDBCUtils {
    8. // 创建一个连接池:但是这个连接池只需要创建一次即可。
    9. private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
    10. /**
    11. * 获得连接的方法
    12. * @throws SQLException
    13. */
    14. public static Connection getConnection() throws SQLException{
    15. return dataSource.getConnection();
    16. }
    17. /**
    18. * 获得连接池:
    19. */
    20. public static DataSource getDataSource(){
    21. return dataSource;
    22. }
    23. }

    数据库的参数配置如下:

    1. "1.0" encoding="UTF-8"?>
    2. <c3p0-config>
    3. <default-config>
    4. <property name="driverClass">com.mysql.jdbc.Driverproperty>
    5. <property name="jdbcUrl">jdbc:mysql:///web05property>
    6. <property name="user">rootproperty>
    7. <property name="password">123456property>
    8. <property name="initialPoolSize">5property>
    9. <property name="minPoolSize">5property>
    10. <property name="maxPoolSize">20property>
    11. default-config>
    12. c3p0-config>

    web.xml中的配置如下:
     

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>UserServletservlet-name>
    8. <servlet-class>com.controller.UserServletservlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>UserServletservlet-name>
    12. <url-pattern>/UserServleturl-pattern>
    13. servlet-mapping>
    14. <filter>
    15. <filter-name>PrivilegeFilterfilter-name>
    16. <filter-class>com.filter.PrivilegeFilterfilter-class>
    17. filter>
    18. <filter-mapping>
    19. <filter-name>PrivilegeFilterfilter-name>
    20. <url-pattern>/jsp/*url-pattern>
    21. filter-mapping>
    22. web-app>

    网站,需要向后台提交中文的数据(有可能是GET也有可能是POST)。中文处理根据不同的请求方式,处理的方式也是不一样的。

    需要调用request.getParameter();方法接收数据,但是这个时候无论是get还是post接收的数据都是存在乱码。现在调用request.getParameter()方法无论是get还是post请求提交的中文,都没有乱码。

    此处使用增强的类对字符串乱码进行处理,使用过滤器直接调用即可。

    提交数据的jsp页面:
     

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title heretitle>
    8. head>
    9. <body>
    10. <h1>get提交方式h1>
    11. <form action="${ pageContext.request.contextPath }/ServletDemo1" method="get">
    12. 姓名:<input type="text" name="name"/><br>
    13. <input type="submit" value="提交">
    14. form>
    15. <h1>post提交方式h1>
    16. <form action="${ pageContext.request.contextPath }/ServletDemo1" method="post">
    17. 姓名:<input type="text" name="name"/><br>
    18. <input type="submit" value="提交">
    19. form>
    20. body>
    21. html>

    接收数据的servlet:
     

    1. import java.io.IOException;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. /**
    7. * 接收数据的Servlet
    8. */
    9. public class ServletDemo1 extends HttpServlet {
    10. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    11. String name = request.getParameter("name");
    12. System.out.println("GET方式接收的名称:"+name);
    13. }
    14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    15. {
    16. String name = request.getParameter("name");
    17. System.out.println("POST方式接收的名称:"+name);
    18. }
    19. }

    增强的类,处理乱码问题:

    1. import java.io.UnsupportedEncodingException;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpServletRequestWrapper;
    4. public class MyHttpServletRequest extends HttpServletRequestWrapper{
    5. private HttpServletRequest request;
    6. public MyHttpServletRequest(HttpServletRequest request) {
    7. super(request);
    8. this.request = request;
    9. }
    10. @Override
    11. // 增强request.getParameter()方法:
    12. public String getParameter(String name) {
    13. // 获得请求方式:
    14. String method = request.getMethod();
    15. // 根据get还是post请求进行不同方式的乱码的处理:
    16. if("GET".equalsIgnoreCase(method)){
    17. // get方式的请求
    18. String value = super.getParameter(name);
    19. try {
    20. value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
    21. } catch (UnsupportedEncodingException e) {
    22. e.printStackTrace();
    23. }
    24. return value;
    25. }else if("POST".equalsIgnoreCase(method)){
    26. // post方式的请求
    27. try {
    28. request.setCharacterEncoding("UTF-8");
    29. } catch (UnsupportedEncodingException e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. return super.getParameter(name);
    34. }
    35. }

    通用字符编码过滤器:
     

    1. import java.io.IOException;
    2. import javax.servlet.Filter;
    3. import javax.servlet.FilterChain;
    4. import javax.servlet.FilterConfig;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.ServletRequest;
    7. import javax.servlet.ServletResponse;
    8. import javax.servlet.http.HttpServletRequest;
    9. public class GenericEncodingFilter implements Filter{
    10. @Override
    11. public void init(FilterConfig filterConfig) throws ServletException {
    12. }
    13. @Override
    14. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    15. throws IOException, ServletException {
    16. // 在过滤器中增强request对象,并将增强后的request对象传递给Servlet:
    17. HttpServletRequest req = (HttpServletRequest) request;
    18. // 增强req:
    19. MyHttpServletRequest myReq = new MyHttpServletRequest(req);
    20. chain.doFilter(myReq, response);
    21. }
    22. @Override
    23. public void destroy() {
    24. }
    25. }

    在web.xml配置servlet和filter:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>UserServletservlet-name>
    8. <servlet-class>com.controller.UserServletservlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>UserServletservlet-name>
    12. <url-pattern>/UserServleturl-pattern>
    13. servlet-mapping>
    14. <servlet>
    15. <servlet-name>ServletDemo1servlet-name>
    16. <servlet-class>com.controller.ServletDemo1servlet-class>
    17. servlet>
    18. <servlet-mapping>
    19. <servlet-name>ServletDemo1servlet-name>
    20. <url-pattern>/ServletDemo1url-pattern>
    21. servlet-mapping>
    22. <filter>
    23. <filter-name>PrivilegeFilterfilter-name>
    24. <filter-class>com.filter.PrivilegeFilterfilter-class>
    25. filter>
    26. <filter-mapping>
    27. <filter-name>PrivilegeFilterfilter-name>
    28. <url-pattern>/jsp/*url-pattern>
    29. filter-mapping>
    30. <filter>
    31. <filter-name>GenericEncodingFilterfilter-name>
    32. <filter-class>com.filter.GenericEncodingFilterfilter-class>
    33. filter>
    34. <filter-mapping>
    35. <filter-name>GenericEncodingFilterfilter-name>
    36. <url-pattern>/jsp/*url-pattern>
    37. filter-mapping>
    38. web-app>
  • 相关阅读:
    关于webpack面试题
    防反接方案,NMOS & PMOS
    游戏软件开发与应用软件开发有什么不同呢?
    基于GO语言实现的X.509证书
    dom4j读取xml内容时丢失换行符
    【鸿蒙 HarmonyOS 4.0】通知
    【Dart】002-函数
    java多线程之概念和3种创建方式(详解)
    SSM和SpringBoot整合
    基于I2C协议的OLED显示(利用U82G库)
  • 原文地址:https://blog.csdn.net/nuist_NJUPT/article/details/126430596