我有一个Xpage应用程序使用扩展库,其中xsp.extlib.convstate为三个用户之一为'null',直到他们手动刷新页面。所有三个用户都使用Citrix通过RDP访问应用程序,互联网选项对于这三个用户都是相同的。试图弄清楚为什么会发生这种情况。该应用程序仅在一台9.0.1服务器上运行。
答案 0 :(得分:0)
从源代码的外观来看,如果尚未初始化conversationState,则在任何时候都不会初始化conversationState:
(在阶段侦听器中:com.ibm.xsp.extlib.component.layout.impl.ApplicationPhaseListener)
@SuppressWarnings("unchecked") // $NON-NLS-1$
public void afterPhase(PhaseEvent event) {
if(event.getPhaseId()==PhaseId.RENDER_RESPONSE) {
// After the render phase, we save the conversion state
ConversationState.saveInSession(event.getFacesContext());
}
}
在UIApplicationLayout的setParent方法中,这似乎受到'isRestoringState'条件的保护,这意味着我不认为这会在页面的第一个视图上运行,因为不会任何恢复的状态。
@Override
public void setParent(UIComponent parent) {
super.setParent(parent);
if( null == parent ){ // removing parent
return;
}
// TODO should move this initialization to initBeforeContents instead
FacesContextEx context = (FacesContextEx) getFacesContext();
if(null != context && !context.isRestoringState()) {
ConversationState cs = ConversationState.get(context, FacesUtil.getViewRoot(this), true);
// Initialize the conversation state
// Set the current navigation path to the UserBean
ApplicationConfiguration conf = findConfiguration();
if(conf!=null) {
String navPath = conf.getNavigationPath();
if(StringUtil.isEmpty(navPath)) {
// If there isn't a navigation path that is defined, the use the default one
if(StringUtil.isEmpty(cs.getNavigationPath())) {
navPath = conf.getDefaultNavigationPath();
}
}
if(StringUtil.isNotEmpty(navPath)) {
cs.setNavigationPath(navPath);
}
}
}
}
所以这可以解释为什么在第二页视图之前它不会被初始化。 您可以尝试在尝试使用它之前强制初始化ConversationState,可能在beforePageLoad中,通过调用com.ibm.xsp.extlib.component.layout.ConversationState的get()方法之一。 请注意,boolean参数告诉方法创建ConversationState(如果它不存在)。 我没有做太多ServerSide Javascript,但我猜这有效吗?情绪是正确的。
#{javascript: com.ibm.xsp.extlib.component.layout.ConversationState.get(facesContext, true); }
如果你在java中这样做,那么:
ConversationState.get(FacesContext.getInstance(), true);
这听起来像是为什么你看到你的行为的解释?