我的 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。