2012-02-22 174 views
5

我已經使用JSF + RF超過2年了,並且沒有機會擴展組件的現有功能。爲自定義功能擴展h:outputText

現在需求是我必須修剪字符串,並顯示它,如果它是超過25個字符。

取得這樣的成績如下

     <c:choose> 
          <c:when test="#{fn:length(teststep.name) > 25}"> 
           <h:outputText title="#{teststep.name}" value="#{fn:substring(teststep.name, 0, 25)}..."/> 
          </c:when> 
          <c:otherwise> 
           <h:outputText title="#{teststep.name}" value="#{teststep.name}"/> 
          </c:otherwise> 
         </c:choose> 

但是我用在很多很多地方的代碼(並且希望避免的8行每次樣板代碼),所以想到定製H:的outputText提供微調功能。

你能不能讓我知道我怎麼會寫在JSF

自定義標籤

問候, 薩蒂亞

回答

10

假設你正在使用JSP不Facelets的,放在一個.tag文件中的內容/WEB-INF,像/WEB-INF/tags/outputLimitedText.tag

<%@ tag body-content="empty" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> 
<c:choose> 
    <c:when test="#{fn:length(value) > maxlength}"> 
     <h:outputText title="#{value}" value="#{fn:substring(value, 0, maxlength)}..."/> 
    </c:when> 
    <c:otherwise> 
     <h:outputText title="#{value}" value="#{value}"/> 
    </c:otherwise> 
</c:choose> 

然後你就可以引用它,如下:

<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> 
... 
<my:outputLimitedText value="#{teststep.name}" maxlength="25" /> 

你也可以使用一個Converter

<h:outputText title="#{teststep.name}" value="#{teststep.name}"> 
    <f:converter converterId="substringConverter" /> 
    <f:attribute name="maxlength" value="25" /> 
</h:outputText> 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    String string = (String) value; 
    int maxlength = Integer.valueOf((String) component.getAttributes().get("maxlength")); 

    if (string.length() > maxlength) { 
     return string.substring(0, maxlength) + "..."; 
    } else { 
     return string; 
    } 
} 

你還可以創建自定義EL函數。所以,你最終與

<h:outputText title="#{teststep.name}" value="#{util:ellipsis(teststep.name, 25)}"> 

EL函數的具體例子在這個答案給出:How to concatenate Strings in EL?

+0

我已經嘗試了第一個解決辦法,didnt打動我:)但是想這樣做。是否有可能仍然保留h:outputText的功能,並只添加更多功能? – Satya 2012-02-22 15:09:32

+0

我會嘗試第三個選項,似乎是對我來說一些新的學習:)。非常感謝BalusC – Satya 2012-02-22 15:10:49

+0

向現有組件添加新屬性只能使用自定義組件,而不能使用自定義標籤。這是一項非常乏味的工作。您必須複製**所有**現有的標籤屬性,因爲它無法從現有標籤繼承。更容易的是提供額外的屬性爲''並覆蓋默認的'Renderer'。 – BalusC 2012-02-22 15:12:55