我正在使用 Google Web Toolkit 和 Java Google App Engine 编写应用程序。我发现以下情况非常可预测地发生。我有一个 servlet app.yaml 条目,如下所示:
handlers:
- url: /foo/*
name: FooServlet
servlet: com.waga.server.FooServlet
login: required
此 servlet 检查用户是否已登录(冗余,我知道),在数据库中查找用户,如果找到,则包含 Bar.jsp 文件以呈现 HTML 页面,其中包含用于加载 GWT 模块的 javascript。这个 Bar.jsp 文件和 GWT 模块已经工作了一段时间,最近只有一些小的更改以允许 servlet 在渲染 Bar.jsp 之前进行检查,并且在 Bar.jsp 文件的顶部添加了一些代码以计算一些要包含在页面中的字符串。
我将 log.info 放在 servlet 的顶部、Bar.jsp 文件的顶部和 Bar.jsp 文件的底部。当我使用 GWT devmode 转到 servlet 时,我看到日志消息按以下顺序排列:
Foo servlet top
Bar.jsp top
Bar.jsp bottom
Foo servlet top
Foo servlet top
Bar.jsp top
Bar.jsp bottom
Bar.jsp top
Bar.jsp bottom
也就是说,servlet 似乎被浏览器访问了 3 次,而不是同步访问(注意最后两次重叠)。每次我运行它时都会发生这种情况。
此外,Bar.jsp 文件表示它正在呈现页面,但 GWT javascript 从不加载和呈现客户端应用程序。它过去有,所以应该可以;也就是说,GWT 客户端代码正在工作,我刚刚重新安排了 url 如何映射到 servlet 以及 servlet 如何包含 .jsp 文件。此外,当 devmode 在将 Java 发送到客户端之前在服务器上将 Java 编译为 JavaScript 时,我的笔记本电脑风扇会启动,我可以看到 Java 使用了我的大部分 CPU 几秒钟来执行此操作;我现在没有看到。
我尝试摆脱 Servlet 并让 app.yaml 直接调用 .jsp(Servlet 检查我碰巧知道的所有内容都通过了,例如我已经登录,所以它什么也不做。)也就是说,我试过了让 app.yaml 这么说:
handlers:
- url: /foo/*
jsp: Bar.jsp
login: required
现在日志这样说
Bar.jsp top
Bar.jsp botton
Bar.jsp top
Bar.jsp top
Bar.jsp bottom
Bar.jsp bottom
似乎从未加载 GWT 模块的相同交错和相同症状。