2010-06-28 31 views
41

Al definir un atributo para una etiqueta JSP personalizada, ¿es posible especificar un valor predeterminado? La directiva attribute no tiene un atributo de valor predeterminado. Actualmente me estoy conformando con:Valor predeterminado en el atributo de etiqueta personalizada JSP

<%@ attribute name="myAttr" required="false" type="java.lang.String" %> 

<c:if test="${empty myAttr}" > 
<c:set var="myAttr" value="defaultValue" /> 
</c:if> 

¿Hay una manera mejor?

Respuesta

41

Hay una mejor manera:

<c:set var="title" value="${(empty title) ? 'Default title' : title}" /> 

No hay necesidad de etiqueta personalizada en Java ni TLD. Simplemente JSP EL y operador condicional.


En mi opinión, es más corto y más limpio que antigua:

<c:if test="${empty title}" > 
<c:set var="title" value="Default title" /> 
</c:if> 

Saludos

22

Así que no pude encontrar una manera de agregar esto a la directiva attribute; parece que la directiva no admite esta funcionalidad. Sin embargo, pude crear una etiqueta que encapsula la lógica <c:if>...</c:if>. Tuve que escribir la etiqueta en Java, ya que no hay forma (que yo sepa) de usar un valor de atributo como nombre de variable.

Primero escribió el archivo de etiqueta como una clase Java:

DefaultTag.java

public class DefaultTag extends BodyTagSupport { 

    private String var; 
    private Object value; 

    //for tag attribute 
    public void setVar(String var) { 
     this.var = var; 
    } 

    //for tag attribute 
    public void setValue(Object value) { 
     this.value = value; 
    } 

    public int doEndTag() throws JspException { 
     Object oldValue = pageContext.getAttribute(var); 
     Object newValue; 

     if(value != null) { 
      newValue = value; 
     } 

     else { 
      if(bodyContent == null || bodyContent.getString() == null) { 
       newValue = ""; 
      } 

      else { 
       newValue = bodyContent.getString().trim(); 
      } 
     } 

     if(oldValue == null) { 
      pageContext.setAttribute(var, newValue); 
     } 

     else if(oldValue.toString().trim().length() == 0) { 
      pageContext.setAttribute(var, newValue); 
     } 

     return EVAL_PAGE; 
    } 
} 

Entonces hice un archivo tld:

utils.tld:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<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-jsptaglibrary_2_1.xsd" 
     version="2.1"> 
    <tlib-version>2.0</tlib-version> 
    <short-name>utils</short-name> 
    <uri>http://utils</uri> 
    <tag> 
     <name>default</name> 
     <tag-class>com.mystuff.mvc.tag.DefaultTag</tag-class> 
     <body-content>JSP</body-content> 
     <attribute> 
      <name>var</name> 
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue> 
     </attribute> 
     <attribute> 
      <name>value</name> 
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue> 
     </attribute> 
    </tag> 
</taglib> 

Entonces hice una etiqueta personalizada que utiliza esta etiqueta:

defaultTest.tag

<%@ taglib prefix="utils" uri="/WEB-INF/tlds/utils.tld" %> 
<%@ attribute name="value" required="true"%> 
<%@ attribute name="optValue" required="false"%> 

<utils:default var="optValue" value="optional monkeys"/> 

${value} ${optValue} 

Después de que hice una página para probar la etiqueta que acaba de crear:

tagTest. JSP

<mystuff:defaultTest value="helloThar" /><br/><br/> 

<mystuff:defaultTest value="helloThere" optValue="monkeys" /><br/><br/> 

<mystuff:defaultTest value="helloYou" optValue="${1 + 2 + 4 + 10}" /><br/><br/> 

Y eso me dio:

helloThar monos opcionales

helloThere monos

helloYou 17

Cuestiones relacionadas