jsf表单验证
主要步骤:
创建模型实例:DynaFormModel model = new DynaFormModel();
将行添加到常规网格:DynaFormRow row = model.createRegularRow(); 添加标签:DynaFormLabel标签= row.addLabel(value,colspan,rowspan); 添加可编辑控件:DynaFormControl控件= row.addControl(数据,类型,colspan,rowspan); 设置标签和控件之间的关系(可选):label.setForControl(control);
根据需要重复最后四个步骤。 从UI角度看会是什么样? 表单验证失败后的屏幕截图:

主要标签是pe:dynaForm。 子标记pe:dynaFormControl匹配Java控件中通过“ type”属性创建的标记。 这通常是“一对多”的关系。 下面列出了上面动态形式的XHTML / Java(控制器bean和模型)代码。
<h:panelGroup id="dynaFormGroup"><p:messages id="messages" showSummary="true"/><pe:dynaForm id="dynaForm" value="#{dynaFormController.model}" var="data"><pe:dynaFormControl type="input" for="txt"><p:inputText id="txt" value="#{data.value}" required="#{data.required}"/></pe:dynaFormControl><pe:dynaFormControl type="calendar" for="cal" styleClass="calendar"><p:calendar id="cal" value="#{data.value}" required="#{data.required}" showOn="button"/></pe:dynaFormControl><pe:dynaFormControl type="select" for="sel" styleClass="select"><p:selectOneMenu id="sel" value="#{data.value}" required="#{data.required}"><f:selectItems value="#{dynaFormController.languages}"/></p:selectOneMenu></pe:dynaFormControl><pe:dynaFormControl type="textarea" for="tarea"><p:inputTextarea id="tarea" value="#{data.value}" required="#{data.required}" autoResize="false"/></pe:dynaFormControl><pe:dynaFormControl type="rating" for="rat"><p:rating id="rat" value="#{data.value}" required="#{data.required}"/></pe:dynaFormControl><f:facet name="buttonBar"><p:commandButton value="Submit" action="#{dynaFormController.submitForm}"process="dynaForm" update="_mainForm_dynaFormGroup"/><p:commandButton type="reset" value="Reset" style="margin-left: 5px;"/></f:facet></pe:dynaForm>
</h:panelGroup>
@ManagedBean
@ViewScoped
public class DynaFormController implements Serializable {private DynaFormModel model;private static List<SelectItem> LANGUAGES = new ArrayList<SelectItem>();public DynaFormController() {model = new DynaFormModel();// add rows, labels and editable controls// set relationship between label and editable controls to support outputLabel with "for" attribute// 1. rowDynaFormRow row = model.createRegularRow();DynaFormLabel label11 = row.addLabel("Author", 1, 1);DynaFormControl control12 = row.addControl(new BookProperty("Author", true), "input", 1, 1);label11.setForControl(control12);DynaFormLabel label13 = row.addLabel("ISBN", 1, 1);DynaFormControl control14 = row.addControl(new BookProperty("ISBN", true), "input", 1, 1);label13.setForControl(control14);// 2. rowrow = model.createRegularRow();DynaFormLabel label21 = row.addLabel("Title", 1, 1);DynaFormControl control22 = row.addControl(new BookProperty("Title", false), "input", 3, 1);label21.setForControl(control22);// 3. rowrow = model.createRegularRow();DynaFormLabel label31 = row.addLabel("Publisher", 1, 1);DynaFormControl control32 = row.addControl(new BookProperty("Publisher", false), "input", 1, 1);label31.setForControl(control32);DynaFormLabel label33 = row.addLabel("Published on", 1, 1);DynaFormControl control34 = row.addControl(new BookProperty("Published on", false), "calendar", 1, 1);label33.setForControl(control34);// 4. rowrow = model.createRegularRow();DynaFormLabel label41 = row.addLabel("Language", 1, 1);DynaFormControl control42 = row.addControl(new BookProperty("Language", false), "select", 1, 1);label41.setForControl(control42);DynaFormLabel label43 = row.addLabel("Description", 1, 2);DynaFormControl control44 = row.addControl(new BookProperty("Description", false), "textarea", 1, 2);label43.setForControl(control44);// 5. rowrow = model.createRegularRow();DynaFormLabel label51 = row.addLabel("Rating", 1, 1);DynaFormControl control52 = row.addControl(new BookProperty("Rating", 3, true), "rating", 1, 1);label51.setForControl(control52);}public DynaFormModel getModel() {return model;}public String submitForm() {... // do something}public List<SelectItem> getLanguages() {if (LANGUAGES.isEmpty()) {LANGUAGES.add(new SelectItem("en", "English"));LANGUAGES.add(new SelectItem("de", "German"));LANGUAGES.add(new SelectItem("ru", "Russian"));LANGUAGES.add(new SelectItem("tr", "Turkish"));}return LANGUAGES;}
}public class BookProperty implements Serializable {private String name;private Object value;private boolean required;public BookProperty(String name, boolean required) {this.name = name;this.required = required;}public BookProperty(String name, Object value, boolean required) {this.name = name;this.value = value;this.required = required;}// getter // setter
}


探索用例中的相应代码还有另一种形式 。
参考: 动态形式,JSF世界在我们的JCG合作伙伴 Oleg Varaksin的软件开发博客上 很期待 。
翻译自: https://www.javacodegeeks.com/2012/06/dynamic-forms-jsf-world-was-long.html
jsf表单验证