7

我已经看到这个问题问了很多,但是没有一个得到正确的回答,所以我决定再问一次。所以如果我有这个:如果我在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打印在屏幕上。但是,我如何访问formId支持 bean 中的值。我往里看FacesContext.getCurrentInstance().getAttributes()FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()我似乎找不到它。更进一步,所以我尝试:

在里面B.xhtml,我现在有

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

这个想法是我可以访问under keyformId的值。但现在如果我有:RequestParameterMaphiddenFormId

<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 值?

4

1 回答 1

12

<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}" />

它将作为具有该名称的请求参数提供。

于 2012-09-21T16:47:55.153 回答