29

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

したがって、私の 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 WARN [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) - 名前が「springapp」の DispatcherServlet で、URI [/springapp/static/css/scrollable-buttons.css] の HTTP リクエストのマッピングが見つかりません

http://localhost:8080/springapp/shopに アクセスすると問題なく動作しますが、css と画像がありません。

タイルを使用すると複雑になると思いますが、それを取り除くのは気が進まないです。ビュー解像度の構成を調整する必要があるかどうか疑問に思っています。ビュー リゾルバーをチェーンすることでしょうか?それをした経験があります。

4

4 に答える 4

61

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

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


Spring 3.x 以降、静的リソースにアクセスするための推奨される方法は、<mvc:resources>: web.xmlを使用することです。

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

春の設定:

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

Spring 3 での MVC の簡素化も参照してください。


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

default2.サーブレットのプレフィックスを設定します。

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

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

default3.サーブレットの静的コンテンツ拡張を設定します。

<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>
于 2010-01-25T02:56:12.690 に答える
5

これを使用することを検討した人はいますか:

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

これに関する最新の春のドキュメントは次のとおりです 。 -ハンドラ

于 2012-09-04T13:35:12.193 に答える
4

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

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

于 2010-04-21T12:38:14.807 に答える
1

私は同じ問題を抱えていますが、春を使用する代わりに、次のようにルートをスタートページにリダイレクトする小さなフィルターを 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を参照してください。

于 2012-07-09T07:25:55.063 に答える