繁体   English   中英

在javascript中修改的值无法在JSF PhaseListener中更新

[英]values modified in javascript not getting updated in JSF PhaseListener

最初hold_mode值设置为0 ,在单击commandButton后,它通过JavaScript onclick事件更改为1 ...但是在PhaseListener的beforePhase()方法中,该值为0 我不明白为什么值仍为0

有人可以向我解释一下吗?

info.xhtml

<h:form id="userForm">
<h:inputHidden id="hold_mode" value="0" />
<h:commandButton id="hold" style="width: 60px;" value="#{myForm.holdbtntitle}" disabled="#{myForm.holdbtn}"  action="#{myForm.hold}" actionListener="#{convo.holdListener}" onclick="return send(true,'3');"  rendered="#{myForm.holdpanelflg}"/>

的JavaScript

function send(confirmFlg,msgFlg) {
   isClicked = true;
   if(confirmFlg) {
      msg = 'From Hold';
      if(confirm(msg) == false) {
          isClicked = false;
          event.returnValue = false;
          return false;
       }
    }
    if(isClicked) {
       if(msgFlg == '3') {
          document.all.item('myForm:hold_mode').value='1';
       }
       pep_OpenWaitDirect('../../../html/common/printwait.xhtml');
       return true;
    } else {
       return false;
    }
}

相位监听器

public class RemoveValidateListener implements PhaseListener {

private static final long serialVersionUID = 3556867423746720962L;

private FacesContext old = null;

public void beforePhase(PhaseEvent e) {
    System.out.println("Before "+e.getPhaseId());
    if(e.getPhaseId().equals(PhaseId.PROCESS_VALIDATIONS)) {
        UIComponent comp = FacesContext.getCurrentInstance().getViewRoot();
        if(findHoldMode(comp)){

            old = FacesContext.getCurrentInstance();
            removeValidatorsForComponentTree(comp);
        } 
    }
}

public void afterPhase(PhaseEvent e) {
    System.out.println("After "+e.getPhaseId());
    if(e.getPhaseId().equals(PhaseId.PROCESS_VALIDATIONS)) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent comp = FacesContext.getCurrentInstance().getViewRoot();
        if(findHoldMode(comp)){

            StateManager stateManager = (StateManager)context.getApplication().getStateManager();
            stateManager.restoreView(old,old.getViewRoot().getViewId(),old.getViewRoot().getRenderKitId());
        }
    }
}

private boolean findHoldMode(UIComponent comp){
    boolean rtnFlg = false;
    List list = comp.getChildren();

    for (int i = 0; i < list.size(); i++) {
        UIComponent temp = (UIComponent) list.get(i);
        if (!(temp instanceof HtmlBody)) {
            continue;
        } else {
            List<UIComponent> childList = temp.getChildren();
            for (int j = 0; j < childList.size(); j++) {
                UIComponent childTemp = (UIComponent) childList.get(j);
                if (!(childTemp instanceof HtmlPanelGrid)) {
                    continue;
                } else {
                    List<UIComponent> child2List = childTemp.getChildren();
                    for (int k = 0; k < child2List.size(); k++) {
                        UIComponent child2Temp = (UIComponent) child2List.get(k);
                        if (!(child2Temp instanceof HtmlForm)) {
                            continue;
                        }
                        UIComponent hold = child2Temp.findComponent(JsfBase.HOLD_MODE_COMPNAME);
                        if (hold == null) {
                            continue;
                        }
                        if (!(hold instanceof UIInput)) {
                            continue;
                        }
                        Object mode = ((UIInput) hold).getValue();
                        if (mode == null || !(mode.toString().equals(JsfBase.HOLD_MODE_ON))) {
                            continue;
                        } else {
                            rtnFlg = true;
                            ((UIInput) hold).setValue("0");
                            break;
                        }
                    }
                }
            }
        }
    }
    return rtnFlg;
}

private void removeValidatorsForComponentTree(UIComponent comp){
    removeValidators(comp);    
    List complist = comp.getChildren();

    if (complist.size()>0){    
        for(int i = 0; i < complist.size(); i++) {
            UIComponent uicom = (UIComponent) complist.get(i);
            removeValidatorsForComponentTree(uicom);
        }
    }

}

private void removeValidators(UIComponent comp){
    if(comp instanceof UIInput){
        removeValidator((UIInput)comp);
    }
}

public void removeValidator(UIInput comp){
    Validator[] validator = comp.getValidators();
    for(int i=0;i < validator.length;i++){
        comp.removeValidator(validator[i]);
    }
    if(comp.isRequired()){
        comp.setRequired(false);
    }
}
}

我尝试了此<h:inputHidden id="hold_mode" value="0" immediate="true" /> ,它适用于当前屏幕,但问题是当我在其他屏幕中单击commandButton时,发生了以下异常
java.lang.IllegalStateException: FacesContext already released

修改PhaseListener后问题已解决

  1. 我之所以得到IllegalStateException是因为我已经在全球范围内将FacesContext对象声明为old 在那种情况下,我已经在befoerPhase方法中声明了它,因为我们没有全局声明FacesContext

  2. 代码修改之前,我们所做的事情就是我们移除验证beforePhase ,我们在恢复视图状态afterPhase ,但它并没有正常工作。 所以,现在我在保存之前验证去除视图状态beforePhase而不是还原它的afterPhase ..

     public class RemoveValidateListener implements PhaseListener { private static final long serialVersionUID = 3556867423746720962L; public void beforePhase(PhaseEvent e) { if (e.getPhaseId().equals(PhaseId.PROCESS_VALIDATIONS)) { FacesContext context = FacesContext.getCurrentInstance(); UIComponent comp = context.getViewRoot(); StateManager stateManager = (StateManager) context.getApplication().getStateManager(); stateManager.saveView(context); if (findHoryuMode(comp)) { removeValidatorsForComponentTree(comp); } } } public void afterPhase(PhaseEvent e) { } 

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM