Servlet是JavaEE的规范之一,规范就是接口。Servlet是JavaWeb三大组建之一,其中,三大组件分别是:Servlet程序、Filter过滤器和Listener监听器。Servlet是运行在服务器上的一个java小程序,他可以接收客户端发过来的信息,并响应数据给客户端。
ervlet的生命周期为以下四个步骤:1、执行Servlet构造器方法;2、执行init方法;3、执行service方法;4、执行destroy方法。
Servlet有一个很重要的作用就是可以接受客户端发过来的信息,并且进行响应。我们还知道,最简单的请求方式有两种,一种叫GET,一种叫POST,这两种请求方式是不一样的。
注意:前两个步骤只在第一次访问网页的时候执行一次,第三个步骤每次访问都会调用(比如,疯狂刷新网页),第四个步骤在web工程停止的时候调用。
Filter是JavaWeb三大组件之一,符合JavaEE的规范接口。用于请求的拦截和过滤。拦截请求常见应用场景:权限检查、日记操作、事务管理。
Filter过滤器的使用步骤:1、编写一个类实现Filter接口;2、实现过滤方法doFIlter( );3、在web.xml中配置Filter的拦截路径。
Filter的生命周期包含几个方法:1、构造器方法(服务器启动就调用);2、init初始化方法(服务器启动就调用);3、doFilter方法(当输入拦截地址的时候调用);4、destroy销毁方法(关闭服务器的时候调用)。
Listener作为JavaEE的规范,其实就是一个接口。他的作用是:监听某个事物的变化,然后通过回调函数,反馈给客户(程序)去做一些响应的处理。接下来我们要讲的ServletContextListener主要监听的是Servlet的创建和销毁,貌似也只能监听他的创建和销毁。
继承一下HttpServlet。然后添加@WebServlet注解。
package com.example.boot.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(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().write("这是用SpringBoot写出来的哦~");
}
}
然后在我们的主配置类中添加@ServletComponentScan注解即可:
package com.example.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
public class SpringbootWebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebApplication.class, args);
}
}
运行结果:
注释掉之前的@WebServlet注解,然后写我们的配置类:
package com.example.boot.config;
import com.example.boot.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRegistConfig {
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet = new MyServlet();
/**
* 返回ServletRegistrationBean对象
* 第一个参数是我们的Servlet对象
* 第二个参数开始使我们设置的Servlet的请求地址(可以设置多个)
*/
return new ServletRegistrationBean(myServlet,"/myServlet","/myServlet02");
}
}
运行结果:
实现Filter接口。然后添加@WebFilter注解。
package com.example.boot.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = {"/css/*", "/js/* "})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter初始化完成");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter正在工作");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("MyFilter已经销毁");
}
}
然后在我们的主配置类中添加@ServletComponentScan注解即可:运行结果:
注释掉之前的@WebFilter注解,然后写我们的配置类:
@Bean
public FilterRegistrationBean myFilter(){
MyFilter myFilter = new MyFilter();
/**
* 第一个参数是我们的拦截器对象
* 对二个参数开始是我们的ServletRegistrationBean对象(其实就是我们自定义的Servlet)
*/
return new FilterRegistrationBean(myFilter, myServlet());
}
运行结果:可见,这种写法的话,我们的拦截器也可以对其进行拦截。
实现一下ServletContextListener接口。然后添加@WebListener注解。
package com.example.boot.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("Servlet被创建");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("Servlet被销毁");
}
}
然后在我们的主配置类中添加@ServletComponentScan注解即可:运行结果:
注释掉之前的@WebListener注解,然后写我们的配置类:
package com.example.boot.config;
import com.example.boot.filter.MyFilter;
import com.example.boot.listener.MyListener;
import com.example.boot.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.*;
@Configuration
public class MyRegistConfig {
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet = new MyServlet();
/**
* 返回ServletRegistrationBean对象
* 第一个参数是我们的Servlet对象
* 第二个参数开始使我们设置的Servlet的请求地址(可以设置多个)
*/
return new ServletRegistrationBean(myServlet,"/myServlet","/myServlet02");
}
@Bean
public FilterRegistrationBean myFilter(){
MyFilter myFilter = new MyFilter();
/**
* 第一个参数是我们的拦截器对象
* 对二个参数开始是我们的ServletRegistrationBean对象(其实就是我们自定义的Servlet)
*/
// return new FilterRegistrationBean(myFilter, myServlet());
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(myFilter);
List list = new ArrayList();
list.add("/myServlet");
list.add("/css/*");
//传入的是一个Collection,用Set、List等都可以
filterRegistrationBean.setUrlPatterns(list);
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean myListener(){
MyListener myListener = new MyListener();
return new ServletListenerRegistrationBean(myListener);
}
}
运行结果:(编译后就可以看到)
参考: https://blog.csdn.net/weixin_44741023/article/details/120322142
https://blog.csdn.net/weixin_44741023/article/details/118499070