3

ケース1

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

ケース 2

  <servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

ケース 1 を使用すると、 でスタイル設定されたページは取得できませんが、<link rel="stylesheet" type="text/css" href="${contextPath}/assets/styles.css" />ケース 2 を使用すると、すべてがスタイル設定されます。

誰かが理由を理解するのを手伝ってくれますか?

また、拡張機能について心配する必要がないように、どのパターンを使用する必要があるか教えてもらえますか? を使用する必要があり/*ますか?問題は、アプリケーションの開発中/*に使用していたときに今使用*.doすると、スタイルだけでなく、画像がレンダリングされず、JCaptcha もリンクに関係するすべてのものが壊れているように見えることです。

また、REST クライアントから GET リクエストを送信しようとしてhttp://localhost:8080/myapp/user/1もうまくいかず.do、最後に追加して同じリクエストを送信する必要がありますhttp://localhost:8080/myapp/user/1.do

ありがとう。

4

2 に答える 2

4

ブラウザーは、CSS ファイル、JS ファイル、画像などのリンクされたリソースに対して個別の HTTP 要求を送信します。これらのリクエストの URL も の URL パターンと一致します/。したがって、myappサーブレットはそれらのリクエストでも呼び出されます。ただし、myappサーブレットはそれらを適切に処理していないように見えるため、これらのリクエストはまったく異なるものを返します。これらのリソースを自分で個別にリクエストして、サーブレットが実際に Web ブラウザーに返すものを確認してください。

http://localhost:8080/myapp/assets/styles.css

あなたの場合、myappサーブレットがそれらのリソースに対するリクエストを無視できるようにします。最善の方法は、それを行うフィルターを作成することです。これらのリソースがすべて というフォルダーにあると仮定すると/assets、より具体的な URL パターンにサーブレットをマッピングすることでこれを/myapp/*実現Filterできます/*/assetsは、他のすべてのリクエストを にディスパッチします/myapp

というわけで、この構成

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

フィルターの次のものと組み合わせてdoFilter():

String uri = ((HttpServletRequest) request).getRequestURI();
if (uri.startsWith("/assets")) {
    chain.doFilter(request, response); // Goes to container's default servlet.
} else {
    request.getRequestDispatcher("/myapp" + uri).forward(request, response);
}

あなたのために働くはずです。

于 2011-07-03T16:43:51.357 に答える
3

Oracle J2EE チュートリアルの関連ページは次のとおりです

このページではいくつかの例を示し、読者にサーブレットの仕様を紹介します。

一般的なサーブレット マッピングの規則や規則など、サーブレット マッピングの詳細については、http ://www.jcp.org/aboutJava/communityprocess/final/jsr053/ でサーブレット 2.3 仕様のセクション 11 を参照してください。

仕様は一読の価値がありますが、PDF をダウンロードするには [同意する] をクリックする必要があるため、直接リンクすることはできません。


仕様の要約は、次のルールが (順番に) 使用されるということです。

  1. 完全一致を実行しようとします。
  2. プレフィックスの一致を試みます。プレフィックスが最も長い一致が優先されます。
  3. サフィックスの一致を試みます。
  4. 「コンテナは、要求されたリソースに適したコンテンツを提供しようとします。アプリケーションに「デフォルト」のサーブレットが定義されている場合は、それが使用されます。」
于 2011-07-03T11:51:03.020 に答える