web-dev-qa-db-ja.com

Springを使用して、web.xmlでルートにマッピングすると、静的リソースが見つかりません

私がやろうとしているのは、リクエストをサーブレットのルートにマップすることです(正しい用語ですか?)。私はURLが正しいビューにマップされていますが、ページの一部であるすべての静的コンテンツ(css、javascript、images)が見つかりません。

だから私のweb.xmlでは、サーブレットタグは次のようになります

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

私のコントローラーは次のようになります。

@RequestMapping("/shop")
public class TheShopController extends MyBaseController {

    public static String VIEW = "Tile.Shop";

    @Override
    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) {
        ModelAndView mav = new ModelAndView(VIEW);
        return mav;
    }

}

MyBaseControllerは非常にシンプルです。次のようになります。

public abstract class MyBaseController extends AbstractController {

    protected Logger log = Logger.getLogger(getClass());

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) 
        throws Exception {

        ModelAndView mav = processRequest(req, resp);
        return mav;
    }

    protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp);
}

ビューレイヤーでタイルを使用しています。私の構成は次のとおりです。

/WEB-INF/tiles-defs.xml

前述したように、ビューは見つかりましたが、ページのポートである静的リソースは見つかりません。一般的なログアウト出力を次に示します。

2010-01-24 17:25:01,777 DEBUG [http-8080-7] servlet.DispatcherServlet(DispatcherServlet.Java:690)-「/springapp/static/css/account.css」のGETリクエストを処理する「springapp」という名前のDispatcherServlet ] 2010-01-24 17:25:01,778警告[http-8080-4] servlet.DispatcherServlet(DispatcherServlet.Java:962)-URI [/springapp/static/css/shop.css]のHTTP要求のマッピングが見つかりません「springapp」という名前のDispatcherServletで2010-01-24 17:25:01,778 DEBUG [http-8080-6] servlet.FrameworkServlet(FrameworkServlet.Java:677)-正常に完了したリクエスト2010-01-24 17:25:01,778 WARN [http-8080-5] servlet.DispatcherServlet(DispatcherServlet.Java:962)-「springapp」という名前のDispatcherServletで、URI [/springapp/static/css/offers.css]のHTTP要求のマッピングが見つかりませんでした2010-01-24 17:25:01,778 WARN [http-8080-3] servlet.DispatcherServlet(DispatcherServlet.Java:962)-名前がDispatcherServletのURI [/springapp/static/css/scrollable-buttons.css]のHTTP要求のマッピングが見つかりませんスプリngapp '

http:// localhost:8080/springapp/shop に移動すると正常に動作しますが、CSSと画像が欠落しています。

Tilesを使用することは何らかの形で複雑になると思いますが、それを取り除くのは嫌です。ビュー解像度の設定を調整する必要があるのか​​どうかを考える必要がありますか?ビューリゾルバをチェーンする必要がありますか?それを経験した。

29
richever

問題は、<url-pattern>/</url-pattern>としてマップされているため、静的コンテンツのリクエストがdispatcherServletに送られることです。これは、「RESTful」URLを使用する(つまり、DispatcherServletマッピングにプレフィックスがない)アプリケーションで非常に一般的な問題です。

この問題を解決する方法はいくつかあります。


Spring 3.x以降の静的リソースへの好ましいアクセス方法は、<mvc:resources>web.xmlを使用することです。

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

Spring config:

<!-- Handles GET requests for /resources/** by efficiently serving static content 
    in the ${webappRoot}/resources dir --> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

MVC Simplifications in Spring も参照してください


1。 URL書き換えフィルターを使用する
_mvc-basicの例を参照してください here

2。 defaultサーブレットのプレフィックスを設定します:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

つまり、/static/images/image.pngを要求すると/images/image.pngという名前のファイルが返されますが、この方法は異なるサーブレットコンテナ間で互換性がありません(Jettyでは機能しません)。回避策を参照してください here

3。 defaultサーブレットの静的コンテンツ拡張機能を設定します:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

4。 RESTful URLを使用せず、接頭辞付きのURLを使用します:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>

5。 RESTful URLを使用しないで、拡張子のあるURLを使用してください:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>
61
axtavt

これの使用を検討した人はいましたか?

<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
<mvc:default-servlet-handler/>

ここに最新の春のドキュメントがあります: http://static.springsource.org/spring/docs/3.1.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc -default-servlet-handler

5
Solubris

提案されたソリューション番号(2、サーブレットコンテナごとに異なる動作をするデフォルトサーブレット)の代替として、Resource Servletorg.springframework.js.resource.ResourceServlet)Spring Webflowプロジェクトから。

詳細については、 Spring MVCで静的コンテンツを処理する方法 をご覧ください。

4
ngeek

私は同じ問題を抱えていますが、春を使用する代わりに、私のようなスタートページにルートをリダイレクトする小さなフィルターをmyseflします:

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String pageName = req.getServletPath();

    if(pageName.equals("/")) {
        res.sendRedirect( req.getContextPath() + "/start" );
    } else {
        chain.doFilter(request, response);
    }

それはたぶんトリックですが、小さなコードでうまく動作するように見えます。フィルター情報の詳細については、こちらをご覧ください http://www.Oracle.com/technetwork/Java/filters-137243.html

1
Nereis