0

我正在使用 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 模块的相同交错和相同症状。

4

1 回答 1

0

当我打印出 Bar.jsp 文件顶部的 request.getPathInfo() 时,这种情况变得更加明显。问题是我在开始项目时信任 GWT webAppCreator 生成合理的代码,我没有仔细考虑我的 URL 路径。特别是,webAppCreator 生成的 HTML 引用来自网页的已编译 javascript 客户端,如下所示:

<!--                                           -->
<!-- This script loads your compiled module.   -->
<!-- If you add any GWT meta tags, they must   -->
<!-- be added before this line.                -->
<!--                                           -->
<script type="text/javascript" language="javascript" src="waga/waga.nocache.js"></script>

请注意 src URL 中的相对路径,而不是绝对路径。在我看来,生成绝对路径更有意义,因为如果您将带有前缀的 URL 映射到此 .jsp 文件,它们不会意外地在文件系统中移动目标,这正是我所做的;特别是生成的 javascript 客户端的路径作为相对路径毫无意义,因为编译器总是会将其放入文件系统中的特定位置。通过在前面加上斜杠使路径(以及我也使用过的 .css 文件的另一个相对路径)成为绝对路径可以解决问题。

于 2012-04-17T06:12:36.217 回答