虚拟表单是一种技术,可用于限制在提交 Web 页时处理的输入字段。例如,当用户单击某个按钮时,您可能需要处理两个输入组件,如文本字段和下拉列表。但是在单击该按钮时,您却不需要处理任何其他组件。为此,可以创建一个虚拟表单,并将文本字段、下拉列表及按钮与其关联起来。
虚拟表单在页面上定义了一组输入和提交组件。输入组件(如文本字段、文本区域、下拉列表、复选框、列表框和单选按钮)用于参与虚拟表单。提交组件(如按钮和超级链接)用于提交虚拟表单。大多数输入组件既可以参与表单也可以提交表单,如下面的“虚拟表单和更改时自动提交”所述。
Web 站点用户提交虚拟表单时,只有虚拟表单的参与方会被处理。页面中的其余输入组件将被忽略,就像虚拟表单中的组件在其各自的页面中一样。
通过右键单击某个组件并选择“配置虚拟表单”,可以将该组件添加到虚拟表单。打开该对话框时,将看到可添加该组件的每个虚拟表单的行。每一行都包含虚拟表单的颜色、名称以及“参与和提交”单元格。如果组件可以参与表单,单击该单元格将显示一个下拉列表,可以在其中将设置更改为“是”。此操作也适用于“提交”单元格。如果组件无法提交或参与,单击该单元格时将不会执行任何操作。
尽管按钮和超级链接组件是最常用的提交组件,但也可以将输入组件(如下拉列表)作为提交组件。下拉列表既可以参与虚拟表单,也可以提交虚拟表单。可以在“配置虚拟表单”对话框中配置组件的虚拟表单行为。但是,要使下拉列表在实际操作时提交 Web 页,还需要右键单击该组件并启用“更改时自动提交”功能。
作为虚拟表单实现的部分缺省行为,无论用户何时提交导致同一页面重新显示的虚拟表单,未参与该虚拟表单的所有输入字段都会保留并显示它们的提交值,而不是它们本身的值。提交值是未转换且未验证的条目,它们在用户提交 Web 页时位于输入字段中。值是组件的实际当前值。虚拟表单的此缺省行为可防止页面重新显示时不必要地丢失任何非参与的(进而未被处理)的用户条目。
但是,有时必须覆盖该缺省行为,并显式放弃非参与输入字段的提交值而改为显示其值。主要/详细方案就是一个示例,其中详细方案包含可编辑的字段。当用户选择新的主要方案,进而在详细方案的数据提供器中重新填充新数据时,详细方案输入字段必须显示它们的值,即新的主要方案的数据,而不显示它们的提交值,即旧的主要方案的数据。
表单组件提供了以下用于放弃非参与输入字段的提交值的方法:
public void discardSubmittedValues(String virtualFormName)
public void discardSubmittedValue(EditableValueHolder inputField)
IllegalArgumentException。EditableValueHolder 对象。指定的输入字段将放弃其提交值。指定的输入字段必须为非参与字段。如果虚拟表单已提交并且指定的输入字段参与到其中,则此方法会抛出 IllegalArgumentException。immediate 属性相比,虚拟表单更灵活且更易于使用。
immediate 属性只能定义一个组,而页面可以根据需要使用任意多的虚拟表单。 immediate 属性要求您了解 JavaServer Faces 生命周期,而虚拟表单不影响此生命周期,因此更易于使用。