篇头废话:网上有很多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>