Servlet 和Filter的生命周期(springboot测试servlet和filter)

servlet生命周期:

  1. 通过构造函数实例化Servlet对象;
  2. 当第一次浏览器向服务器发送请求,访问servlet;
  3. 调用init方法进行初始化 (servlet对象一般只有一个,会常驻内存)  init方法只会调用一次;
  4. 开启一个线程,去调用service方法,以后在访问这个servlet都会开启一个线程来调用service方法去处理请求操作;
  5. 当服务器关闭时,会调用servlet的destroy方法将servlet实例销毁。

filter生命周期:(其实filter可以看作是一种特殊的servlet,所以生命周期和servlet大致相同)

  1. 通过构造函数实例化;
  2. 初始化init();
  3. 业务逻辑处理:doFilter();
  4. 销毁:destory()

如何创建servlet:(我创建的是springboot项目)

1.pom.xml

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.创建了一个名为OneServlet的Servlet:

@WebServlet(name = "oneServlet",urlPatterns = "/one");只要在类上加@WebServlet注解就代表这是servlet不用在web.xml中配置servlet了,name属性,就是以前web.xml中servletname标签,随便起就行,urlPatterns = "/one"这个属性是访问servlet的路径
package com.example.demo6.web.servlet;

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

@WebServlet(name = "oneServlet",urlPatterns = "/one")
public class OneServlet extends HttpServlet {
    //构造方法
    public OneServlet() {
        System.out.println("1.OneServlet之构造");
    }
    //doGet方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3.OneServlet之doGet");
    }
    //doPost方法
    @Override
    protected void doPost(HttpServletRequest req, 
HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3.OneServlet之doPost");
    }
    //销毁方法
    @Override
    public void destroy() {
        System.out.println("4.OneServlet之destroy");
    }
    //初始化方法
    @Override
    public void init() throws ServletException {
        System.out.println("2.OneServlet之init");
    }
}

3.创建一个名为OneFilter的过滤器:

只要在类上加@WebFilter(filterName = "oneFilter",urlPatterns = "/*")注解就代表这是Filter不用在web.xml中配置Filter了,name属性,就是以前web.xml中Filtername标签,随便起就行,urlPatterns = "/*"这个属性是拦截servlet的路径
 

package com.example.demo6.web.servlet;

import com.example.demo6.exception.NotLoginException;
import com.example.demo6.pojo.ManagerUser;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter(filterName = "oneFilter",urlPatterns = "/demo1/*")
public class OneFilter implements Filter {
    public OneFilter() {
        System.out.println("1.过滤器的构造器");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("2.过滤器的init()");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, 
ServletResponse servletResponse,
 FilterChain filterChain) throws IOException, ServletException {
        
        System.out.println("3.过滤器的doFilter()");
    }

    @Override
    public void destroy() {
        System.out.println("4.过滤器的init()");
    }
}

4.然后在启动类上加@ServletComponentScan(basePackages = "com")这个注解:

表示扫描@webservlet的一系列注解,basePackages = "com"这个属性表示扫描哪个包下的servlet注解,如果不写的话,servlet必须创建到启动类同包或者子包下

5.测试:

启动项目就会加载如下图:

访问路径:

点击:

over!顺序就这样!

猜你喜欢

转载自blog.csdn.net/qq_43154385/article/details/85298466
0条评论
添加一条新回复