2012-01-16 36 views
0

我在写一个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。

回答

0

似乎进入它只是不断抱怨说,应用程序需要重新编译的状态,不能进行的是国家的

这与你是这样的事实做调试,所以开发模式用一些更新的版本覆盖了一些已编译的文件,并且当你没有重新编译(并且不是在开发模式下启动应用程序)时,它会注意到丢失的文件并停止。如果您想使用开发模式,请将?gwt.codesvr=...附加到新页面的网址,并且它也会以开发模式运行该页面。或者编译应用程序,并且不要使用任何带有开发模式的页面(加载该模块 - 其他模块都可以)。

我想,如果你的后缀添加到URL,你的整个问题就会消失 - 你所看到的,如果RootPanel.get("some-id")不匹配的html页面的NPE是由于RootPanel.get返回null,并add正在呼吁空。