Spring Boot中的DispatcherServlet和web.xml

问题描述 投票:22回答:4

我目前正在尝试将我的项目从Java EE转移到Spring Boot项目。但是,我对调度程序servlet和web.xml的部分感到困惑和困惑,似乎web.xml不再被项目读取了。当前项目在tomcat 7上运行。

在我的web.xml文件中,我有很多servletservlet-mappingfilterfilter mapping,我真的不明白如何在调度程序中进行映射。

我在下面附上了我的web.xml样本,版本是2.5。

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>displayName</display-name>
  <description>description</description>
  <resource-ref>
    ...
  </resource-ref>
  <filter>
    <filter-name>Some Filter Name</filter-name>
    <filter-class>Some Filter Class</filter-class>
    <init-param>
      <param-name>Some Param Name</param-name>
      <param-value>Some Value</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Some Filter Name</filter-name>
    <url-pattern>Some url-pattern</url-pattern>
  </filter-mapping>
  <context-param>
    <param-name>Some Param Name</param-name>
    <param-value>Some Param Value</param-value>
  </context-param>
  <servlet>
    <servlet-name>Some Servlet Name</servlet-name>
    <servlet-class>Some Servlet Class</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Some Servlet Name</servlet-name>
    <url-pattern>Some Url Pattern</url-pattern>
  </servlet-mapping>
</web-app>

QNS:

  1. 我应该将我的web.xml中的所有东西转换为依赖弹簧调度员,如果是的话我该如何实现呢?
  2. 正在远离web.xml去春季启动项目的方式?

有谁能请我一起指导我?谢谢!!

java spring spring-boot tomcat7 web.xml
4个回答
19
投票
  1. 是的,spring boot不再在xml配置上进行中继,它会自动配置与调度程序servlet的等效项。您可以按照以下链接查看如何注册过滤器:How to add a filter class in Spring Boot?
  2. 如果你使用maven而不是gradle,你的spring boot项目中唯一的XML应该是pom.xml。使用spring boot的方法是将所有xml配置,web.xml等移动到spring boot的自动配置+ java配置。

当您在java配置中执行所有操作并遵循其主体时,Spring启动非常有效。根据我的经验,当你开始合并XML配置和传统的弹簧时,它开始打破自动配置过程,并且更好地尽可能地尝试遵守新的Spring引导最佳实践。


4
投票
  1. 你可以保留你的web.xml,但它需要添加 <listener> <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class> </listener> web.xml。并且,pom.xml需要依赖。
  2. 所有监听器类,过滤器都在Java类中转换。这堂课将是@Configuration.
  3. 如果你有一个拦截器,可以移动到配置类。

1
投票

Spring-boot更喜欢基于xml配置的注释,所以在你的情况下,你可以使用基于注释的自动bean创建来配置web.xmlservlet, servlet-mapping, filter,而不是使用filter mapping来配置bean。为此你需要:

  • 将基于xml的映射转换为基于注释的映射
  • 使用@Bean注释创建bean,以便spring-boot在组件扫描期间自动获取它们。

供参考:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html

  • 要注册过滤器并添加过滤器bean,您可以创建一个类,使用@Configuration@Component注释对其进行注释,并创建FilterRegistrationBean的bean来注册过滤器。您还可以使用@Bean注释在那里创建过滤器本身的bean。

例如,相当于以下基于xml的过滤器

<filter>
  <filter-name>SomeUrlFilter</filter-name>
   <filter-class>com.company.SomeUrlFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SomeUrlFilter</filter-name>
    <url-pattern>/url/*</url-pattern>
    <init-param>
       <param-name>paramName</param-name>
       <param-value>paramValue</param-value>
    </init-param>
</filter-mapping>

基于等效的注释将是:

@Bean
public FilterRegistrationBean someUrlFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(someUrlFilter());
    registration.addUrlPatterns("/url/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("Filter");
    registration.setOrder(1);
    return registration;
} 

@Bean(name = "someUrlFilter")
public Filter someUrlFilter() {
    return new SomeUrlFilter();
}
  • Springboot仍然允许我们使用基于xml的配置,例如,如果你想使用web.xml。例如:

Veb.hml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在另一个文件dispatcher.xml中,您可以创建bean:

<beans ...>

    <context:component-scan base-package="com.demo"/>

    <bean
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

请注意,春天web.xml通常会住在src/main/webapp/WEB-INF

你可以参考:https://www.baeldung.com/register-servlet


0
投票

花了相当长的一段时间,分享三件我记得要从命令行开始工作的东西。

  1. 最重要的是:JSP应该只保存在文件夹/ src / main / resources / META-INF / resources中。 more info here
  2. 确保构建jar时maven正在考虑你的文件夹/ src / main / resources,否则在pom.xml中添加这些行

  <resources>
     <resource>
    	<directory>src/main/resources</directory>   
      </resource>
    </resources>
  1. 在你的mvc配置文件中 @Configuration public class MvcConfig extends WebMvcConfigurerAdapter {@Bean public InternalResourceViewResolver viewResolver(){InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix( “/表示/”); resolver.setSuffix( “JSP。”);返回解析器; }
© www.soinside.com 2019 - 2024. All rights reserved.