如何在托管bean中访问ui:param值

时间:2012-09-21 15:48:51

标签: jsf jsf-2 uiinclude

我已经看到这个问题在很多地方问了,但是没有一个得到适当的回答所以我决定再问一遍。所以,如果我有这个:如果我在A.xhtml而我

<ui:include src="B.xhtml">
    <ui:param name="formId" value="awesome Id"/>
</ui:include>

所以在B.xhtml,我可以这样做

<h:outputText value="#{formId}"/>

当我运行A.xhtml时,我会在屏幕上看到awesome Id。但是,如何在辅助bean中访问formId的值。我查看FacesContext.getCurrentInstance().getAttributes()FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()内部,我似乎无法找到它。为了更进一步,我尝试:

B.xhtml内,我现在有

<h:inputHidden id="hiddenFormId" value="#{formId}"/>
<h:outputText value="#{formId}"/>

我的想法是,我可以在密钥formId下的RequestParameterMap中访问hiddenFormId的值。但现在如果我有:

<h:form id="myForm">
        <ui:include src="B.xhtml">
            <ui:param name="formId" value="awesome Id"/>
        </ui:include>
        <a4j:commandButton render="myForm" value="My Button"/>
</h:form>

然后如果我查看POST请求(在chrome或ff调试模式下),我会得到这个错误

<partial-response><error><error-name>class javax.faces.component.UpdateModelException</error-name><error-message><![CDATA[/B.xhtml @9,61 value="${formId}": /index.xhtml @27,61 value="awesome Id": Illegal Syntax for Set Operation]]></error-message></error></partial-response>

所以如何在托管bean中访问ui:param值?

1 个答案:

答案 0 :(得分:9)

<ui:param>所涵盖的内容实际上取决于实现。在Mojarra中,它作为FaceletContext的属性存储,因此可以在您的支持bean中使用,如下所示:

FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
String formId = (String) faceletContext.getAttribute("formId");

然而,该值是否可用取决于时间。如果在执行包含的呈现时您的支持代码正在运行,那么它将可用,否则它将是null

我记得MyFaces的做法有点不同,但我不再回忆起细节了,而且我现在还没有掌握其来源。

对于<h:inputHidden>次尝试,<h:inputHidden>并不适用于传递视图定义的隐藏参数以及表单提交的唯一目的。只需使用纯HTML即可。

<input type="hidden" name="hiddenFormId" value="#{formId}" />

它可以作为具有此名称的请求参数。