1

私の 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 つのサーブレットですべての要求を処理する必要があります。

4

1 に答える 1

0

Chrome devtools のネットワーク タブを使用して、無限ループにある URL を確認します。

%SystemRoot%\system32\drivers\etc\hosts にホスト エントリを作成してみてください (例:devserver.example.com 127.0.0.1)。

于 2013-09-03T10:22:35.563 に答える