百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

如何使用Spring Boot注册整合方式整合Servlet三大组件

toyiye 2024-06-21 12:19 13 浏览 0 评论

在Spring Boot中,使用组件注册方式整合内嵌Servlet容器的Servlet、Filter、Listener三大组件时,只需将这些自定义组件通过ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean类注册到容器中即可,这些类相当于将组件配置在web.xml中。

1. 使用组件注册方式整合Servlet

(1)创建自定义Servlet类。在chapter05项目中创建名为com.itheima.servletComponent的包,并在该包下创建一个自定义Servlet类MyServlet,内容如文件1所示。

文件1 MyServlet.java

     import org.springframework.stereotype.Component;
     import javax.servlet.ServletException;
     import javax.servlet.http.*;
     import java.io.IOException;
     /**
      * 自定义Servlet类
     */
     @Component
     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");
         }
     }

文件1中,使用@Component注解将MyServlet类作为组件注入Spring容器。MyServlet类继承自HttpServlet,通过HttpServletResponse对象向页面输出“hello MyServlet”。

(2)创建Servlet组件配置类。在项目com.itheima.config包下创建一个Servlet组件配置类ServletConfig,用来对Servlet相关组件进行注册,内容如文件2所示。

文件2 ServletConfig.java

     import com.itheima.servletComponent.MyServlet;
     import org.springframework.boot.web.servlet.ServletRegistrationBean;
     import org.springframework.context.annotation.Bean;
     import org.springframework.context.annotation.Configuration;
     /**
      * 嵌入式Servlet容器三大组件配置
     */
     @Configuration
     public class ServletConfig {
         // 注册Servlet组件
         @Bean
         public ServletRegistrationBean getServlet(MyServlet myServlet){
             ServletRegistrationBean registrationBean = 
                                          new ServletRegistrationBean(myServlet,"/myServlet");
             return registrationBean;
         }
     }

文件2中,使用@Configuration注解定义了一个Servlet组件配置类ServletConfig,并添加了一个getServlet(MyServlet myServlet)方法,通过组件注册的方式注册自定义的MyServlet组件。在注册自定义的MyServlet组件时,指定了匹配路径为“/myServlet”,并使用@Bean注解将重新组装的ServletRegistrationBean类对象作为Bean组件返回。

启动项目进行测试。项目启动成功后,在浏览器上访问“http://localhost:8080/myServlet”,效果如图1所示。

图1 自定义Servlet组件访问效果

从图1中可以看出,浏览器能够访问myServlet并正常显示数据,说明Spring Boot成功整合了Servlet组件。

2. 使用组件注册方式整合Filter

(1) 创建自定义Filter类。在com.itheima.servletComponent包下创建一个类MyFilter,内容如文件3所示。

文件3 MyFilter.java

     import org.springframework.stereotype.Component;
     import javax.servlet.*;
     import java.io.IOException;
     /**
      *  自定义Filter类
      */
     @Component
     public class MyFilter implements Filter {
         @Override
         public void init(FilterConfig filterConfig) throws ServletException {   }
         @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 destroy() {   }
     }

文件3中,使用@Component注解将当前MyFilter类作为组件注入到Spring容器中。MyFilter类实现Filter接口,并重写了init()、doFilter()和destroy()方法,在doFilter()方法中向控制台打印了“hello MyFilter”字符串。

(1) 向Servlet组件配置类注册自定义Filter类。打开之前创建的Servlet组件配置类ServletConfig,将该自定义Filter类使用组件注册方式进行注册,示例代码如下。

// 注册Filter组件
@Bean
public FilterRegistrationBean getFilter(MyFilter filter){
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
    registrationBean.setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"));
    return registrationBean;
}

上述代码中,使用组件注册方式注册自定义的MyFilter类。在getFilter(MyFilter filter)方法中,使用setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"))方法定义了过滤的请求路径为“/toLoginPage”和“/myFilter”,同时使用@Bean注解将当前组装好的FilterRegistrationBean对象作为Bean组件返回。

