第一步,先定义一个validator继承jsf中的validator,如果需要有状态就必须实现stateholder接口 package com.xx.web.validator;import javax.faces.component.stateholder;import javax.faces.component.uicomponent;import javax.faces.context.facescontext
第一步,先定义一个validator继承jsf中的validator,如果需要有状态就必须实现stateholder接口
package com.xx.web.validator;import javax.faces.component.stateholder;import javax.faces.component.uicomponent;import javax.faces.context.facescontext;import javax.faces.validator.validator;import javax.faces.validator.validatorexception;public class numbervalidator implements validator, stateholder { private int precision = 10; private int scale = 6; private boolean mustpositive = true; public numbervalidator() { } public void setprecision(int precision) { this.precision = precision; } public void setscale(int scale) { this.scale = scale; } public void setmustpositive(boolean mustpositive) { this.mustpositive = mustpositive; } @override public void validate(facescontext context, uicomponent component, object value) throws validatorexception { //这里是具体验证的逻辑 } @override public object savestate(facescontext context) { object values[] = new object[3]; values[0] = precision; values[1] = scale; values[2]= mustpositive; return (values); } @override public void restorestate(facescontext context, object state) { object values[] = (object[]) state; precision = (integer) values[0]; scale = (integer) values[1]; mustpositive=(boolean)values[2]; } @override public boolean istransient() { return false; } @override public void settransient(boolean newtransientvalue) { }}
在faces-confg.xml中添加以下代码numbervalidatorcom.xx.web.validator.numbervalidator
到此为止validator已经可以使用了
但是上面的参数无法添加
因为我们使用了facelet,所以要定义一个facelet的tag
package com.xx.web.validator;import javax.faces.validator.validator;import com.sun.facelets.faceletcontext;import com.sun.facelets.tag.tagattribute;import com.sun.facelets.tag.jsf.validatehandler;import com.sun.facelets.tag.jsf.validatorconfig;public class numbervalidatorhandler extends validatehandler { private final tagattribute precisionattr; private final tagattribute scaleattr; private final tagattribute mustpositiveattr; public numbervalidatorhandler(validatorconfig config) { super(config); precisionattr = this.getattribute(precision); scaleattr = this.getattribute(scale); mustpositiveattr = this.getattribute(mustpositive); } @override protected validator createvalidator(faceletcontext ctx) { numbervalidator result = (numbervalidator) ctx.getfacescontext() .getapplication().createvalidator(number); if (precisionattr != null) result.setprecision(integer.valueof(precisionattr.getvalue(ctx))); if (scaleattr != null) result.setscale(integer.valueof(scaleattr.getvalue(ctx))); if (mustpositiveattr != null) result.setmustpositive(boolean.valueof(mustpositiveattr .getvalue(ctx))); return result; }}
然后在taglib.xml中加入validatenumbernumbercom.xx.validator.numbervalidatorhandler
使用方法