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

  1. Вы можете сохранить свой web.xml, но его нужно добавить

    <listener>
         <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
    </listener> 
    

    в web.xml. И, обязательная зависимость pom.xml.

  2. Все классы слушателей, фильтры преобразуются в класс Java. Этот класс будет @Configuration.

  3. Если у вас есть перехватчик, его можно переместить в класс конфигурации.

Ответ 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

Потратил довольно много времени, чтобы поделиться тремя вещами, которые я помню, чтобы все работало из командной строки.

  1. Самое важное: JSP должны храниться только в папке /src/main/resources/META-INF/resources. больше информации здесь
  2. Убедитесь, что maven при сборке jar учитывает ваши папки /src/main/resources, иначе добавьте эти строки в ваш pom.xml

  <resources>
     <resource>
    	<directory>src/main/resources</directory>   
      </resource>
    </resources>