2

最初に JSP ページへのすべてのリクエストをサーブレットで処理したいと考えています。サーブレットは、要求された JSP に応じてサーバー側の変数を設定するために使用されます。

たとえば、url:example.com/index.jsp を指定すると、サーブレットは最初に要求された JSP (index.jsp) を解析して要求を処理し、要求されたインデックスに固有の変数を設定します。 jsp (を使用request.setAttribute) を実行し、実際の index.jsp (例: /WEB-INF/index.jsp) にディスパッチします。JSP には、必要な正しい変数が含まれます。

これまでの問題は、サーブレットのマッピング パターンとして「/ * 」を使用していることです。これはリクエストを処理し、requestDispatcher.forward("/WEB-INF/index.jsp")これが「/*」パターンにも一致するため、無限ループに陥る which を使用します。

サーブレットは要求された URL をどのように処理する必要がありますか? web.xml のマッピング パターンとして何を使用すればよいですか?

このための標準設定はありますか?すべての JSP の前処理をセットアップするための「ベスト プラクティス」の方法を探しています。

4

1 に答える 1

1

/*そもそもサーブレットURLパターンの奇妙な選択です。これは通常、フィルターによってのみ使用されます。サーブレットはデフォルトで呼び出されます。つまり、フォワードとインクルードでも呼び出されますが、フィルターは呼び出されません。を使用すると、転送中に呼び出されるはず/*のコンテナの組み込みが完全に上書きされます。JspServlet*.jsp

/pages/*むしろ、、、、、などの/app/*より具体的なURLパターンを使用して*.doください*.html

プレフィックスサーブレットマッピングを使用する場合、たとえば/pages/*URLから余分なパスを非表示にする場合は、プレフィックスサーブレットマッピングをそのままにして、他のすべてのリソースを共通のパスに配置する必要があります(通常はCSSなどの静的リソースのみです)。 / JS / images)そして、それがリソース要求であるかどうかをチェックする追加のフィルターを作成し、そうである場合はチェーンを続行するか、そうでない場合はサーブレットに転送します。これはURLを変更しません。次に、サーブレットは安全にJSPに転送できます。

/pages/*これは、サーブレットがマップされ、サーブレットによって処理されるべきではないすべての(静的)リソースがフォルダーに配置されていると仮定した例です/resources(JSPを保持するだけで/WEB-INF、その部分を変更する必要はありません。フォワードはとにかくフィルターにヒットしません)。

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/resources/")) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/pages" + path).forward(request, response);
}

最後に、上記のフィルターをのURLパターンにマップします/*

参照:

于 2012-08-10T13:00:44.243 に答える