如何访问受管 Bean 中的 ui:param 值



我已经看到这个问题问了很多,但是,没有一个得到正确的回答,所以我决定再问一次。所以如果我有这个:如果我在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}"/>

这个想法是我可以在键hiddenFormId下访问RequestParameterMapformId的值。但是现在如果我有:

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

存储的

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

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

相关内容

  • 没有找到相关文章

最新更新