2012-02-22 14 views
5

He estado utilizando JSF + RF durante más de 2 años y no he tenido la oportunidad de ampliar las capacidades existentes de los componentes.Ampliar h: Texto de salida para funcionalidad personalizada

Ahora el requisito es que tengo que recortar la cuerda y mostrarla si tiene más de 25 caracteres.

Esto se ha logrado de la siguiente manera

     <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> 

Pero utilizar este código en muchos muchos lugares (y quiera evitar código estándar de 8 líneas everytime) por lo que se cree de la costumbre h: outputText para proporcionar funcionalidad de ajuste.

Podría usted, hágamelo saber cómo iba a escribir una etiqueta personalizada en JSF

Saludos, Satya

Respuesta

10

Suponiendo que usted está utilizando JSP no Facelets, poner el contenido en un archivo .tag en /WEB-INF, como /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> 

A continuación, puede hacer referencia a ella de la siguiente manera:

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

También es posible usar un Converter.

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

con

@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; 
    } 
} 

También puede crear una función EL personalizado. De manera que se termina con

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

Un ejemplo concreto de la función de EL se da en esta respuesta: How to concatenate Strings in EL?

+0

He probado la primera solución y esa no me impresiona :) pero le gustaría hacer algo como . ¿Es posible que todavía conserve características de h: outputText y solo agregue algunas capacidades más? – Satya

+0

Haré una prueba para la tercera opción, parece ser algo nuevo para mí :). Muchas gracias BalusC – Satya

+0

Agregar un nuevo atributo a un componente existente solo es posible mediante un componente personalizado, no una etiqueta personalizada. Este es un trabajo muy tedioso. Debe copiar ** todos los atributos de etiqueta existentes, ya que no es posible heredarlos de las etiquetas existentes. Más fácil sería proporcionar el atributo adicional como '' y anular el 'Renderer' predeterminado. – BalusC

Cuestiones relacionadas