JSF 自定义标签验证器的实现

篇头废话:网上有很多JSF自定义标签的实现,但是这些所谓的自定义标签实现有个共同的特点那就是不是真正的jsf实现而是jsp实现,所以jsf的xhtml文件压根就不能使用这些自定义标签。为此,本文介绍jsf自定义标签的实现。

1、  定义自定义标签类,NumberRangeValidator,附上其核心代码:注意其Maximum属性和validate方法

public class NumberRangeValidator implements Validator, PartialStateHolder {

 

    /**

     * The converter id for this converter.

     */

    public static final String VALIDATOR_ID = "com.marcus.NumberRange";

 

    private Double maximum;

 

    private boolean transientValue;

    private boolean initialState;

 

    public NumberRangeValidator2() {

 

    }

 

    public double getMaximum() {

       return this.maximum != null ? this.maximum : Double.MAX_VALUE;

    }

 

    public void setMaximum(double maximum) {

       clearInitialState();

       this.maximum = maximum;

    }

 

    public void validate(FacesContext context, UIComponent component, Object value) {

       if ((context == null) || (component == null)) {

           throw new NullPointerException();

       }

       try {

           //do validation

       } catch (NumberFormatException e) {

           throw new ValidatorException(new FacesMessage());

       }

    }

    public Object saveState(FacesContext context) {

       if (context == null) {

           throw new NullPointerException();

       }

       if (!initialStateMarked()) {

           Object[] values = new Object[1];

           values[0] = maximum;

       }

       return null;

    }

 

    public void restoreState(FacesContext context, Object state) {

       if (context == null) {

           throw new NullPointerException();

       }

       if (state != null) {

           Object[] values = (Object[]) state;

           maximum = (Double) values[0];

       }

    }

 

    public boolean isTransient() {

       return this.transientValue;

    }

 

    public void setTransient(boolean transientValue) {

       this.transientValue = transientValue;

    }

 

    public void markInitialState() {

       initialState = true;

    }

    public boolean initialStateMarked() {

       return initialState;

    }

    public void clearInitialState() {

       initialState = false;

    }

}

 

2、  配置facelet-taglib,新建一个xml文件,命名为:macus.tablib.xml,跟web.xml文件一个目录,注意validator-id为NumberRangeValidator类中定义的validator_id,内容如下:

<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"

       version="2.0">

    <namespace>http://java.sun.com/jsf/marcus</namespace>

   

    <tag>

       <tag-name>numberRangeValidator</tag-name>

       <validator>

           <validator-id>com.marcus.NumberRange</validator-id>

           <handler-class>javax.faces.view.facelets.ValidatorHandler</handler-class>

       </validator>

        <attribute>

            <name>maximum</name>

            <type>java.lang.Double</type>

        </attribute>

    </tag>

</facelet-taglib>

 

3、  配置web.xml文件,增加一个参数配置即可。

    <context-param>

       <param-name>javax.faces.FACELETS_LIBRARIES</param-name>

       <param-value>/WEB-INF/marcus.taglib.xml</param-value>

</context-param>

 


猜你喜欢

转载自blog.csdn.net/chuangxin/article/details/6973142
jsf
今日推荐