Spring Boot 中的 DispatcherServlet 和 web.xml
DispatcherServlet and web.xml in Spring Boot
我目前正在尝试将我的项目从 Java EE 移动到 Spring Boot 项目。
但是,我一直对调度程序 servlet 和 web.xml 感到困惑和困惑,似乎 web.xml 不再被项目读取。当前项目是 运行 tomcat 7.
在我的 web.xml
文件中,我有很多 servlet
、servlet-mapping
、filter
和 filter 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:
- 我是否应该将
web.xml
中的所有内容转换为依赖 spring 调度程序,如果是,我该如何实现?
- 离开
web.xml
是 spring 引导项目的方式吗?
有人可以指导我吗?谢谢!!
- 是的,spring 启动不再依赖于 xml 配置,它会自动配置一个等同于调度程序 servlet 的配置。您可以按照以下link查看如何注册您的过滤器:如何在Spring Boot中添加过滤器class?
- 如果您使用 Maven 而不是 gradle,您的 spring 引导项目中唯一的 XML 应该是
pom.xml
。使用 spring 引导的方法是将所有 xml 配置、web.xml 等移动到 spring 引导的自动配置 + 您的 java 配置。
Spring 当您在 java 配置中执行所有操作并遵循其原则时,引导工作非常好。根据我的经验,当你开始合并 XML 配置和遗留 spring 时,它开始破坏自动配置过程,最好尽可能多地尝试遵守新的 [=27] =] 引导最佳实践。
你可以保留你的web.xml
,但需要加上
<listener>
<listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
</listener>
在 web.xml
中。并且,需要 pom.xml
.
的依赖
所有侦听器 classes,过滤器在 Java class 中转换。这个 class 将是 @Configuration.
如果您有拦截器,可以将其移动到配置 class。
Spring-boot 比基于 xml 的配置更喜欢注释,因此在您的情况下而不是使用 web.xml
配置 servlet, servlet-mapping, filter
和 filter mapping
,您可以使用基于注释的自动 bean 创建来注册您需要的 beans.For:
- 将基于 xml 的映射转换为基于注释的映射
- 使用
@Bean
注释创建 bean,这样 spring-boot 将在组件扫描期间自动占用它们。
供参考:
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
- 对于注册过滤器和添加过滤器 beans 你可以创建一个 class 用
@Configuration
或 @Component
注释注释它并创建 bean FilterRegistrationBean
来注册 filter.You 也可以通过使用 @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
。例如:
Web.xml
<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>
请注意 Spring web.xml
通常住在 src/main/webapp/WEB-INF
。
花了相当多的时间来分享我记得的三件事,以使其从命令行运行。
- 最重要的是:JSP 应仅保存在文件夹 /src/main/resources/META-INF/resources 中。 more info here
- 确保 maven 在构建 jar 时正在考虑您的文件夹 /src/main/resources,否则将这些行添加到您的 pom.xml
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
在你的 mvc 配置文件中
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/Representation/");
resolver.setSuffix(".jsp");
return resolver;
}
我目前正在尝试将我的项目从 Java EE 移动到 Spring Boot 项目。 但是,我一直对调度程序 servlet 和 web.xml 感到困惑和困惑,似乎 web.xml 不再被项目读取。当前项目是 运行 tomcat 7.
在我的 web.xml
文件中,我有很多 servlet
、servlet-mapping
、filter
和 filter 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:
- 我是否应该将
web.xml
中的所有内容转换为依赖 spring 调度程序,如果是,我该如何实现? - 离开
web.xml
是 spring 引导项目的方式吗?
有人可以指导我吗?谢谢!!
- 是的,spring 启动不再依赖于 xml 配置,它会自动配置一个等同于调度程序 servlet 的配置。您可以按照以下link查看如何注册您的过滤器:如何在Spring Boot中添加过滤器class?
- 如果您使用 Maven 而不是 gradle,您的 spring 引导项目中唯一的 XML 应该是
pom.xml
。使用 spring 引导的方法是将所有 xml 配置、web.xml 等移动到 spring 引导的自动配置 + 您的 java 配置。
Spring 当您在 java 配置中执行所有操作并遵循其原则时,引导工作非常好。根据我的经验,当你开始合并 XML 配置和遗留 spring 时,它开始破坏自动配置过程,最好尽可能多地尝试遵守新的 [=27] =] 引导最佳实践。
你可以保留你的
web.xml
,但需要加上<listener> <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class> </listener>
在
web.xml
中。并且,需要pom.xml
. 的依赖
所有侦听器 classes,过滤器在 Java class 中转换。这个 class 将是
@Configuration.
如果您有拦截器,可以将其移动到配置 class。
Spring-boot 比基于 xml 的配置更喜欢注释,因此在您的情况下而不是使用 web.xml
配置 servlet, servlet-mapping, filter
和 filter mapping
,您可以使用基于注释的自动 bean 创建来注册您需要的 beans.For:
- 将基于 xml 的映射转换为基于注释的映射
- 使用
@Bean
注释创建 bean,这样 spring-boot 将在组件扫描期间自动占用它们。
供参考: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
- 对于注册过滤器和添加过滤器 beans 你可以创建一个 class 用
@Configuration
或@Component
注释注释它并创建 beanFilterRegistrationBean
来注册 filter.You 也可以通过使用 @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
。例如:
Web.xml
<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>
请注意 Spring web.xml
通常住在 src/main/webapp/WEB-INF
。
花了相当多的时间来分享我记得的三件事,以使其从命令行运行。
- 最重要的是:JSP 应仅保存在文件夹 /src/main/resources/META-INF/resources 中。 more info here
- 确保 maven 在构建 jar 时正在考虑您的文件夹 /src/main/resources,否则将这些行添加到您的 pom.xml
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
在你的 mvc 配置文件中
@Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/Representation/"); resolver.setSuffix(".jsp"); return resolver; }