我在写一个GWT/GAE(Java)应用程序。附带GWT自动生成的问候词例如产生这样的代码:容器标签ID的名称如何处理?
<table align="center">
<tr>
<td colspan="2" style="font-weight:bold;">Please enter your name:</td>
</tr>
<tr>
<td id="nameFieldContainer"></td>
<td id="sendButtonContainer"></td>
</tr>
在客户端Java(为JavaScript)它访问HTML元素这样的:
final Button sendButton = new Button("Send");
final TextBox nameField = new TextBox();
nameField.setText("GWT User");
我加一个容器字段显示我可以通过编程方式使用HTML元素添加链接:someStuffContainer。我还添加了另一个字段,通过调用RPC服务来注销一个注销URL:logoutUrlContainer。 (是的,我现在知道有一个更简单的方法来做到这一点:GWT/GAE(Java): when combined with GAE, app.yaml/web.xml user authentication and login/logout not really working。我只是想看看我是否可以实现它。)请注意,someStuffContainer只是为了使这个控制实验:分离程序化添加URL的填写与在服务器端生成的注销链接;这将在下面相关。
<tr colspan="2">
<td id="someStuffContainer"></td>
</tr>
<tr colspan="2">
<td id="logoutUrlContainer"></td>
</tr>
在客户端的Java(与JavaScript),我这样做:
// make it clear that we can add something to the page
final HTML someStuffHTML = new HTML
("<a href=https://www.google.com/search?q=zap>some stuff 3</a>");
// provide the user with a logout URL; FIX: do this by just
// providing a link to a generic logout servlet, rather than by
// proactively creating the logout link here.
final HTML userStatusHTML = new HTML();
GWT.log("userStatusService.getStatus()");
userStatusService.getStatus
("/", new AsyncCallback<UserStatusServiceResponse>() {
public void onFailure(Throwable caught) {
GWT.log("userStatusService.onFailure()");
LogUtil.logThrowable(caught);
}
public void onSuccess(UserStatusServiceResponse result) {
GWT.log("userStatusService.onSuccess()");
if (result.loggedIn) {
userStatusHTML.setHTML("<a href=\""+ result.logOutUrl+
"\">log out</a>");
} else {
// FIX: we should actually redirect to the base page
userStatusHTML.setHTML("<a href=\""+ result.logInUrl+
"\">log in</a>");
}
}
});
RootPanel.get("someStuffContainer").add(someStuffHTML);
RootPanel.get("logoutUrlContainer").add(userStatusHTML);
在某种意义上这一切工作的纲领性HTML显示出来,点击注销URL日志的用户出。 (要查看这项工作,您必须在另一个选项卡中打开注销网址;如果您转到另一个页面,GWT devmode插件会吓坏了;它似乎进入了一种状态,它只是不停地抱怨应用程序需要重新编译并且此外,您必须重新加载app引擎才能要求重新登录;如果您注销并且客户端仍在运行,则可以继续使用该应用,除非您正在检查用户的服务器端是否已登录。)
在我看来,容器字段“logoutUrlContainer”的名称完全不重要。因此,在签入之前,我认为我会清理代码并将其重命名为更一般的东西,这反映了我可以将该容器用于更一般的用户状态小部件的事实。所以我将“logoutUrlContainer”改名为“userStatusContainer”;我将其重命名为.html和客户端Java(编译为JavaScript)。现在不是工作,这条线得到一个空指针异常:
RootPanel.get("logoutUrlContainer").add(userStatusHTML);
我是一个相当有经验的编码器:我一定要复制和粘贴,这样的字符串相匹配。我使用emacs中的搜索功能进行了检查。我用蚂蚁清理来清理整个项目。我使用grep来grep整个项目中的任何二进制文件(例如classfiles),这些文件可能已被ant clean遗漏,并且仍然包含旧名称。我重新启动了服务器,杀死了包含应用程序的浏览器选项卡等。我反复做了所有这些。重复我得到空指针异常。我想我至少在一个小时内一遍又一遍地做了这些。请注意,someStuffContainer始终工作的整个时间;不知何故,RootPanel.get()总是找到它,而没有找到userStatusContainer。最后,在绝望中我刚刚将容器字符串重新命名回来。立即它的作品。我登记了。
这是怎么回事?蚂蚁干净是否缺少什么?这里是我的蚂蚁干净的目标,这是我自己的扩展:
<target name="clean" description="Cleans this project">
<delete dir="gwt-unitCache" failonerror="false" />
<delete dir="war/myapp" failonerror="false" />
<delete dir="war/WEB-INF/classes" failonerror="false" />
<delete dir="war/WEB-INF/lib" failonerror="false" />
<delete dir="war/WEB-INF/deploy" failonerror="false" />
<delete file="war/WEB-INF/appengine-web.xml" failonerror="false" />
<delete file="war/WEB-INF/web.xml" failonerror="false" />
</target>
我不删除所有战争的唯一理由/ WEB-INF是,我使用的是可选的app.yaml配置Java的谷歌应用程序引擎,而不是自己编辑.xml文件。
我的蚂蚁干净的目标是否缺少某些东西?这个经历真的让我不想使用GWT。
更新:我想我知道发生了什么:javascript的被重新编译,但它从来没有发生,我认为在GWT开发插件将允许缓存网页。后来我更改了欢迎文件列表,旧的欢迎文件仍在显示。研究配置文件,我想不出任何可能的方式。最后,我只需点击重新加载并显示新文件。
无论如何,缓存将解释此问题中报告的错误。我不知道GWT在做什么,允许页面被缓存,尤其是在devmode中。你在开始和关闭Web开发人员15年之后的想法我可能早就想到了。但是我无法想象人们如何对缓存效果如此sl,,特别是在开发框架中。
我正在运行最新版本的OS X 10.6.8(x86)。我的浏览器是Chrome:16.0.912.63(官方Build 113337) $ java -version java版本“1.6.0_29” Java(TM)SE运行环境(build 1.6.0_29-b11-402-10M3527) Java HotSpot (TM)64位服务器虚拟机(构建20.4-b02-402,混合模式) 我正在使用gwt-2.4.0。