JavaWeb三大组件Servlet,Filter,Listener

Servlet

Servlet可以理解为一个接口,提供前后端交互

可以从后端获取数据,并传入前端

也可以从前端获取数据,使用后端逻辑

Servlet生命周期:

Servlet的生命周期开始于项目运行,并且在一个项目中,通常情况下,一个Servlet之后初始化建立一次

第二次访问通过一个对象,

当项目关闭时,Servlet就消亡了,生命周期结束

Servlet线程不安全

前面的文章就有提到,使用Servlet时会涉及到线程不安全

就是因为使用了域对象或者全局变量的原因

ServletContext

(1)ServletContext管理所有servlet,ServletContext是servlet他爹。

(2)ServletContext生命周期:天地同寿,项目启动就有了。

(3)ServletContext也是域对象,生命周期最长的对象,不要轻易往ServletContext写数据。

可以通过这个方法获取到文件的绝对路径,在实现文件上传时会用到

 String path = getServletContext().getRealPath("文件夹");

过滤器Filter

使用场景:

用户登录之后,将用户信息放置到Session中,访问一些个人相关的页面,只有session存在用户信息才能访问(只有登录成功之后才能访问。)

访问所有的servlet之前都需要 先从Session里面去除用户信息进行判断

Filter是什么

这个filter就相当于路上的关卡,设了几道关卡就要拦截几次,只要有一个拦截器没通过,这个请求就结束了。

每一个关卡认为是一个功能

建立Filter

方法一:传统方法,建立好Filter后在web.xml中配置,此处,如果没有登录信息就访问其他页面,是不成功的:


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

public class Filter implements javax.servlet.Filter {
    public void destroy() {
        System.out.println("destroy");
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("doFilter");
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        resp.setContentType( "text/html;charset=utf-8" );

        String uri = request.getRequestURI();
        User user = (User) req.getAttribute( "user" );
        if(user !=null || uri.contains( "login" )){
            chain.doFilter( req, resp );
        }else {
            response.getWriter().write( "{\"code\":1,\"message\":\"未登入\"}" );
        }
    }
    public void init(FilterConfig config) throws ServletException {
        System.out.println("init");
    }

}
    <filter>
        <filter-name>Filter</filter-name>
        <filter-class>com.Filter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Filter</filter-name>
        <!--
            完全匹配:/userServlet
            目录匹配:/servlet/*,请求路径包含/servlet/
            扩展名匹配:*.action/ *.jsp
        -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

方式二:注解方式:

@WebFilter(filterName = "Filter",urlPatterns = {"","",""}) //要过滤的Servlet

监听器Listener

是什么

监听器就是监听某个对象的状态 发送变化的组件。

事件源:被监听的对象

监听器:监听事件源的对象。

相应的行为:监听的事件发生了,应该怎么处理。

8个监听器

接口名

作用

ServletContextListener

servletContext对象的创建

HttpSessionListener

Session对象的创建

ServletRequestListener

Request对象的创建

ServletContextAttibuteListener

servletContext属性变化

HttpSessionAttributeListener

Session属性变化

ServletRequestAriibuteListenr

Request属性变化

HttpSessionActivationListener

Session钝化与活化

HttpSessionBindingListener

Session与对象的绑定

6个分别是对3个域对象(ServletContext、HttpSession、ServletRequest)的监听,每个域对象分别对应 (监听创建和销毁)、(属性的变化)。

HttpSessionBindingListener:

         用户成功登陆之后,一般会将用户信息(User)存储在Session中,会触发该事件

         从Session中将User对象移除的时候,也会触发该事件。

HttpSessionActivationListener:

钝化:将内存中Session持久化磁盘中。

活化:将磁盘上的Session恢复到内存中。

建立监听器:

方法一,直接建立,通过web.xml文件配置,本监听器的作用是设置一段时间,在该时间之后,每隔一秒输出一次我被调用

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;


public class Listener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext创建");
        /**做一些准备工作:
         * (1)初始化对象,初始化数据加载,加载数据库驱动,连接池初始化
         * (2)一些配置文件的加载,
         * (3)定时任务调度---定时器 */
        Timer timer = new Timer();
        Calendar calendar = Calendar.getInstance();
        calendar.set( Calendar.HOUR,5 );
        calendar.set( Calendar.MINUTE,0 );
        calendar.set( Calendar.SECOND,0 );
        SimpleDateFormat sf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
        System.out.println(sf.format( calendar.getTime()));
        timer.scheduleAtFixedRate( new TimerTask() {
            public void run() {
                System.out.println("我被调用了");
            }
        },calendar.getTime(),1000 );
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext死亡");
    }
}

配置web.xml

   <listener>
        <listener-class>com.Listener</listener-class>
    </listener>

方式二,注解:

@WebListener()

猜你喜欢

转载自blog.csdn.net/h1025372645/article/details/89740845