簡體   English   中英

使用屬性為Converter創建自定義標記

[英]Creating custom tag for Converter with attributes

我在網上找到了一個轉換器,並盡可能地將其改為我的需求。 問題是我需要添加一個必須檢查的標志(即字符串),並且轉換器必須將某個模式應用於字符串。

定制轉換器:

@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" />

或類似的東西,讓它使用正確的模式。

關於如何做到這一點的任何想法?

您需要在*.taglib.xml中將自定義轉換器注冊為新標記,其中您可以根據需要指定*.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 ,那么您也可以使用<o:converter>保存上面的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>      

它將透明地將這些屬性設置為轉換器屬性。

你應該使用<f:attribute/>

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

在轉換器中,您可以調用component.getAttributes().get("myCoolFlag");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM