2012-02-22 3 views
5

JSF + RF를 2 년 이상 사용해 왔으며 컴포넌트의 기존 기능을 확장 할 기회가 없었습니다.h : custom 기능을위한 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.tag 파일의 내용을 넣어, JSP하지 Facelets의를 사용하고 있다고 가정하면, /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를 사용할 수 있습니다.

@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="#{teststep.name}"> 
    <f:converter converterId="substringConverter" /> 
    <f:attribute name="maxlength" value="25" /> 
</h:outputText> 

또한 사용자 정의 EL 함수를 만들 수 있습니다. 당신이

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

으로 끝낼 수 있도록 EL 기능의 구체적인 예는이 대답에 나와있다 : 나는 첫 번째 솔루션을 시도 How to concatenate Strings in EL?

+0

그 didnt가 나를 감동 :)하지만 같은 일을하고 싶습니다 . h : outputText의 기능을 유지하면서 더 많은 기능 만 추가 할 수 있습니까? – Satya

+0

나는 세 번째 옵션을 시도해 볼 것이다. 나를 위해 새로운 것을 배우는 것처럼 보인다. :) 고맙습니다. BalusC – Satya

+0

기존 구성 요소에 새 속성을 추가하는 것은 맞춤 태그가 아닌 맞춤 구성 요소에서만 가능합니다. 이것은 매우 지루한 작업입니다. ** 모든 ** 기존 태그 속성은 기존 태그에서 상속 할 수 없으므로 복사해야합니다. 여분의 속성을''으로 제공하고 디폴트'Renderer'를 오버라이드하는 것이 더 쉽습니다. – BalusC

관련 문제