6

JSP ページのセットがあり、.jsp 拡張子を非表示にしたいと考えています (少し調べたところ、SEO に適しているようです)。

私が遭遇した1つの解決策は次のとおりです。

<servlet>
    <servlet-name>mypage</servlet-name>
    <jsp-file>/some-page.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>mypage</servlet-name>
    <url-pattern>/some-page</url-pattern>
</servlet-mapping>

これは機能しますが、サイトのすべての jsp ページに対してこのマッピングを設定する必要があると思います。

ここに投稿された別のソリューションに出くわしました(簡単なURLです):JSP /サーブレットの隠し機能

...単純なサーブレットを使用してリクエストを転送します。私の web.xml には次のものがあり、正常に動作します。

<servlet>
    <servlet-name>MyServletName</servlet-name>
    <servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServletName</servlet-name>
    <url-pattern>/myservlet/*</url-pattern>
</servlet-mapping>

問題は、次の URL にアクセスしたくないことです: www.mydomain.com/myservlet/some-page

URL を使用したい: www.mydomain.com/some-page

そこで、url-pattern を「/*」に変更しました

<servlet>
    <servlet-name>MyServletName</servlet-name>
    <servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServletName</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

しかし、これは無限ループを引き起こします:

    Exception in thread "http-bio-8080-exec-1" java.lang.StackOverflowError
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:219)
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
            .
            .
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
            at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
            at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
            at myservlets.PrettyUrlServlet.doGet(PrettyUrlServlet.java:22)

修正方法がわかりません。何か案は?

4

2 に答える 2

6

マップされたサーブレットは呼び出し/*でも実行されRequestDispatcher#forward()ます。したがって、そのサーブレットで転送を実行している場合、無限ループで毎回自分自身を呼び出します。それは説明しStackOverflowErrorます。

/*結局のところ、サーブレットに使用するべきではありません。サーブレット フィルターでのみ意味があります。サーブレット マッピングをより具体的な URL パターンに戻し、/*必要に応じて目的のサーブレットに転送するフィルターを作成します。もちろん、サーブレットで画像/CSS/JS ファイルなどを処理する必要はありません。/resourcesそれらがすべてフォルダに配置され、フロント コントローラが にマッピングされていると仮定して/myservlet/*、 で次の作業を行いますdoFilter()

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

if (path.startsWith("/resources/")) {
    // Just let container's default servlet do its job.
    chain.doFilter(request, response);
}
else {
    // Delegate to your front controller.
    request.getRequestDispatcher("/myservlet" + path).forward(request, response);
}

以下も参照してください。

于 2012-05-01T18:29:31.077 に答える
1

UrlRewriteFilterを使用する必要があります

構成ファイル (urlrewrite.xml) で次のようなものを使用できます。

<rule>
    <from>/products/([a-zA-Z0-9._%]+)</from>
    <to>/products.jsp?id=$1</to>
</rule>

UrlRewriteFilter はコメントにありますが、独立した回答である必要があると思います。

于 2013-01-03T17:33:36.907 に答える