私がやろうとしているのは、リクエストをサーブレットのルートにマップすることです(正しい用語ですか?)。私は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を使用することは何らかの形で複雑になると思いますが、それを取り除くのは嫌です。ビュー解像度の設定を調整する必要があるのかどうかを考える必要がありますか?ビューリゾルバをチェーンする必要がありますか?それを経験した。
問題は、<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>
これの使用を検討した人はいましたか?
<!-- 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
提案されたソリューション番号(2、サーブレットコンテナごとに異なる動作をするデフォルトサーブレット)の代替として、Resource Servlet(org.springframework.js.resource.ResourceServlet
)Spring Webflowプロジェクトから。
詳細については、 Spring MVCで静的コンテンツを処理する方法 をご覧ください。
私は同じ問題を抱えていますが、春を使用する代わりに、私のようなスタートページにルートをリダイレクトする小さなフィルターを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