如何在JSF中有条件地制作表单字段?

时间:2015-01-23 22:27:04

标签: validation jsf

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

有没有办法在没有太多自定义编码的情况下有条件地制作JSF表单字段,比如requiredIf=#{condition}

1 个答案:

答案 0 :(得分:4)

如果生成数据操作不需要对表单数据进行任何转换或验证,请为此按钮将属性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属性的值。仅当用户按显示报告按钮时,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>