目录
前言
一、注册Servlet组件
1.1 使用SpringBoot注解加继承HttpServet类注册
1.2 通过继承HttpServet类加配置类来进行注册
二、注册Listener组件
2.1 使用SpringBoot注解和实现ServletContextListener接口注册
2.2 ServletContextListener接口和配置类来进行注册
三、注册Filter组件
3.1 使用SpringBoot注解加实现Filter接口注册
3.2 通过实现Filter接口和配置类来进行注册通过实现
前言
Servlet是Java Web应用程序的基础,它提供了处理客户端请求的机制。Servlet三大组件是指Servlet、Filter和Listener,它们是Java Web应用程序的核心组件。
- Servlet:Servlet是Java Web应用程序的基础,它是一个Java类,用于处理客户端请求并生成响应。Servlet可以通过注解或web.xml文件进行配置,它通常用于处理HTTP请求和响应。
- Filter:Filter是一个Java类,用于拦截和处理客户端请求和响应。Filter可以在请求到达Servlet之前或响应返回客户端之前执行预处理和后处理操作,例如验证用户身份、编码解码、压缩和解压缩等。
- Listener:Listener是一个Java类,用于监听Web应用程序中的事件,并在事件发生时执行相应的操作。Listener可以通过注解或web.xml文件进行配置,它通常用于处理应用程序启动、停止、会话创建和销毁等事件。
总之,Servlet三大组件是Java Web应用程序的核心组件,它们分别用于处理请求、拦截请求和监听事件,从而实现了一个完整的Java Web应用程序。
一、注册Servlet组件
由于SpringBoot项目没有web.xml文件,所以无法在web.xml中注册web组件,SpringBoot有自己的方式注册web组件。
1.1 使用SpringBoot注解加继承HttpServet类注册
编写servlet,首先是要添加@WebServlet注解;代码如下:
package com.example.demo.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("/first")
public class FirstServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("First Servlet......");super.doGet(req, resp);}
}
启动类添加扫描Web组件用到的注解@ServletComponentScan
OK,直接运行看效果:访问:http://localhost:8080/first
是可以直接打印出来的。
1.2 通过继承HttpServet类加配置类来进行注册
ok,接下来我们讲解第二种注册方式,通过继承HttpServet类来进行注册,代码如下:
package com.example.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SecondServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Second Servlet........");super.doGet(req, resp);}
}
这里我们需要新建一个配置类,将该Servlet加载到Spring容器中,配置类代码如下
package com.example.demo.config;import com.example.demo.servlet.SecondServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ServletConfig {// ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet@Beanpublic ServletRegistrationBean getServletRegistrationBean(){// 注册Servlet组件ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());// 将Servlet组件添加访问路径bean.addUrlMappings("/second");return bean;}
}
OK,然后我们点击运行,直接访问http://localhost:8080/second
因此说明了两种注册方式都是可用的。
二、注册Listener组件
2.1 使用SpringBoot注解和实现ServletContextListener接口注册
原理和上面一样只不过是直接注解,无需配置类,代码如下
package com.example.demo.listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener()
public class FirstListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("FirsListener.........");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {ServletContextListener.super.contextDestroyed(sce);}
}
此时如果我们直接运行项目就会打印上面那句话,接下来我们直接运行项目,看看是否打印,
说明该方法是可行的,
2.2 ServletContextListener接口和配置类来进行注册
同样我们去掉注解使用配置类注册 ,代码如下:
package com.example.demo.listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class SecondListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("Second Listener...........");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {ServletContextListener.super.contextDestroyed(sce);}
}
配置类代码入下:
package com.example.demo.config;import com.example.demo.listener.SecondListener;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ListenerConfig {// ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet@Beanpublic ServletListenerRegistrationBean getServletListenerRegistrationBean(){// 注册Listener组件ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new SecondListener());return bean;}
}
然后直接运行看看结果,
OK,同样也是没有问题的。
三、注册Filter组件
3.1 使用SpringBoot注解加实现Filter接口注册
和上面一样,代码如下:
package com.example.demo.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Scanner;//@WebFilter("/first")
public class FirstServletFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("进入First Filter");Scanner scanner = new Scanner(System.in);boolean flag = scanner.nextBoolean();while(!flag){System.out.println("要输入true才放行!!!");flag = scanner.nextBoolean();}filterChain.doFilter(servletRequest,servletResponse);scanner.close();}@Overridepublic void destroy() {Filter.super.destroy();}
}
这里访问/frist的话/我们要输入true才进行放行,看看是否成功过滤,
OK,这里是成功了的,接下来也是一样的操作
3.2 通过实现Filter接口和配置类来进行注册通过实现
代码如下:
package com.example.demo.filter;import javax.servlet.*;
import java.io.IOException;
import java.util.Scanner;public class SecondFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("进入Second Filter");Scanner scanner = new Scanner(System.in);boolean flag = scanner.nextBoolean();while(!flag){System.out.println("要输入true才可以放行!!!");flag = scanner.nextBoolean();}filterChain.doFilter(servletRequest,servletResponse);scanner.close();}@Overridepublic void destroy() {Filter.super.destroy();}
}
配置类代码如下:
package com.example.demo.config;import com.example.demo.filter.SecondFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {// ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet@Beanpublic FilterRegistrationBean getFilterRegistrationBean (){// 注册filter组件FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter());// 添加过滤路径bean.addUrlPatterns("/second");return bean;}
}
同样这里访问/second的话/我们要输入true才进行放行,看看是否成功过滤,
OK,这里已经成功实现了!!!