web-dev-qa-db-ja.com

Spring BootのDispatcherServletとweb.xml

現在、プロジェクトをJava EEからSpring Bootプロジェクトに移動しようとしています。ただし、ディスパッチャサーブレットとweb.xmlの部分で困惑して混乱しているため、web.xmlがプロジェクトによって読み取られなくなったようです。現在のプロジェクトはTomcat 7で実行されています。

web.xmlファイルには、servletservlet-mappingfilter、および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:

  1. web.xmlのすべてのものをスプリングディスパッチャーに依存するように変換する必要がありますか?
  2. web.xmlから離れて、スプリングブートプロジェクトに進む方法はありますか?

誰も私をここに沿って案内してもらえますか?ありがとう!!

23
NatureWonder
  1. はい、スプリングブートはxml構成でリレーしなくなり、ディスパッチャサーブレットに相当するものを自動的に構成します。次のリンクをたどって、フィルターの登録方法を確認できます。 Spring Bootでフィルタークラスを追加する方法
  2. Gradleではなくmavenを使用する場合、スプリングブートプロジェクトの唯一のXMLはpom.xmlでなければなりません。スプリングブートを使用する方法は、すべてのxml構成、web.xmlなどをスプリングブートの自動構成+ Java構成に移動することです。

Springブートは、Java構成ですべてを実行し、その原則に従う場合に非常に良好に機能します。私の経験から、XML構成とレガシースプリングのマージを開始すると、自動構成プロセスが中断され始めます。新しいスプリングブートのベストプラクティスに準拠するために、できる限りのことを試してみることをお勧めします。

20
Tom
  1. web.xmlを保持できますが、追加する必要があります

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

    web.xmlで。そして、pom.xmlの必要な依存関係。

  2. すべてのリスナークラス、フィルターはJavaクラスで変換します。このクラスは@Configuration.になります

  3. インターセプターがある場合は、構成クラスに移動できます。

4
Md Jalal

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

  • フィルターの登録とフィルター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では、web.xmlを使用する場合、たとえば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にあることに注意してください。

参照できます: https://www.baeldung.com/register-servlet

1

かなりの時間を費やしたので、3つのことを共有して、コマンドラインから機能するようにしました。

  1. 最も重要なこと:JSPは、/ src/main/resources/META-INF/resourcesフォルダーにのみ保管する必要があります。 詳細はこちら
  2. Jarのビルド中にMavenがフォルダー/ src/main/resourcesを考慮していることを確認してください。そうでない場合は、pom.xmlにこれらの行を追加してください
  <resources>
     <resource>
        <directory>src/main/resources</directory>   
      </resource>
    </resources>
  1. あなたのmvc設定ファイル

    @Configuration public class MvcConfig extends extends WebMvcConfigurerAdapter {@Bean public InternalResourceViewResolver viewResolver(){InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix( "/ Representation /"); resolver.setSuffix( "。jsp");リゾルバを返します。 }

0
Vikky