Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
Gwt 如何在页面切换异步回调的成功过程中执行代码_Gwt_Gwt Rpc - Fatal编程技术网

Gwt 如何在页面切换异步回调的成功过程中执行代码

Gwt 如何在页面切换异步回调的成功过程中执行代码,gwt,gwt-rpc,Gwt,Gwt Rpc,GWT新手,哦!这个学习曲线 因此,我正在测试我实现的身份验证功能:当通过异步回调查询当前用户的角色时,首先检查用户是否登录。这是在我自己的异步回调实现中完成的(请参阅)。如果发现未登录,则会发生以下情况: Widget returnToWidget = RootPanel.get(MyApp.Default_RootPanel_Id).getWidget(0); RootPanel.get().add(new LoginPage(returnToWidget)); 而LoginPage清除R

GWT新手,哦!这个学习曲线

因此,我正在测试我实现的身份验证功能:当通过
异步回调
查询当前用户的角色时,首先检查用户是否登录。这是在我自己的
异步回调实现中完成的(请参阅)。如果发现未登录,则会发生以下情况:

Widget returnToWidget = RootPanel.get(MyApp.Default_RootPanel_Id).getWidget(0);
RootPanel.get().add(new LoginPage(returnToWidget));
LoginPage
清除
RootPanel
,添加一个虚拟
FlowPanel
,并弹出一个带有用户名/密码/提交小部件的
对话框。如果接受凭据,则添加到提交小部件的
ClickListener
会执行以下操作:

@Override
public void onSuccess() {
    RootPanel.get().clear();
    RootPanel.get().add(returnToWidget);
现在,这一切都很好。为了解决实际问题,请允许我返回查询调用,该调用发生在
主面板扩展组合中

public MainPanel() {
    final DockPanel dockPanel = new DockPanel();
    initWidget(dockPanel);
    final HorizontalPanel hPanel = new HorizontalPanel();
    hPanel.add(new Button("TEST"));

    authService.getUserRole(jSessionId, new AsyncCallback<Constants.UserRole>() {
        @Override
        public void onSuccess(UserRole currentUserRole) {
            boolean isAdmin = currentUserRole.isAtLeast(Constants.UserRole.Administrator);
            if (isAdmin) {
                hPanel.add(createNewStudyButton);
            }
            hPanel.add(new Button("ButtonForAll"));
            System.out.println("CODE EXECUTED!");
        [...]
        }
    [...]

    dockPanel.add(hPanel, DockPanel.NORTH);
    System.out.println("THROUGH!");
}
public主面板(){
最终DockPanel DockPanel=新DockPanel();
initWidget(dockPanel);
最终水平面板hPanel=新水平面板();
添加(新按钮(“测试”);
authService.getUserRole(jSessionId,新的AsyncCallback(){
@凌驾
成功时公共无效(UserRole currentUserRole){
布尔值isAdmin=currentUserRole.isAtLeast(Constants.UserRole.Administrator);
如果(isAdmin){
hPanel.add(createNewStudyButton);
}
添加(新按钮(“按钮集合”);
System.out.println(“代码已执行!”);
[...]
}
[...]
dockPanel.add(hPanel,dockPanel.NORTH);
System.out.println(“通过!”);
}
启动我的GWT应用程序时,
MainPanel
在入口点实例化并添加到
RootPanel
,导致控制台通过!打印,显示登录屏幕,并在提供接受的管理员凭据后,将传递的
MainPanel
实例添加到
RootPane

不幸的是(问题就在这里!),仅显示测试按钮。控制台从不打印已执行的代码。@success响应中的代码为什么没有执行?刷新页面时,将执行代码并显示所有按钮,因为authService.getUserRole现在会返回一个结果,而不会中断登录屏幕

我真的非常想要一个
repaint()
或类似的东西,但问题似乎更多的是设计问题

即使
AsyncCallback
在返回结果之前进行了页面切换,谁能帮我执行代码块

更新:

我的错!发现了问题,但没有解决,因为我认为在这种设计中无法解决:

我的SecurityAsyncCallback引用了默认的AsyncCallback和onSuccess(T result)
,它只是将结果传递给默认的AsyncCallback,从而到达实际的调用者。我的设计是在调用时处理服务器端抛出的
NotLoggeDineException
,例如
authService。getUserRole
是在我的
SecurityAsyncCallback
onFailure
中捕获它,并显示登录屏幕…但是在这里,我无法重新运行导致
onFailure
的代码,因此调用方将体验到
onSuccess
,因为用户现在已登录;
AsyncCallback
接口只是调用方和被调用方之间传递调用结果的中介,不知道调用了什么


好吧,我真正想要的是,当用户深入我的应用程序,离开他的计算机,他的登录超时时,我希望登录页面显示在下一个服务器端访问中,然后将他重定向回他来自的地方(也就是说,登录后不返回默认页面)。我想我可以通过使用历史记录子系统来实现这一点,但我还没有尝试过。

onFailure()中会发生什么?您是否测试了它是否被调用?您是否在服务器端日志中看到错误?纯推测。第一次刷新会重置httpSession,因此不会从会话中检索用户角色,因此可能会出现严重错误…可能是NPE。因此,正如所说的,添加onFailure方法以查看发生了什么…如果我理解以下问题:System.out、 println(“…”)是“纯Java函数”,永远不会在“客户端”上执行,所以请尝试将它放在服务器端:在服务器上的getUserRole(…)内部。