在我的一个GWT应用程序中,我遇到了一个奇怪的问题,当我在eclipse GWT插件中配置的jetty中运行应用程序并点击浏览器刷新时,当前页面被成功加载(placeManager.getCurrentPlaceRequest()),但是当应用程序war被部署在tomcat/jboss中时,执行在当前位置请求的呈现者的onBind()方法之后停止,并且没有显示页面。
在处理刷新的过程中,该Presenter的GateKeeper的first time canReveal()方法返回false,并且在一次服务器调用之后,我再次显示current place,这导致canReveal()方法返回true,但是presenter仍然未显示。所以,在这里我怀疑有些事情是棘手的!
有关于这种行为的任何提示吗?
以下是实现的LoggedInGatekeeper的代码片段,它起到了关键作用:
public class LoggedInGatekeeper implements Gatekeeper {
private final EventBus eventBus;
private final DispatchAsync dispatcher;
private final PlaceManager placeManager;
private CurrentUser currentUser;
private boolean isUserLoggedOut;
private String lastPageAccessed;
@Inject
public LoggedInGatekeeper(final EventBus eventBus, final DispatchAsync dispatcher, final PlaceManager placeManager)
{
this.eventBus = eventBus;
this.dispatcher = dispatcher;
this.placeManager = placeManager;
this.eventBus.addHandler(LoginAuthenticatedEvent.getType(), new LoginAuthenticatedEventHandler()
{
@Override
public void onLogin(LoginAuthenticatedEvent event)
{
currentUser = event.getCurrentUser();
isUserLoggedOut = false;
}
});
this.eventBus.addHandler(LogoutUserEvent.getType(), new LogoutUserEventHandler()
{
@Override
public void onLogoutUser(LogoutUserEvent event)
{
SessionFactory.removeCookie(Constants.LAST_PAGE_ACCESSED);
currentUser = null;
isUserLoggedOut = true;
}
});
}
@Override
public boolean canReveal()
{
Log.info("Browser fetched session cookie : " + Cookies.getCookie(Constants.JSESSION_COOKIE_KEY));
if (Cookies.getCookie(Constants.JSESSION_COOKIE_KEY) == null)
{
SC.say("Your session is expired. Please login again");
NavigateToLoginEvent.fire(eventBus);
return false;
}
if (currentUser != null && !isUserLoggedOut)
{
lastPageAccessed = placeManager.getCurrentPlaceRequest().getNameToken();
Log.info("canReveal() 1 : " + lastPageAccessed);
SessionFactory.addCookie(Constants.LAST_PAGE_ACCESSED, lastPageAccessed);
return currentUser.isLoggedIn();
}
else if (isUserLoggedOut)
{
Log.info("canReveal() 2 : User is logged out");
NavigateToLoginEvent.fire(eventBus);
return false;
}
else
{
Log.info("canReveal() 3 : Check on server for logged in user");
dispatcher.execute(new FetchLoggedInUserAction(), new FetchLoggedInUserAsyncCallback());
return true;
}
}
class FetchLoggedInUserAsyncCallback extends MessageAsyncCallback<FetchLoggedInUserResult>
{
/**
*
*/
public FetchLoggedInUserAsyncCallback()
{
super("Loading...");
}
@Override
public void doOnFailure(Throwable caught)
{
NavigateToLoginEvent.fire(eventBus);
}
@SuppressWarnings("unchecked")
@Override
public void doOnSuccess(FetchLoggedInUserResult result)
{
if (result == null)
{
Log.info("doOnSuccess() 1 : LoggedInUser not found on server");
NavigateToLoginEvent.fire(eventBus);
}
else
{
Log.info("doOnSuccess() 2 : LoggedInUser found on server");
if (result.getLoggedInUser() != null)
{
currentUser = new CurrentUser();
currentUser.setMerchantConsoleUser(result.getLoggedInUser());
SessionFactory.getClientSessionInstance().put(SessionKeys.LOGGED_IN_USER, result.getLoggedInUser());
PlaceRequest currentPlaceRequest = placeManager.getCurrentPlaceRequest();
Log.info("doOnSuccess() 3 : " + currentPlaceRequest.getNameToken());
if (currentPlaceRequest != null)
{
placeManager.revealPlace(currentPlaceRequest);
}
}
else
{
NavigateToLoginEvent.fire(eventBus);
}
}
}
}}
提前谢谢。
发布于 2012-09-25 13:53:53
谜团揭开,在onBind()方法中添加了以下代码,浏览器刷新开始在所有环境中按预期工作。这看起来像是框架的模糊行为,当时GateKeeper试图从服务器获取数据,不知何故,presenter的可见性被设置为false,同样的想法导致我写了以下代码,它起作用了,希望GWT-P的人可以看看这篇文章,想出适当的方法来处理这种情况:
/**
* This piece of code takes care of revealing page on browser refresh event.
* On browser refresh somehow visibility of page is set to false, so, we need to manually fire the reveal content event.
*/
if(this.getProxy().canReveal() == true && !this.isVisible()){
revealInParent();
}https://stackoverflow.com/questions/12490427
复制相似问题