1.javaEE中的组件与作用域对象

1.1.javaEE三大组件

在javaEE中有三大标准组件:

  1. Servelt组件。
  2. Filter组件。(过滤器组件)
  3. Listener组件。(监听器组件)

后面将会学习Filter组件与Listener组件。

1.2.javaEE三大作用域对象

在javaEE中有三大作用域对象(三个存储共享数据的对象,区别是共享数据的作用范围不同):

  1. HttpServletRequest作用域对象:作用范围是一个请求响应范围(从一个请求开始,到响应结束)。
  2. HttpSession作用域对象:作用范围是一个会话范围(从浏览器发送请求访问服务器开始,到浏览器关闭为止; 在此期间,不论发送了多少次请求响应,都是一个session范围)。
  3. ServletContext作用域对象:作用范围是一个应用程序范围(从服务器启动开始,到服务器关闭为止)。

    注意: 此三大作用域对象,均由服务器端自动创建。并且,都具有 setAttribute(key,value) 、 getAttribute(key) 、removeAttribute(key) 方法,用于设置共享数据与获取共享数据。

下面演示javaEE三大作用域对象:

  1. @WebServlet("/login")
  2. public class LoginServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  5. throws ServletException, IOException {
  6. response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
  7. response.setHeader("Access-Control-Allow-Credentials", "true");
  8. //向Request作用域中添加属性
  9. request.setAttribute("message", "Request信息");
  10. //向Session作用域中添加属性
  11. request.getSession().setAttribute("message", "Session信息");
  12. //向ServletContext作用域中添加属性
  13. request.getServletContext().setAttribute("message", "ServletContext信息");
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18. doGet(request,response);
  19. }
  20. }
@WebServlet("/news")
public class NewsServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                         throws ServletException, IOException {
        response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        //从Request作用域中获取属性值
        System.out.println(request.getAttribute("message"));
        //从Session作用域中获取属性值
        System.out.println(request.getSession().getAttribute("message"));
        //从ServletContext作用域中获取属性值
        System.out.println(request.getServletContext().getAttribute("message"));
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                           throws ServletException, IOException {
        doGet(request,response);
    }
}

注意:

  1. 先访问 http://localhost:8080/hello/login ,然后访问 http://localhost:8080/hello/news 此时:Session作用域和ServletContext作用域中的属性值可以获取。
  2. 关闭浏览器,然后重新打开,访问 http://localhost:8080/hello/news 此时:只有ServletContext作用域中的属性值可以获取。

2.Filter 过滤器

在javaEE中有三大标准组件:Servelt、Filter(过滤器)、Listener(监听器)

2.1.Filter简介

Filter过滤器介于与之相关的Servlet或JSP页面与客户端之间,工作原理:某资源的所有请求都会经过过滤器,过滤器在Servlet被调用之前会检查请求对象(Request对象),并决定是将请求转发给过滤器链中的下一个资源还是中止该请求并响应用户。
04.过滤器与监听器 - 图1
过滤器的特点:

  1. 过滤器可以检查和修改ServletRequest和ServletResponse对象。
  2. 过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器。
  3. 过滤器可以被串联在一起,形成过滤器链,协同修改请求和响应对象。
  4. 过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作。

    2.2.创建过滤器

    创建过滤器须实现javax.servlet.Filter接口,该接口内定义了3个方法:

  5. init(FilterConfig config):用于初始化过滤器,并获取web.xml文件中配置的过滤器初始化参数。

  6. doFilter(ServletRequest reg,ServletResponse res,FilterChain chain) 用于进行过滤操作,该方法的第一个参数为ServletRequest对象, 此对象给过滤器提供了对请求信息访问;第二个参数为ServletResponse,用于 响应使用ServletRequest对象访问的信息,通常在简单的过滤器中忽略此参数;最后一个参数为 FilterChain,该参数用来调用过滤器链中的下一个资源。
  7. destroy():Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。性质等同与servlet的destory()方法。

下面创建CORS跨域处理的过滤器:

package filter;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/*")
public class CorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        //测试过滤器时用
        System.out.println("经过了此过滤器");
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        //设置允许跨域
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        //设置开启Cookie
        response.setHeader("Access-Control-Allow-Credentials", "true"); 
        chain.doFilter(req, resp);    
    }
    @Override
    public void destroy() {}
}

注意:

  1. 使用 @WebFilter(“/*”) 注解配置过滤器的URL。
  2. 这里配置的URL为 “/*” ,也就是将此过滤器放在所有Servlet之前。
  3. 在此过滤器中设置了跨域处理,那么在所有Servlet中就可以不配置跨域处理了。

思考: 现在有三个Servlet,映射url分别是:”/a”、”/b”、”/c”; 要将上面的过滤器只放置在前两个Servlet之前,如何实现呢:

  1. 将三个Servlet的映射url分别修改为:”/my/a”、”/my/b”、”/c”
  2. 过滤器映射url修改为:@WebFilter(“/my/*”)

3.Listener 监听器

3.1.监听器简介

Listener监听器是Web应用程序事件模型的一部分,当Web应用中的某些状态发生改变时,Servlet容器就会产生相应的事件,比如创建ServletContext对象时触发ServletContextEvent事件,创建HttpSession对象时触发HttpSessionEvent事件,Servlet监听器可接收这些事件,并可以在事件发生前、发生后可以做一些必要的处理。
监听器有三种:

  1. ServletContext监听器:监听ServletContext对象的创建与销毁、以及属性的变化。
  2. HttpSession监听器:监听HttpSession对象的创建与销毁、以及属性的变化。
  3. HttpServeltRequest监听器:监听HttpServeltRequest对象的创建与销毁、以及属性的变化。

    3.2.创建监听器

    下面创建Tomcat服务器启动的监听器:
    package listener;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    //此注解会通知服务器加载此监听器
    @WebListener
    public class StartListener implements ServletContextListener{
     //服务器启动时会自动触发此方法
     @Override
     public void contextInitialized(ServletContextEvent sce) {
         System.out.println("Tomcat start...");
     }
     //服务器停止时会自动触发此方法
     @Override
     public void contextDestroyed(ServletContextEvent sce) {}
    }
    

    注意:

    1. 创建 ServletContext 监听器时,只需要实现 ServletContextListener 接口即可。
    2. 此接口中有两个方法:contextInitialized() 方法监听服务器的启动;contextDestroyed() 方法监听服务器的停止。

课后作业

  1. 简述javaEE三大组件?
  2. 简述javaEE三大作用域?
  3. 简述什么是过滤器?
  4. 简述@WebFilter注解的作用
  5. 简述什么是监听器?
  6. 简述javaEE中的三种监听器的作用?