拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Spring Boot中的DispatcherServlet和web.xml

Spring Boot中的DispatcherServlet和web.xml

白鹭 - 2021-11-24 1143 0 0

1.概述

DispatcherServlet是Spring Web应用程序中的前端控制器。它用于在Spring MVC中创建Web应用程序和REST服务。在传统的Spring Web应用程序中,此servlet是在web.xml文件中定义的。

在本教程中,我们将在Spring Boot应用程序web.xml文件DispatcherServlet另外,我们还将把来自web.xml FilterServletListener类映射到Spring Boot应用程序。

2. Maven依赖

首先,我们必须将spring-boot-starter-web Maven依赖项添加到我们的pom.xml文件中:

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-web</artifactId>

 </dependency>

3. DispatcherServlet

DispatcherServlet接收所有HTTP请求并将它们委托给控制器类。

**在Servlet 3.x规范之前, DispatcherServlet将在Spring MVC应用程序web.xml**从Servlet 3.x规范开始,我们可以使用ServletContainerInitializer编程方式注册servlet。

让我们在web.xml文件中查看DispatcherServlet示例配置:

<servlet>

 <servlet-name>dispatcher</servlet-name>

 <servlet-class>

 org.springframework.web.servlet.DispatcherServlet

 </servlet-class>

 </servlet>



 <servlet-mapping>

 <servlet-name>dispatcher</servlet-name>

 <url-pattern>/</url-pattern>

 </servlet-mapping>

Spring Boot提供了spring-boot-starter-web库,用于使用Spring MVC开发Web应用程序。 Spring Boot的主要功能之一是自动配置。 Spring Boot自动配置会自动注册并配置DispatcherServlet 。因此,我们不需要手动DispatcherServlet

默认情况下, spring-boot-starter-web starter将DispatcherServlet配置为URL模式“ /”。因此,我们不需要在web.xml文件中为上述DispatcherServlet示例完成任何其他配置。但是,我们可以使用server.servlet. *在application.properties文件中:

server.servlet.context-path=/demo

 spring.mvc.servlet.path=/baeldung

通过这些定制,将DispatcherServlet配置为处理URL模式/baeldung ,并且根contextPath将为/demo 。因此, DispatcherServlet监听http://localhost:8080/demo/baeldung/.

4.应用程序配置

Spring MVC Web应用程序将web.xml文件用作部署描述符文件。同样,它在URL.path和web.xml文件中的servlet之间定义了映射。

Spring Boot不再是这种情况。如果需要特殊的过滤器,可以在Java类配置中注册它。 web.xml文件包括过滤器,servlet和侦听器。

当我们想从传统的Spring MVC迁移到现代的Spring Boot应用程序时,如何将web.xml移植到新的Spring Boot应用程序?在Spring Boot应用程序中,我们可以通过几种方式添加这些概念。

4.1。注册Filter

让我们通过实现Filter接口来创建一个过滤器:

@Component

 public class CustomFilter implements Filter {



 Logger logger = LoggerFactory.getLogger(CustomFilter.class);



 @Override

 public void init(FilterConfig filterConfig) throws ServletException {



 }



 @Override

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

 throws IOException, ServletException {

 logger.info("CustomFilter is invoked");

 chain.doFilter(request, response);

 }



 // other methods

 }

如果没有Spring Boot,我们将配置CustomFilterweb.xml文件中:

<filter>

 <filter-name>customFilter</filter-name>

 <filter-class>CustomFilter</filter-class>

 </filter>



 <filter-mapping>

 <filter-name>customFilter</filter-name>

 <url-pattern>/*</url-pattern>

 </filter-mapping>

为了使Spring Boot能够识别过滤器,我们只需要使用@Component注释将其定义为bean。

4.2。注册一个Servlet

让我们通过扩展HttpServlet类来定义一个servlet:

public class CustomServlet extends HttpServlet {



 Logger logger = LoggerFactory.getLogger(CustomServlet.class);



 @Override

 protected void doGet(

 HttpServletRequest req,

 HttpServletResponse resp) throws ServletException, IOException {

 logger.info("CustomServlet doGet() method is invoked");

 super.doGet(req, resp);

 }



 @Override

 protected void doPost(

 HttpServletRequest req,

 HttpServletResponse resp) throws ServletException, IOException {

 logger.info("CustomServlet doPost() method is invoked");

 super.doPost(req, resp);

 }

 }

如果没有Spring Boot,我们将在web.xml文件中CustomServlet

<servlet>

 <servlet-name>customServlet</servlet-name>

 <servlet-class>CustomServlet</servlet-class>

 </servlet>



 <servlet-mapping>

 <servlet-name>customServlet</servlet-name>

 <url-pattern>/servlet</url-pattern>

 </servlet-mapping>

在Spring Boot应用程序中,该servlet被注册为Spring @Bean或通过@WebServlet注释的类。

使用Spring @Bean方法,我们可以使用ServletRegistrationBean类来注册servlet。

因此,我们将ServletRegistrationBeanCustomServlet定义为一个bean:

@Bean

 public ServletRegistrationBean customServletBean() {

 ServletRegistrationBean bean = new ServletRegistrationBean(new CustomServlet(), "/servlet");

 return bean;

 }

4.3。注册Listener

让我们通过扩展ServletContextListener类来定义一个侦听器:

public class CustomListener implements ServletContextListener {



 Logger logger = LoggerFactory.getLogger(CustomListener.class);



 @Override

 public void contextInitialized(ServletContextEvent sce) {

 logger.info("CustomListener is initialized");

 }



 @Override

 public void contextDestroyed(ServletContextEvent sce) {

 logger.info("CustomListener is destroyed");

 }

 }

如果没有Spring Boot,我们将在web.xml文件中CustomListener

<listener>

 <listener-class>CustomListener</listener-class>

 </listener>

要在Spring Boot应用程序中定义侦听器,我们可以使用*@Bean@WebListener*批注。

使用Spring @Bean方法,我们可以使用ServletListenerRegistrationBean类注册Listener

因此,让我们ServletListenerRegistrationBean CustomListener定义为一个bean。 班级:

@Bean

 public ServletListenerRegistrationBean<ServletContextListener> customListenerBean() {

 ServletListenerRegistrationBean<ServletContextListener> bean = new ServletListenerRegistrationBean();

 bean.setListener(new CustomListener());

 return bean;

 }

启动我们的应用程序后,我们可以检查日志输出以查看是否已成功初始化侦听器的确认:

2020-09-28 08:50:30.872 INFO 19612 --- [main] c.baeldung.demo.listener.CustomListener: CustomListener is initialized

5.结论

在本快速教程中,我们了解了如何在Spring Boot应用程序中DispatcherServletweb.xml元素,包括filterservletlistener

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *