Gwt 如何在页面切换异步回调的成功过程中执行代码
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
异步回调
查询当前用户的角色时,首先检查用户是否登录。这是在我自己的异步回调实现中完成的(请参阅)。如果发现未登录,则会发生以下情况:
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(…)内部。