【问题标题】:Custom validator with attributes in facelets带有 facelets 属性的自定义验证器
【发布时间】:2011-03-26 00:02:18
【问题描述】:

我编写了一个自定义验证器,它期望设置一个属性。我知道我必须编写一个处理程序(TagHandler 或 ValidatorHandler?)来设置该属性,但我无法做到。

<tag>
    <tag-name>validateCustom</tag-name>
    <validator>
        <validator-id>package.CUSTOM_VALIDATOR</validator-id>
    </validator>
</tag>

handler-class 元素应该放在哪里?以及如何编写处理程序以便它将属性传递给我的自定义验证器?

提前致谢!

【问题讨论】:

    标签: jsf facelets handler validation


    【解决方案1】:

    建议的解决方案不起作用,而且过于复杂。 JSF 1.2 中不需要处理程序类,验证器标记中根本不支持处理程序类。

    所以你只需要。

    验证者:

    public class CustomValidator implements Validator, Serializable
    {
        private static final long serialVersionUID = ...;
        private String someAttribute;
    
        public void setSomeAttribute(String someAttribute)
        {
            this.someAttribute = someAttribute;
        }
    
        @Override
        public void validate(FacesContext context, UIComponent component, Object value)
        throws ValidatorException 
        {
         // Do validation
        } 
    }
    

    faces-config.xml中自定义验证器的声明/注册

    <validator>
        <validator-id>customValidator</validator-id>
        <validator-class>package.CustomValidator</validator-class>
    </validator>
    

    taglib.xml(例如 my.taglib.xml):

    <?xml version="1.0"?>
    <!DOCTYPE facelet-taglib PUBLIC
     "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
     "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
    <facelet-taglib>
    <namespace>http://myNS.com/jsf</namespace>
    <tag>
        <tag-name>myCustomValidator</tag-name>
        <validator>
            <validator-id>customValidator</validator-id>
        </validator>
    </tag>
    </facelet-taglib>
    

    终于在web.xml中注册了taglib.xml:

    <context-param>
        <param-name>facelets.LIBRARIES</param-name>
        <param-value>/WEB-INF/my.taglib.xml</param-value>
    </context-param>
    

    所以这一切都不需要处理程序:-)

    【讨论】:

      【解决方案2】:

      这是一个带有自定义属性骨架的验证器:

      public class CustomValidator implements Validator, Serializable
      {
          private static final long serialVersionUID = ...;
          private String someAttribute;
      
          public void setSomeAttribute(String someAttribute)
          {
              this.someAttribute = someAttribute;
          }
      
          @Override
          public void validate(FacesContext context, UIComponent component, Object value)
          throws ValidatorException 
          {
              // Do validation
          }
      }
      

      这是标签处理程序:

      public class CustomValidatorHandler extends ValidateHandler
      {
          private final TagAttribute someAttribute;
      
          public CustomValidatorHandler(ValidatorConfig config)
          {
              super(config);
      
              someAttribute = this.getAttribute("someAttribute");
          }
      
          @Override
          protected Validator createValidator(FaceletContext ctx)
          {
              CustomValidator result = (CustomValidator) ctx
              .getFacesContext()
              .getApplication()
              .createValidator("package.CUSTOM_VALIDATOR");
      
              if (someAttribute != null) result.setSomeAttribute(someAttribute.getValue(ctx));
      
              return result;
          }
      }
      

      这里是 taglib 文件的一部分:

      <tag>
          <tag-name>validateCustom</tag-name>
          <validator>
              <validator-id>package.CUSTOM_VALIDATOR</validator-id>
          <handler-class>package.CustomValidatorHandler</handler-class>
          </validator>
      </tag>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多