我对输入文本有两个要求:
- p:inputText 的值应立即通过 keyup-event 显示在屏幕上的 h:outputText 中
- 该值在数据库中应该是唯一的
我正在使用 Primefaces 4.0、JSF 2.2 以及 Glassfish 4 和 Java 7
我的代码现在看起来像这样
示例.xhtml
<h:form>
<p:inputText id="value" value="#{myBean.value}" >
<p:ajax event="keyup" update="example" process="@this" />
<f:validator binding="#{uniqueValueValidator}" />
</p:inputText>
<h:outputText id="example" value="#{myBean.value}">
<p:commandButton value="Save" action="#{myBean.saveValue}"/>
</form>
MyBean.java
@Named
@RequestScoped
public class MyBean {
@Inject
private DBService service;
private String value;
//getter, setter
public String saveValue() {
service.saveValue(value);
return "showall";
}
}
UniqueValueValidator.java
@Named
public class UniqueValueValidator implements Validator {
@Inject
private DBService service;
@Override
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
if(service.isValueNotUnique(value.toString()) {
// throw ValidatorException
}
}
}
我现在的问题是,在每个 keyup-event 上,都会验证该值并调用数据库。但我只想在提交表单时验证该值。
我的第一个解决方案是将验证移至saveValue
方法。
public String saveValue() {
if(service.isValueNotUnique(value) {
// add a FacesMessage
return null;
} else {
service.saveValue(value);
return "showall";
}
}
但在这里我认为在一种方法中混合验证代码和逻辑代码并不是一个好的做法。
所以我希望你能为我提供更好的解决方案;)