把消息定义在properties文件,然后在要校验的组件里加一个attribute,比如<f:attribute name="fieldRef" value="Error" />
然后定义一个phase-listener在faces-config文件里:<lifecycle>
<phase-listener>com.dconx.swx.web.commons.FieldReferenceListener</phase-listener>
</lifecycle>
listener大概如下:
public class FieldReferenceListener implements PhaseListener { public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
} public void beforePhase(PhaseEvent e) {
FacesContext fc = e.getFacesContext();
UIViewRoot root = fc.getViewRoot();
Iterator i = fc.getClientIdsWithMessages();
while (i.hasNext()) {
String clientId = (String) i.next();
if (clientId !=null) {
UIComponent c = root.findComponent(clientId);
String fieldRef =
(String) c.getAttributes().get("fieldRef");
if (fieldRef != null && c != null) {
Iterator j = fc.getMessages(clientId);
while (j.hasNext()) {
FacesMessage fm = (FacesMessage) j.next();
fm.setDetail(fieldRef + ": " + fm.getDetail());
}
}
}
}
} public void afterPhase(PhaseEvent e) {
}
}
然后自己写一个用来显示错误消息的panelGrid,rendered="#{!empty facesContext.maximumSeverity}"
然后不要设置required="true",而是在后台校验,如果为空则用如下语句显示错误消息:
FacesContext.getCurrentInstance().addMessage("mainForm:permissionError",
new FacesMessage(bundle.getString("noPermissionCopyTag")));
return null;
bundle是一个ResourceBundle,用来获取你定义的错误消息。不知道是否有更方便的方法。
然后定义一个phase-listener在faces-config文件里:<lifecycle>
<phase-listener>com.dconx.swx.web.commons.FieldReferenceListener</phase-listener>
</lifecycle>
listener大概如下:
public class FieldReferenceListener implements PhaseListener { public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
} public void beforePhase(PhaseEvent e) {
FacesContext fc = e.getFacesContext();
UIViewRoot root = fc.getViewRoot();
Iterator i = fc.getClientIdsWithMessages();
while (i.hasNext()) {
String clientId = (String) i.next();
if (clientId !=null) {
UIComponent c = root.findComponent(clientId);
String fieldRef =
(String) c.getAttributes().get("fieldRef");
if (fieldRef != null && c != null) {
Iterator j = fc.getMessages(clientId);
while (j.hasNext()) {
FacesMessage fm = (FacesMessage) j.next();
fm.setDetail(fieldRef + ": " + fm.getDetail());
}
}
}
}
} public void afterPhase(PhaseEvent e) {
}
}
然后自己写一个用来显示错误消息的panelGrid,rendered="#{!empty facesContext.maximumSeverity}"
然后不要设置required="true",而是在后台校验,如果为空则用如下语句显示错误消息:
FacesContext.getCurrentInstance().addMessage("mainForm:permissionError",
new FacesMessage(bundle.getString("noPermissionCopyTag")));
return null;
bundle是一个ResourceBundle,用来获取你定义的错误消息。不知道是否有更方便的方法。
和你实现的方式大致相同!
但是我的实现不了required,如果为空,我的就是不相应!其他的长度等都可以相应!
我挺想知道!除了这种自己构造是否还有其他比较方便的方法!
谢谢楼上的!
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException; public class UserBean {
....
public void validate(FacesContext context,
UIComponent component,
Object obj)
throws ValidatorException {
String password = (String) obj;
if(password.length() < 6) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"字元長度小於6",
"字元長度不得小於6");
throw new ValidatorException(message);
}
if(!password.matches(".+[0-9]+")) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"密碼必須包括字元與數字",
"密碼必須是字元加數字所組成");
throw new ValidatorException(message);
}
}
}
接著可以在頁面下如下使用驗證器:.....
<h:inputSecret value="#{user.password}"
required="true"
validator="#{user.validate}"/>
javax.faces.component.UIInput.REQUIRED
的转意就可以
系统中已经预定义的都可以在资源文件中转义。