Springboot笔记<9>使用Javaweb原生组件
使用Javaweb原生组件
Javaweb的三大组件:servlet,Filter,Listener,Servlet 3.0 提供了以下 3 个注解:
- @WebServlet:用于声明一个 Servlet;
- @WebFilter:用于声明一个 Filter;
- @WebListener:用于声明一个 Listener。
原生组件注册
注解方法
在主类上添加@ServletComponentScan(“具体的包”)『@ServletComponentScan(basePackages = "com.top.springbootreview.webComponent")』可以不用在原生组件上面添加原生的组件注释(@WebServlet(),@WebFilter(),@WebListener)。如果只主类上添加@ServletComponentScan需要在原生组件类上添加原生组件注解@WebServlet(),@WebFilter(),@WebListener。**
使用 RegistrationBean 注册
我们可以在配置类中,使用 @Bean 注解将 ServletRegistrationBean、FilterRegistrationBean 和 ServletListenerRegistrationBean 添加 Spring 容器中,并通过它们将我们自定义的 Servlet、Filter 和 Listener 组件注册到容器中使用。使用方式见下文。
servlet
@Slf4j
@WebServlet("/sayHello")
public class SayHelloHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("SayHelloHttpServlet -> doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SayHelloHttpServlet -> doPost");
}
}
Filter
@WebFilter(urlPatterns="/*", filterName = "myFilterByAnnotation")
@Order(value = 3)
public class MyFilterByAnnotation implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("myFilterByAnnotation提示:服务启动..........");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("myFilterByAnnotation提示:调用过滤器Filter的doFilter()方法..........");
System.out.println("ip地址为"+servletRequest.getRemoteAddr());
//放行通过
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("myFilterByAnnotation提示:服务关闭..........");
}
}
Listener
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("MyListener 监听到 ServletContext 初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("MyListener 监听到 ServletContext 销毁");
}
}
//项目启动时输出了MyListener 监听到 ServletContext 初始化
不使用@WebListener @WebServlet("/sayHello")注解,使用 RegistrationBean 注册:
启动后访问/sayHello2,控制台打印webComponent.SayHelloHttpServlet2 : SayHelloHttpServlet -> doGet
同时会有两个MyListener ,输出为:
MyListener 监听到 ServletContext 初始化
MyListener 监听到 ServletContext 初始化
@Slf4j
public class SayHelloHttpServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("SayHelloHttpServlet -> doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SayHelloHttpServlet -> doPost");
}
}
public class MyListener2 implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("MyListener 监听到 ServletContext 初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("MyListener 监听到 ServletContext 销毁");
}
}
@Controller
@Slf4j
public class WebComponentToIOC {
@Bean
public ServletRegistrationBean servletRegistrationBean() {
SayHelloHttpServlet2 myServlet = new SayHelloHttpServlet2();
return new ServletRegistrationBean(myServlet, "/sayHello2");
}
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean() {
MyListener myListener = new MyListener();
return new ServletListenerRegistrationBean(myListener);
}
}
未经作者同意请勿转载
本文来自博客园作者:aixueforever,原文链接:https://www.cnblogs.com/aslanvon/p/15770086.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具