写点什么

Servlet 学习:监听器、过滤器

作者:java易二三
  • 2023-07-29
    湖南
  • 本文字数:4523 字

    阅读完需:约 15 分钟

Servlet 规范扩展-----------------监听器接口 1.介绍:


1)一组来自于 Servlet 规范下接口,共有 8 个接口。在 Tomcat 存在 servlet-api.jar 包


2)监听器接口需要由开发人员亲自实现,Http 服务器提供 jar 包并没有对应的实现类


3)监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】


2.作用域对象:


1)在 Servlet 规范中,认为在服务端内存中可以在某些条件下为两个 Servlet 之间提供数据共享方案的对象,被称为【作用域对象】


2)Servlet 规范下作用域对象:


ServletContext: 全局作用域对象 HttpSession : 会话作用域对象 HttpServletRequest:请求作用域对象


3.监听器接口实现类开发规范:三步


1)根据监听的实际情况,选择对应监听器接口进行实现


2)重写监听器接口声明【监听事件处理方法】


3)在 web.xml 文件将监听器接口实现类注册到 Http 服务器


4.ServletContextListener 接口:


1)作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻


2)监听事件处理方法:


public void contextInitlized() : 在全局作用域对象被 Http 服务器初始化被调用


public void contextDestory() : 在全局作用域对象被 Http 服务器销毁时候触发调用


OneListener.java 这个直接创建 java 类,而不是 servlet


package com.bjpoewrnode.listener;


import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;


public class OneListener implements ServletContextListener {


@Overridepublic void contextInitialized(ServletContextEvent sce) {    System.out.println("恭喜恭喜,来世走一朝");}
@Overridepublic void contextDestroyed(ServletContextEvent sce) { System.out.println("兄弟不要怕,二十年之后你还是一条好汉");}
复制代码


}


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">


     <!--将监听器接口实现类注册到Tomcat-->     <listener>         <listener-class>com.bjpoewrnode.listener.OneListener</listener-class>     </listener>
复制代码


</web-app>5.ServletContextAttributeListener 接口:


1)作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻


2)监听事件处理方法:


public void contextAdd():在全局作用域对象添加共享数据 public void contextReplaced():在全局作用域对象更新共享数据 public void contextRemove():在全局作用域对象删除共享数据


6.全局作用域对象共享数据变化时刻


ServletContext application = request.getServletContext();


application.setAttribute("key1",100); //新增共享数据


application.setAttribute("key1",200); //更新共享数据


application.removeAttribute("key1"); //删除共享数据


OneListener.java 这个直接创建 java 类,而不是 servlet


package com.bjpowernode.listener;


import javax.servlet.ServletContextAttributeEvent;import javax.servlet.ServletContextAttributeListener;


public class OneListener implements ServletContextAttributeListener {


@Overridepublic void attributeAdded(ServletContextAttributeEvent scae) {    System.out.println("新增共享数据");}
@Overridepublic void attributeRemoved(ServletContextAttributeEvent scae) { System.out.println("删除共享数据");}
@Overridepublic void attributeReplaced(ServletContextAttributeEvent scae) { System.out.println("更新共享数据");}
复制代码


}


OneServlet.java


package com.bjpowernode.controller;


import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;


public class OneServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext application = request.getServletContext();
application.setAttribute("key1",100); //新增共享数据
application.setAttribute("key1",200); //更新共享数据

application.removeAttribute("key1"); //删除共享数据}
复制代码


}


web.xml


1)来自于 Servlet 规范下接口,在 Tomcat 中存在于 servlet-api.jar 包 2)Filter 接口实现类由开发人员负责提供,Http 服务器不负责提供 3)Filter 接口在 Http 服务器调用资源文件之前,对 Http 服务器进行拦截


2.具体作用:


1)拦截 Http 服务器,帮助 Http 服务器检测当前请求合法性 2)拦截 Http 服务器,对当前请求进行增强操作


3.Filter 接口实现类开发步骤:三步


1)创建一个 Java 类实现 Filter 接口 2)重写 Filter 接口中 doFilter 方法 3)web.xml 将过滤器接口实现类注册到 Http 服务器


