1

TL;DR: 私は単純な Tomcat/Spring/Freemarker webapp を作成していますが、Spring の DispatcherServlet を<mvc:resources...>構成に合わせるのに苦労しているようです。

注意してください:他の回答で与えられた解決策を試したので、これは他の質問の複製ではありません。誰かが既存の質問を見つけ、その質問が私が見逃した解決策を提供する場合、喜んで VTC を複製します (または、必要に応じてこの質問を削除します)。

Freemarker に基づく非常に単純な webapp があります。その部分はうまく機能しています。すべてのリクエスト ( ) を処理する単一のリクエスト ハンドラ メソッドがありますが、この機能を使用して@RequestMapping("/**")静的リソースを提供したいと考えています。リソースは、最上位の webapp ディレクトリのサブディレクトリにあります。/${contextPath}/static/...<mvc:resources.../>

SOに関する他の質問を読んだことに基づいて、追加しました

<mvc:resources mapping="/static/**" location="/" /> 

私のSpring構成に。

何をしても、静的リソース ファイルとして解決されると予想されるリクエストは、代わりにコントローラーのリクエスト ハンドラー メソッドに送信されます。私が考えることができる唯一のことは、@RequestMapping注釈が よりも優先されるmvc:resourcesということですが、それはあまり意味がありません。

リソース URL が正しく生成されていることを確認しました。つまり、テンプレート行です。

<link rel="stylesheet" href="${contextPath}/static/css/gallery.css">

生成する

<link rel="stylesheet" href="/gallery/static/css/gallery.css">

リクエストはTomcatサーバーによって受信されており、間違った場所にルーティングされています.

私はこの主題に関する SO に関するほとんどの質問を読んだことがあり、正しくやっていると信じています (たとえば、Trying to get mvc resources to serve my static resources を参照してください)。

環境

  • エクリプス ルナ
  • Java 8
  • トムキャット 8
  • フリーマーカー 2.3.23
  • 春 4.2.0
  • ウィンドウズ 7 SP1

デプロイされたレイアウト

標準の Java EE Tomcat ディレクトリ構造

webapps
 |- gallery
     |- css
     |- images
     |- js
     |- META-INF
     |- WEB-INF
         |- classes
         |- lib
         |- views

Tomcat コンテキスト定義

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\dev\tools\apache-tomcat-8.0.24\wtpwebapps\gallery" 
         path="/gallery" reloadable="true" 
         source="org.eclipse.jst.j2ee.server:gallery"/>

Spring サーブレット構成

WEB-INF/main-servlet.xml

...
<mvc:resources mapping="/static/**" location="/" />
<mvc:annotation-driven/>
<context:component-scan base-package="com.mysite.gallery"/>
...

これらのステートメントの可能な順序をすべて試しましたが、効果がないようです。私も追加してみました

<mvc:default-servlet-handler/>

効果なし。

WEB-INF/web.xml

標準の Spring MVC DispatcherServlet 構成

  ...
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
      <servlet-name>main</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>main</servlet-name>
      <url-pattern>/*</url-pattern>
  </servlet-mapping>
  ...

RequestMapping メソッド

...
@RequestMapping("/**")
public String gallery(ModelMap modelMap, HttpServletRequest req, HttpServletResponse resp)
{
    etc...

フリーマーカー テンプレート

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="${contextPath}/static/css/photoswipe.css">
    <link rel="stylesheet" href="${contextPath}/static/css/default-skin/default-skin.css">
    <link rel="stylesheet" href="${contextPath}/static/css/gallery.css">
    <script src="${contextPath}/static/js/photoswipe.min.js"></script>
    <script src="${contextPath}/static/js/photoswipe-ui-default.min.js"></script>
  </head>
  <body>
    <div>
...
4

1 に答える 1

3

あなたはあなたの質問で答えを出しました:私が考えることができる唯一のことは、 @RequestMapping アノテーションが mvc:resources よりも優先されるということですが、それはあまり意味がありません.

意味がないと思うかもしれませんが、少なくともデフォルトでは、Spring の仲間がそうあるべきだと判断した方法です...

ただし、静的リソースが@RequestMapping注釈付きコントローラーで優先されるには、さまざまな方法があります。

最も簡単な方法は、タグ"order=0"に属性を追加することです:<mvc:resources.../>

<mvc:resources mapping="/static/**" location="/" order="0"/>

前に WEB-INF/main-servlet.xml に記述します。<mvc:annotation-driven/>

私はSpring 3.2.4でテストしましたが、あなたが望むように動作します. しかし、設計されていない場所でスプリング フレームワークを実行しているように見えるため、他のバージョンで動作することは保証できません。


ディスパッチャ サーブレットを/の代わりに にマップすることもできます/*。そうすれば、サーブレット コンテナーによって直接提供できるすべての静的リソース (および JSP) が提供されます。そのマッピングに関する主な注意点は、ルートが Spring ディスパッチャー サーブレットによって提供されなくなることです。考えられる回避策の 1 つ/homeは、ルート コントローラーの URL を使用し、ウェルカム ファイルを web xml に配置することです。

<servlet>
  <servlet-name>main</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

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

<welcome-file-list>
    <welcome-file>/home</welcome-file>
</welcome-file-list>

そうすれば、を使用する必要さえなく、/ を使用する/mappings/images/img.gifだけ/images/img.gifです。

しかし、私が常に受け入れてきた別の警告があります (回避策が見つからなかったため): /url1 つのコントローラーによって処理された場合、/url.jspまたは/url.jpeg404 エラーが発生します。コンテナのデフォルト サーブレットはファイル.jpegまたは.jspファイルについて認識しているため、リクエストをキャッチして失敗します。

于 2015-08-12T11:53:12.080 に答える