DispatcherServlet и web.xml в Spring Загрузка
В настоящее время я пытаюсь переместить мой проект из Java EE в проект Spring Boot.
Однако, я был застрял и запутался со стороны с диспетчерским сервлетом и 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>
Ответы
Ответ 1
- Да, spring загрузка больше не включается в конфигурацию xml и автоматически настраивает эквивалент сервлета диспетчера. Вы можете перейти по следующей ссылке, чтобы узнать, как регистрировать фильтры: Как добавить класс фильтра в spring Загрузка?
- Если вы используете maven, а не gradle, единственный XML в вашем проекте загрузки spring должен быть
pom.xml
. Путь к загрузке spring перемещает всю вашу конфигурацию xml, web.xml и т.д. В spring загрузочную автоматическую конфигурацию + вашу конфигурацию java.
Spring загрузка работает очень хорошо, когда вы делаете все в конфигурации java и следуете ее принципалам. По моему опыту, когда вы начинаете слияние конфигурации XML и устаревшего spring, он начинает ломать процесс автоматической настройки, и гораздо лучше попробовать как можно больше, чтобы соответствовать новым практикам загрузки spring.
Ответ 2
-
Вы можете сохранить свой web.xml
, но его нужно добавить
<listener>
<listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
</listener>
в web.xml
. И, обязательная зависимость pom.xml
.
-
Все классы слушателей, фильтры преобразуются в класс Java. Этот класс будет @Configuration.
-
Если у вас есть перехватчик, его можно переместить в класс конфигурации.
Ответ 3
Spring-boot предпочитает аннотации над конфигурациями на основе xml, поэтому в вашем случае вместо использования web.xml
для настройки servlet, servlet-mapping, filter
и filter mapping
вы можете использовать автоматическое создание bean-компонентов на основе аннотаций для регистрации bean-компонентов. Для этого вам нужно к:
- Преобразование сопоставлений на основе XML в сопоставления на основе аннотаций
- Создайте bean-компоненты, используя аннотации
@Bean
чтобы spring-boot автоматически брал их во время сканирования компонентов.
Для справки: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html.
- Для регистрации фильтров и добавления фильтрующих компонентов вы можете создать класс, аннотировать его аннотацией
@Configuration
или @Component
и создать bean-компонент FilterRegistrationBean
для регистрации фильтра. Вы также можете создать сами бины фильтра с помощью аннотации @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 вы можете создавать бины как:
<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
обычно будет web.xml
в src/main/webapp/WEB-INF
.
Вы можете обратиться: https://www.baeldung.com/register-servlet
Ответ 4
Потратил довольно много времени, чтобы поделиться тремя вещами, которые я помню, чтобы все работало из командной строки.
- Самое важное: JSP должны храниться только в папке /src/main/resources/META-INF/resources. больше информации здесь
- Убедитесь, что maven при сборке jar учитывает ваши папки /src/main/resources, иначе добавьте эти строки в ваш pom.xml
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>