【问题标题】:Creating custom tag for Converter with attributes使用属性为转换器创建自定义标签
【发布时间】:2015-10-03 01:57:05
【问题描述】:

我在网上找到了一个转换器,并尽我所能将其更改为我的需要。问题是我需要添加一个必须检查的标志(即字符串),并且转换器必须将某种模式应用于字符串。

自定义转换器:

@FacesConverter("convtest.UrlConverter")
public class UrlConverter implements Converter {

   @Override
   public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {

      StringBuilder url = new StringBuilder();

      if(value!=null){
          if(value.length()==13){
              String tempstring;
              tempstring=value.toString();
              String finalstring= tempstring.substring(0, 4) + "-" + tempstring.substring(4, 8) + "-" + tempstring.substring(8, 13);
              url.append(finalstring);

          }else{
              url.append(value);
          }
      }else
     url.append("");

      try {
         new URI(url.toString());           
      } catch (URISyntaxException e) {

        return null;
      }

      UrlData urlData = new UrlData(url.toString()); 
      return urlData;
   }

   @Override
   public String getAsString(FacesContext facesContext,
      UIComponent component, Object value) {
         try {
            return value.toString();
        } catch (Exception e) {
            return null;
        }
   }


}

XHTML:

 <h:inputText value="#{userData.data}">
    <f:converter converterId="convtest.UrlConverter" />
 </h:inputText>      

现在的问题是,例如我有 2 种转换类型:

  • hju
  • zurt

假设hju 的输出格式为XXXX-XXXX-XXXXXzurt 的输出格式为XX-XX-XX-XX-XX-XX-X

现在我想调用转换器,例如:

 <f:converter converterId="convtest.UrlConverter" type="hju" />

或者类似的东西,让它使用正确的模式。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: jsf attributes converter


    【解决方案1】:

    您需要在*.taglib.xml 中将自定义转换器注册为新标签,您可以在其中指定任意数量的属性,然后将其映射为转换器实例的bean 属性。

    所以,给定一个新属性type

    @FacesConverter("convtest.UrlConverter")
    public class UrlConverter implements Converter {
    
        private String type; // +getter+setter
    
    }
    

    还有这个 /WEB-INF/my.taglib.xml(假设 Facelets 上的 JSF 2.x):

    <?xml version="1.0" encoding="UTF-8"?>
    <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://example.com/ui</namespace>
    
        <tag>
            <tag-name>urlConverter</tag-name>
            <converter>
                <converter-id>convtest.UrlConverter</converter-id>
            </converter>
            <attribute>
                <name>type</name>
                <type>java.lang.String</type>
            </attribute>
        </tag>
    </facelet-taglib>
    

    /WEB-INF/web.xml注册如下:

    <context-param>
        <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
        <param-value>/WEB-INF/my.taglib.xml</param-value>
    </context-param>
    

    那么这个用法应该是这样的:

    <html ... xmlns:my="http://example.com/ui">
    ...
    <h:inputText ...>
        <my:urlConverter type="hju" />
    </h:inputText>      
    
    <html ... xmlns:my="http://example.com/ui">
    ...
    <h:inputText ...>
        <my:urlConverter type="zurt" />
    </h:inputText>      
    

    或者,如果您碰巧使用 JSF 实用程序库 OmniFaces,那么您也可以使用 &lt;o:converter&gt; 保存上述 XML 样板,如下所示:

    <html ... xmlns:o="http://omnifaces.org/ui">
    ...
    <h:inputText ...>
        <o:converter converterId="convtest.UrlConverter" type="hju" />
    </h:inputText>      
    
    <html ... xmlns:o="http://omnifaces.org/ui">
    ...
    <h:inputText ...>
        <o:converter converterId="convtest.UrlConverter" type="zurt" />
    </h:inputText>      
    

    它会透明地将这些属性设置为转换器属性。

    【讨论】:

    • 很高兴知道这个全方位功能。
    • 很高兴知道您可以使用 OmniFaces 做到这一点,但最后我选择创建 taglib xml 以让我的 IDE 满意(当我使用 o:converter 时,它抱怨缺少/无效的属性) .
    【解决方案2】:

    你应该使用&lt;f:attribute/&gt;

    <h:outputText value="#{userData.data}" >
      <f:converter converterId="convtest.UrlConverter" />
      <f:attribute name="myCoolFlag" value="hju"/>
    </h:outputText>
    

    在转换器中你可以调用component.getAttributes().get("myCoolFlag");

    【讨论】:

    • 但是我怎样才能使用 hju 或 zurt 的转换器。我需要在调用转换器时设置标志。下一步是从另一个程序调用转换器,这样我就无法输入任何文本。这就是我得到 想法的原因。我用文本字符串和标志调用转换器。
    • 为什么不使用相同的转换器来计算属性?
    • 这就是我想要做的。我只是不想将属性分配给组件,而是在转换器的调用中拥有它。
    • 我怀疑我没有解决您的问题。 不工作?
    • 最后我没有像 inputText 或 outputText 这样的东西,但转换器将用于填充表单。数据需要以不同的方式进行模式化,并且单元格没有数据绑定,因此一次 zurt 可以在单元格中,另一次 hju 。据我所知,我需要使用参数调用转换器。如果你能告诉我它也能正常工作,我很高兴听到它:-) 你能给我一个关于它是如何工作的片段吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多