Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GWT devmode时对servlet的奇怪但可预测的三重和交错调用_Java_Google App Engine_Gwt_Google Chrome Devtools - Fatal编程技术网

Java 使用GWT devmode时对servlet的奇怪但可预测的三重和交错调用

Java 使用GWT devmode时对servlet的奇怪但可预测的三重和交错调用,java,google-app-engine,gwt,google-chrome-devtools,Java,Google App Engine,Gwt,Google Chrome Devtools,我正在使用GoogleWebToolkit和JavaGoogleAppEngine编写一个应用程序。我发现了一种情况,在这种情况下,以下情况的发生是可以预见的。我有一个servlet,其app.yaml条目如下所示: handlers: - url: /foo/* name: FooServlet servlet: com.waga.server.FooServlet login: required 这个servlet检查用户是否已登录,我知道,它会在数据库中查找该用户,如果找到

我正在使用GoogleWebToolkit和JavaGoogleAppEngine编写一个应用程序。我发现了一种情况,在这种情况下,以下情况的发生是可以预见的。我有一个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发送到客户端之前在服务器上将其编译为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模块似乎从未加载过的相同交错和相同症状。

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

<!--                                           -->
<!-- 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文件的绝对路径,通过在斜杠前加上一个前缀,解决了这个问题