2012-02-22 25 views
5

मैं 2 से अधिक वर्षों से जेएसएफ + आरएफ का उपयोग कर रहा हूं और घटकों की मौजूदा क्षमताओं को विस्तारित करने का मौका नहीं मिला है।एच बढ़ाएं: कस्टम कार्यक्षमता के लिए 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 लाइनों हर की बॉयलरप्लेट कोड से बचना चाहते हैं) तो कस्टम ज के बारे में सोचा: outputText ट्रिम सुविधा प्रदान करने के।

तुम मुझे पता है कि मैं JSF

में कस्टम टैग लिखते थे जाने सका

सादर, सत्या

उत्तर

10

यह मानते हुए कि आप /WEB-INF में JSP नहीं Facelets का उपयोग कर रहे हैं, एक .tag फ़ाइल में सामग्री डाल दिया, /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; 
    } 
} 

साथ

आप कस्टम ईएल समारोह बना सकते हैं। ताकि तुम

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

अंत ईएल समारोह का एक ठोस उदाहरण इस जवाब में दी गई है: How to concatenate Strings in EL?

+0

मैं 1 समाधान की कोशिश की है और कि फ्लॉप मुझे प्रभावित :) लेकिन जैसे कुछ करना चाहते हैं । क्या एच के आउटपुट को अभी भी बरकरार रखने के किसी भी मौके से: outputText और केवल कुछ और क्षमताओं को जोड़ना है? – Satya

+0

मैं तीसरे विकल्प की कोशिश करूंगा, ऐसा लगता है कि मेरे लिए कुछ नया सीख रहा है :)। धन्यवाद बहुत सारे BalusC – Satya

+0

किसी मौजूदा घटक में एक नई विशेषता जोड़ना केवल कस्टम घटक द्वारा संभव है, कस्टम टैग नहीं। यह एक बहुत ही कठिन काम है। आपको ** सभी ** मौजूदा टैग विशेषताओं की प्रतिलिपि बनाना है क्योंकि मौजूदा टैग से उत्तराधिकारी संभव नहीं है। आसान '' के रूप में अतिरिक्त विशेषता प्रदान करना और डिफ़ॉल्ट 'रेंडरर' को ओवरराइड करना होगा। – BalusC