4.Filter 拦截地址格式


命令格式:<filter-mapping><filter-name>oneFilter</filter-name><url-pattern>拦截地址</url-pattern></filter-mapping>命令作用:通过拦截地址通知 Tomcat 在调用何种资源文件之前需要调用 OneFilter 过滤进行拦截要求 Tomcat 在调用某一个具体文件之前,来调用 OneFilter 拦截<url-pattern>/img/mm.jpg</url-pattern>


要求 Tomcat 在调用某一个文件夹下所有的资源文件之前,来调用 OneFilter 拦截<url-pattern>/img/*</url-pattern>


要求 Tomcat 在调用任意文件夹下某种类型文件之前,来调用 OneFilter 拦截<url-pattern>*.jpg</url-pattern>


要求 Tomcat 在调用网站中任意文件时,来调用 OneFilter 拦截<url-pattern>/*</url-pattern>


过滤器检测请求合法性 OneFilter.java


package com.bjpowernode.filter;


import javax.servlet.*;import java.io.IOException;import java.io.PrintWriter;


/**


  • http://localhost:8080/myWeb/mm.jpg?age=89*/public class OneFilter implements Filter {

  • @Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

  • }}


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">


      <!--将过滤器类文件路径交给Tomcat-->      <filter>          <filter-name>oneFilter</filter-name>          <filter-class>com.bjpowernode.filter.OneFilter</filter-class>      </filter>      <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截-->      <filter-mapping>          <filter-name>oneFilter</filter-name>          <url-pattern>/mm.jpg</url-pattern>      </filter-mapping>
复制代码


</web-app>过滤器对请求对象进行增强服务 index.html


<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><center><form action="/19__war_exploded/one" method="post">参数:<input type="text" name="userName"/><br/><input type="submit" value="POST 方式访问 OneServlet"></form>


<form action="/19__war_exploded/two" method="post">    参数:<input type="text" name="userName"/><br/>    <input type="submit" value="POST方式访问TwoServlet"></form>
复制代码


</center></body></html>OneServlet.java


package com.bjpowernode.controller;


import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;


public class OneServlet extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//直接从请求体读取请求参数 String userName = request.getParameter("userName"); System.out.println("OneServelt 从请求体得到参数 "+userName);}
复制代码


}


TwoServlet.java


package com.bjpowernode.controller;


import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;


public class TwoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//直接从请求体读取请求参数 String userName = request.getParameter("userName");System.out.println("TwoServelt 从请求体得到参数 "+userName);}


}


OneFiter.java


package com.bjpowernode.filter;


import javax.servlet.*;import java.io.IOException;


public class OneFilter implements Filter {


 //通知拦截的请求对象,使用UTF-8字符集对当前请求体信息进行一次重新编辑@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {    servletRequest.setCharacterEncoding("utf-8");//增强    filterChain.doFilter(servletRequest, servletResponse);}
复制代码


}


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>OneServlet</servlet-name><servlet-class>com.bjpowernode.controller.OneServlet</servlet-class></servlet><servlet><servlet-name>TwoServlet</servlet-name><servlet-class>com.bjpowernode.controller.TwoServlet</servlet-class></servlet><servlet-mapping><servlet-name>OneServlet</servlet-name><url-pattern>/one</url-pattern></servlet-mapping><servlet-mapping><servlet-name>TwoServlet</servlet-name><url-pattern>/two</url-pattern></servlet-mapping>


<filter>    <filter-name>oneFilter</filter-name>    <filter-class>com.bjpowernode.filter.OneFilter</filter-class></filter>
<filter-mapping> <filter-name>oneFilter</filter-name> <url-pattern>/*</url-pattern><!--通知tomcat在调用所有资源文件之前都需要调用OneFilter进行拦截--></filter-mapping>
复制代码


</web-app>

用户头像

java易二三

关注

还未添加个人签名 2021-11-23 加入

还未添加个人简介

评论

发布
暂无评论
Servlet学习:监听器、过滤器_编程_java易二三_InfoQ写作社区