一、前言
此篇文章是使用路径扫描方式对Servlet三大组件进行整合,是在上一篇文章 SpringBoot整合Servlet三大组件(Servlet、Filter、Listener)[使用组件注册方式]修改的,这样做的目的在于可以形成一个明显的对比。
二、注释掉ServletConfig.java文件
注释掉的原因在于避免与之前编写的使用组件注册的方式相互干扰。
//
//import com.itheima.servletComponent.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.Arrays;
//
创建组件配置类 嵌入式servlet容器三大组件
//
//@Configuration //使用此注解将ServletConfig类标注为配置类
//public class ServletConfig {
注册servlet组件
// @Bean
// public ServletRegistrationBean getServlet(MyServlet myServlet){
此方法用于注册自定义的Myservlet,并返回ServletRegistrationBean类型的bean对象
// ServletRegistrationBean registrationBean =
// new ServletRegistrationBean(myServlet,"/myServlet");
// return registrationBean;
// }
注册Filter组件
// @Bean
// public FilterRegistrationBean getFilter(MyFilter filter){
// FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
// registrationBean.setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"));//使用此方法定义了过滤的请求路径为"/toLoginPage","/myFilter"
// return registrationBean; //将当前组装好的FilterRegistrationBean对象作为Bean对象返回
// }
注册Listener组件
// @Bean
// public ServletListenerRegistrationBean getServletListener(MyListener myListener){
// ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(myListener);
// return registrationBean;
// }
//}
三、开始修改
进入自定义Servlet类MyServlet.java将@Component注释掉,并换成@WebServlet("/myServlet")注解
import org.springframework.stereotype.Component;
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;
/*
* 使用组件注册方式整合Servlet
* */
//@Component //使用次注解将MyServlet类作为组件注入Spring容器
@WebServlet("/myServlet") //使用此注解来映射/annotationServlet请求的Servlet类
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello MyServlet"); //向页面输出
}
}
进入自定义Filter类MyFilter.java将@Component注释掉,并换成@WebFilter(value = {"/toLogin","/MyFilter"})注解
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@Component //使用该注解将当前MyFilter类作为组件注入到Spring容器中
@WebFilter(value = {"/toLogin","/MyFilter"}) //使用此注解来映射"/antionLogin","antionMyFilter"请求的Filter类
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Hello MyFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
进入自定义Listener类MyListener.java将@Component注释掉,并换成@WebFilter(value = {"/toLogin","/MyFilter"})注解
import org.springframework.stereotype.Component;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//自定义Listener类
//@Component
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized监听中");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed监听注销了");
}
}
四、访问测试
启动程序,之后浏览器访问http://localhost:8080/myServlet看是否出现下图效果
之后查看控制台是否打印出现如下效果,如出现则说明监听成功
然后在访问http://localhost:8080/MyFilter并查看控制台是否打印Hello MyFilter,如打印则说明过滤器也成功了
最后按下控制台左侧旁的exit图标,出现“contextDestroyed监听注销了“字符串则说明监听程序退出成功