1.概述
DispatcherServlet
是Spring Web应用程序中的前端控制器。它用于在Spring MVC中创建Web应用程序和REST服务。在传统的Spring Web应用程序中,此servlet是在web.xml
文件中定义的。
在本教程中,我们将在Spring Boot应用程序web.xml
文件DispatcherServlet
另外,我们还将把来自web.xml
Filter
, Servlet
和Listener
类映射到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,我们将配置CustomFilter
在web.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。
因此,我们将ServletRegistrationBean
类CustomServlet
定义为一个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应用程序中DispatcherServlet
和web.xml
元素,包括filter
, servlet
和listener
。
0 评论