私の Google App Engine プロジェクトでは、すべてのリクエストがサーブレットによって処理され、最後に適切な JSP に転送されます。
RequestDispatcher rd = mServletContext.getRequestDispatcher("/views/" + pViewName + ".jsp");
rd.forward(mRequest, mResponse);
これは、Google App Engine でオンラインで問題なく動作します。しかし、Google App Engine SDK (「dev_appserver.cmd」を使用) からローカル サーバーを使用すると、無限ループが発生します。転送がサーブレットによって再び処理されることがわかります。これはオンラインでは起こりません。
私のweb.xml:
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>HtmlStarterServlet</servlet-name>
<servlet-class>com.kupkik.ui.html.HtmlStarterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HtmlStarterServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
私のプロジェクトはMavenプロジェクトです(スケルトンアーキタイプを使用して作成されました)。私のプロジェクト構造は次のようになります。
- ソース
- 主要
- ジャワ
- com.kupkik.ui.html.HtmlStarterServlet
- ウェブアプリ
- ビュー
- test.jsp
- ビュー
- WEB-INF
- ジャワ
- テスト
- 主要
HtmlStarterServlet:
@SuppressWarnings("serial")
public class HtmlStarterServlet
extends HttpServlet
{
@Override
public void doGet(HttpServletRequest r,HttpServletResponse rs) throws IOException
{
String t = r.getRequestURI();
System.out.println("test: " + t);
RequestDispatcher rd = getServletContext().getRequestDispatcher("/views/test.jsp");
try
{
rd.forward(r, rs);
}
catch( ServletException e )
{
System.out.println("ex");
}
}
}
開発サーバーをデバッグ モードで実行している場合のコンソールの出力:
test: /
test: /views/test.jsp
test: /views/test.jsp
test: /views/test.jsp
... (and so on)
私の質問は、SDK のローカル サーバーとオンライン GAE の動作が異なるのはなぜですか? そして、誰かが問題を解決する方法を知っているので、両方で機能しますか?
表示する JSP を選択する 1 つのサーブレットですべての要求を処理する必要があります。