web-dev-qa-db-ja.com

「ルート」サーブレットをマップして、他のスクリプトを引き続き実行できるようにするにはどうすればよいですか?

次のようなJSPページを呼び出すサーブレットを作成しようとしています。

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException {
    req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp);
}

ドメインのルート(例: http://example.com/ )に応答するには、このサーブレットが必要なので、web.xmlで次のマッピングを使用します。

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

私が抱えている問題は、これがすべてに一致するため、ディスパッチャーが「/WEB-INF/main.jsp」に転送すると、これがurl-patternに一致するため、サーブレットが再度実行されることです。これにより、ループが Java.lang.StackOverflowError で終了するまで実行されます。

他のスクリプトが実行できないようにせずにルートを一致させるにはどうすればよいですか?

53
Jeremy Logan

空のパターンを使用してください。

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

サーブレット3.0仕様ではこれが明確になっています。

空の文字列( "")は、アプリケーションのコンテキストルートに正確にマップされる特別なURLパターンです

したがって、少なくとも3.0コンテナで動作するはずです。Jetty8で動作することを確認しました

46
nilskp

Web.xmlのwelcome-file要素を使用すると、on app engineでうまくいきました。これが私のものです:

<web-app>
    <servlet>
        <servlet-name>RootServlet</servlet-name>
        <servlet-class>com.foo.RootServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RootServlet</servlet-name>
        <url-pattern>/foo</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>foo</welcome-file>
    </welcome-file-list>
</web-app>
29
Jeb

元の質問では、App Engineでルートサーブレットをマッピングしようとしていることは触れられていません。Tomcat(および私が知る限り、他のサーブレットコンテナ)では簡単ですが、App Engineは通常のサーブレットコンテナではありません。

サーブレットを使用してWebアプリケーションを構築する通常の方法は、HttpServletを拡張し、タイトル、コンテンツ、エラー、メッセージなどを含む「ページ」オブジェクトを追加し、出力をJSPテンプレートに転送することです。これは、App Engineで動作するようになる絶対的な悪夢です。

  • JSPファイルは、先頭に「/」がないと「名前を付ける」ことができません。
  • JSPファイルをサブディレクトリに置くことはできません
  • サーブレットは、「/」URLパターンを使用してアプリケーションのルートにマップできません

これが最終的に機能した私のweb.xml(簡潔にするために編集)です。

<web-app>
  <servlet>
    <!-- this servlet needs to redirect to a NamedDispatcher
         called "template" -->
    <servlet-name>Home</servlet-name>
    <servlet-class>my.domain.HomeSv</servlet-class>
  </servlet>
  <servlet>
    <!-- jsp file must apparently be in root directory and have "/" at
         start of path -->
    <servlet-name>template</servlet-name>
    <jsp-file>/template.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <!-- map your home servlet to somewhere other than "/" -->
    <servlet-name>Home</servlet-name>
    <url-pattern>/home</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <!-- make your Home servlet the welcome file -->
    <welcome-file>home</welcome-file>
  </welcome-file-list>
</web-app>

私はこのすべてを検証することについて特に科学的ではありませんでしたが、今は私にとってはうまくいくようで、私はそれについてかなり満足しています。

7
Sam Lowry

JSTLなどを使用して、次のコードでルートにindex.jspという名前のウェルカムファイルを作成できます。

<c:redirect url="/main"/>

したがって、web.xmlファイルには次のようになります。

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>        
</welcome-file-list>

したがって、ルートを要求する人はすべて/ mainにリダイレクトされます。これで、サーブレットをメインにマップできます。

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/main</url-pattern>
</servlet-mapping>
4

パターンから「*」を削除してみてください。

<url-pattern>/</url-pattern>
1

別のスレッドでソリューションが言及されている web.xmlのサーブレットマッピングのURLパターン URLrewriteを使用-> http://tuckey.org/urlrewrite/

1
Tomasz

以下を試しましたか? (ワイルドカードである*がないことに注意してください。これが、構成がすべてをキャッチする理由です。)

<servlet-mapping>
        <servlet-name>MainServlet</servlet-name>
        <url-pattern>/index.jsp</url-pattern>
</servlet-mapping>

/からのコメントに従って編集。)

0
Stu Thompson

WEB-INFにリダイレクトできません。サーブレットコンテナは、そのフォルダ内のドキュメントのリクエストを処理することはありません。

アプリケーション(サーブレットだけでなく、アプリケーション全体)をルートコンテキスト(「/」の「 http://www.domainname.com/ ")の下で使用できるようにする場合は、サーブレットマッピングではなく、コンテキストエントリを設定する必要があります。

Tomcatでは、新しい <Context>マッピング (約3つの異なる場所の1つ)。

0
matt b