完成Filter的自定义配置后启动项目,项目启动成功后,在浏览器上访问“http://localhost:8080/myFilter”查看控制台打印效果(由于没有编写对应路径的请求处理方法,所以浏览器会出现404错误页面,这里重点关注控制台即可),具体如图2所示。

图2 自定义Filter组件访问效果

在图2中,浏览器访问“http://localhost:8080/myFilter”时控制台打印出了自定义Filter中定义的输出语句“hello MyFilter”,这也就说明Spring Boot整合自定义Filter组件成功。

3. 使用组件注册方式整合Listener

(1)创建自定义Listener类。在com.itheima.servletComponent包下创建一个类MyListener,内容如文件4所示。

文件4 MyListener.java

     import org.springframework.stereotype.Component;
     import javax.servlet.ServletContextEvent;
     import javax.servlet.ServletContextListener;
     /**
      *  自定义Listener类
     */
     @Component
     public class MyListener implements ServletContextListener {
         @Override
         public void contextInitialized(ServletContextEvent servletContextEvent) {
             System.out.println("contextInitialized ...");
         }
         @Override
         public void contextDestroyed(ServletContextEvent servletContextEvent) {
             System.out.println("contextDestroyed ...");
         }
     }

文件4中,使用@Component注解将MyListener类作为组件注册到Spring容器中。Listener类实现了ServletContextListener接口,并重写了contextInitialized()和contextDestroyed()方法。

需要说明的是,Servlet容器提供了很多Listener接口,例如ServletRequestListener、HttpSessionListener、ServletContextListener等,我们在自定义Listener类时要根据自身需求选择实现这些接口,这里为了方便演示,直接实现了ServletContextListener接口。

(2)向Servlet组件配置类注册自定义Listener类。打开之前创建的Servlet组件配置类ServletConfig,将该自定义Listener类使用组件注册方式进行注册,示例代码如下。

// 注册Listener组件
@Bean
public ServletListenerRegistrationBean getServletListener(MyListener myListener){
    ServletListenerRegistrationBean registrationBean = 
new ServletListenerRegistrationBean(myListener);
    return registrationBean;
}

上述代码中,使用组件注册方式注册了一个自定义的MyListener类,在getServletListener()方法中,使用了@Bean注解将当前组装好的FilterRegistrationBean对象作为Bean组件返回。

完成自定义Listener组件注册后启动项目,项目启动成功后查看控制台打印效果,效果如图3所示。

图3 自定义Listener组件初始化效果

程序启动成功后,控制台会打印出自定义Listener组件中定义的输出语句“contextInitialized ...”。单击图中的【Exit】按钮关闭当前项目(注意,如果直接单击红色按钮会强制关闭程序,浏览器就无法打印关闭监听信息),再次查看控制台打印效果,效果如图4所示。

图4 自定义Listener组件关闭效果

程序成功关闭后,控制台打印出了自定义Listener组件中定义的输出语句“contextDestroyed ...”。通过效果演示,说明了Spring Boot整合自定义Listener组件成功。

细心的读者可能发现,将自定义的Servlet组件配置类ServletConfig全部注释并重启项目后,自定义的Servlet、Filter、Listener组件仍然生效。出现这种情况的主要原因是:嵌入式Servlet容器对Servlet、Filter、Listener组件进行了自动化识别和配置,而自定义的Servlet、Filter、Listener都继承/实现了对应的类/接口,同时自定义的Servlet、Filter、Listener组件都使用了@Component注解,这些组件会被自动扫描为Spring组件。

使用ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean组件组装配置的根本目的是对一些请求路径和参数进行初始化设置和组装。假设没有组件注册类,那么自定义Servlet虽然生效,但无法确定生效哪个访问路径。自定义的Filter会对所有的请求都进行过滤,不会出现选择性过滤的情况。而自定义的Listener则没有太大影响,因为定制该组件基本不需要设置什么参数。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码