美文网首页
Servlet学习2:监听器、过滤器

Servlet学习2:监听器、过滤器

作者: 苦难_69e0 | 来源:发表于2021-02-18 18:50 被阅读0次

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 {


    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("恭喜恭喜,来世走一朝");
    }

    @Override
    public 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 {

    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("新增共享数据");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("删除共享数据");
    }

    @Override
    public 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

<?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>com.bjpowernode.listener.OneListener</listener-class>
      </listener>
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>

Servlet规范扩展-----------------Filter接口(过滤器接口)

1.介绍:

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拦截地址格式

  1. 命令格式:
<filter-mapping>
    <filter-name>oneFilter</filter-name>
    <url-pattern>拦截地址</url-pattern>
 </filter-mapping>
  1. 命令作用:
    通过拦截地址通知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 {

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

           //1.通过拦截请求对象得到请求包参数信息,从而得到来访用户的真实年龄
           String age= servletRequest.getParameter("age");
           //2.根据年龄,帮助Http服务器判断本次请求合法性
           if(Integer.valueOf(age) < 70){ //合法请求
               //将拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件
               filterChain.doFilter(servletRequest, servletResponse);//放行
           }else{
               //过滤器代替Http服务器拒绝本次请求
               servletResponse.setContentType("text/html;charset=utf-8");
               PrintWriter out = servletResponse.getWriter();
               out.print("<center><font style='color:red;font-size:40px'>大爷,珍爱生命啊!</font></center>");
           }
    }
}

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字符集对当前请求体信息进行一次重新编辑
    @Override
    public 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>
最终版互联网通信流程给.png

相关文章

网友评论

      本文标题:Servlet学习2:监听器、过滤器

      本文链接:https://www.haomeiwen.com/subject/oewknktx.html