1

我的 Google App Engine 项目的所有请求都由一个 servlet 处理,最后转发到相应的 JSP:

RequestDispatcher rd = mServletContext.getRequestDispatcher("/views/" + pViewName + ".jsp");
rd.forward(mRequest, mResponse);

这在 Google App Engine 上运行良好。但是当我使用来自 Google App Engine SDK 的本地服务器(使用“dev_appserver.cmd”)时,会创建一个无限循环。我可以看到转发被我的 servlet 再次处理。这不会在线上发生。

我的 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
      • 网络应用
        • 意见
          • 测试.jsp
      • 网络信息
    • 测试

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之间存在不同的行为?有人知道如何解决这个问题,以便它适用于两者吗?

我希望所有请求都由一个 servlet 处理,该 servlet 选择要显示的 JSP。

4

1 回答 1

0

使用 Chrome 开发工具,网络选项卡查看无限循环中的 URL。

尝试在 %SystemRoot%\system32\drivers\etc\hosts 中创建一个主机条目,例如.devserver.example.com 127.0.0.1 并使用它代替“localhost”

于 2013-09-03T10:22:35.563 回答