在后台bean中查找和修改JSF组件



我在视图中有一个<h:outputText>。在控制器中,我想使用下面的代码来操作valuestyle属性。这可能吗?

private void updateMsgCreateRegistrationKey(String objectName, String msg, String msgType){
    UIComponent UIOutputText = getUIComponentOfId(FacesContext.getCurrentInstance().getViewRoot(), objectName);
    if (UIOutputText != null){
        UIOutputText.setRendered(true);
        if(msgType.equalsIgnoreCase("Info")){
        }else if(msgType.equalsIgnoreCase("Error")){
        }
    }
    RequestContext.getCurrentInstance().update(objectName);
    FacesContext.getCurrentInstance().renderResponse();
}

这不是正常的方法。你通常不会从控制器上操作视图。相反,在MVC中,您让控制器(支持bean)操作模型(支持bean属性),并让视图(XHTML文件)检查模型(支持bean属性)。

private String value;
private String styleClass;
private boolean rendered;
public void someMethod() {
    value = "some value";
    styleClass = "someClass";
    rendered = true;
}
// +getters (no setters necessary)
<h:outputText value="#{bean.value}"
              styleClass="#{bean.styleClass}"
              rendered="#{bean.rendered}" />

或即使没有rendered属性:

<h:outputText value="#{bean.value}"
              styleClass="#{bean.styleClass}"
              rendered="#{not empty bean.value}" />

每当你认为你需要从控制器的视图中抓取UIComponent时,立即停下来并仔细考虑一下你是否真的在用正确的方法做事情。

参见:

  • 如何'绑定'属性在JSF中工作吗?何时以及如何使用?