【发布时间】:2014-06-01 14:41:46
【问题描述】:
我的 InputText 有两个要求:
- p:inputText 的值应立即显示在屏幕上 h:outputText 与 keyup-event
- 该值在数据库中应该是唯一的
我正在使用 Primefaces 4.0、JSF 2.2 以及 Glassfish 4 和 Java 7
我的代码现在是这样的
Example.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 事件中,都会验证值并调用数据库。但我只想在提交表单时验证值。
我的第一个解决方案是将验证移到 saveValue 方法中。
public String saveValue() {
if(service.isValueNotUnique(value) {
// add a FacesMessage
return null;
} else {
service.saveValue(value);
return "showall";
}
}
但在这里我认为将验证代码和逻辑代码混合在一种方法中并不是一个好习惯。
所以我希望你有一个更好的解决方案;)
【问题讨论】:
标签: java validation jsf primefaces