如何在 JSF 中有条件地要求表单字段?

How to make a form field conditionally required in JSF?

假设我有一个包含三个字段和两个提交按钮的 h:form。提交按钮是 显示报告 生成数据 。为了简单起见,我宁愿只有一种形式而不是多种形式。当显示报告时,需要三个字段的值作为报告显示的标准。所以我将它们标记为 required="true" 但这会禁用 生成数据 的执行,它不需要这三个字段。

有没有一种方法可以使 JSF 表单字段有条件地成为必填字段,而无需太多自定义编码,例如 requiredIf=#{condition}

如果生成数据 操作不需要对表单数据进行任何转换或验证,则将此按钮的属性 immediate 设置为 true

<h:commandButton action="#{someBean.generateData}" value="Generate Data" immediate="true"/>

这种方式会在任何转换或验证发生之前调用操作 generateData,并且根本不会验证表单数据。

如果生成数据需要来自表单的数据,那么您可以使用 BalusC 在这里描述的技巧:JSF 2.0 validation in actionListener or action method

简而言之,正如@Jean-François 建议的那样,您可以使用 EL 表达式作为 required 属性的值。仅当用户按下 Display Report 按钮时,EL 表达式才应评估为 true。这可以使用以下表达式完成:#{not empty param['<fullIdOfTheDisplayReportButton>']}。此表达式检查按钮的 id 是否属于参数,这意味着给定的按钮用于提交表单。

完整示例:

<h:form id="formId">
    <p>
        Required only for Display Report: <h:inputText id="reqForDR" required="#{not empty param['formId:displayReportButton']}" />
    </p>
    <p>
        Required for Display Report and Generate Data: <h:inputText id="reqForDRGD" required="true"/>
    </p>
    <h:commandButton id="displayReportButton" action="#{someBean.displayReport}" value="Display Report"/>
    <h:commandButton id="generateDataButton" action="#{someBean.generateData}" value="Generate Data"/>
</h:form>