美文网首页
java web三大器和三大域

java web三大器和三大域

作者: M_lear | 来源:发表于2022-02-15 10:04 被阅读0次

三大器:过滤器、监听器、拦截器

过滤器

过滤器属于servlet规范。
责任链模式设计。
在请求进入servlet前调用。

package javax.servlet;

public interface Filter {

    public void init(FilterConfig filterConfig) throws ServletException;
    
    
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException;

    public void destroy();
}

监听器

监听器也属于servlet规范

重点关注三个监听器即可:

  1. ServletContextListener
public interface ServletContextListener extends EventListener {

    public void contextInitialized(ServletContextEvent sce);

    public void contextDestroyed(ServletContextEvent sce);
}

在ServletContext创建和销毁时被调用。
spring就是通过实现这个监听器来触发容器创建操作的。

  1. HttpSessionListener
public interface HttpSessionListener extends EventListener {
    
    public void sessionCreated(HttpSessionEvent se);
    
    public void sessionDestroyed(HttpSessionEvent se);
    
}

在HttpSession创建和销毁时被调用。

  1. ServletRequestListener
public interface ServletRequestListener extends EventListener {

    public void requestDestroyed(ServletRequestEvent sre);

    public void requestInitialized(ServletRequestEvent sre);
}

在ServletRequest创建和销毁时被调用。

拦截器

在spring mvc中定义的。
基于动态代理实现。
在请求进入Controller前执行preHandle方法,在请求离开Controller后执行postHandle方法,在请求离开DispatcherServlet前执行afterCompletion方法。

package org.springframework.web.servlet.handler;

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

    /**
     * This implementation always returns {@code true}.
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        return true;
    }

    /**
     * This implementation is empty.
     */
    @Override
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
    }

    /**
     * This implementation is empty.
     */
    @Override
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }

    /**
     * This implementation is empty.
     */
    @Override
    public void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    }

}

三大域:context、session、request

可以理解为共享在不同域范围内的全局变量。

context共享在web应用存在期间。一个web应用有一个context。

session共享在会话存在期间。一个会话有一个session。同一个浏览器与服务器的一段活跃交互称为一个会话,一般在没有交互后的30分钟session会被销毁。会话期间可以有多个请求和响应。

request共享在一次请求期间。

三者的关系是,一个context可以包含多个session,一个session可以包含多个request。

ServletContext、HttpSession和ServletRequest都提供了

    public Object getAttribute(String name);

    public void setAttribute(String name, Object o);

    public void removeAttribute(String name);

来存取和删除数据。

HttpServletRequest(继承自ServletRequest)可以通过getSession方法拿到当前request所在的session,通过getServletContext方法拿到当前request所在的context。

同样的,HttpSession也可以通过getServletContext方法拿到当前session所在的context。

总结:context可以实现web应用的跨浏览器数据共享,session可以实现同一浏览器的跨请求数据共享。

相关文章

网友评论

      本文标题:java web三大器和三大域

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