2010-06-28 3 views
41

При определении атрибута для настраиваемого тега JSP можно ли указать значение по умолчанию? Директива attribute не имеет атрибута значения по умолчанию. В настоящее время я занимаюсь:Значение по умолчанию для атрибута custom-tag JSP

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

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

Есть ли лучший способ?

ответ

41

Существует лучший способ:

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

Нет необходимости в пользовательских тегов в Java, ни TLD. Просто простой JSP EL и условный оператор.


На мой взгляд, он короче и чище, чем старый:

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

С уважением

22

Так что я не смог найти способ добавить это в директиву attribute; что директива не поддерживает эту функциональность. Однако я смог создать тег, который инкапсулирует логику <c:if>...</c:if>. Мне пришлось писать тег в Java, потому что нет способа (который я знаю) использовать значение атрибута в качестве имени переменной.

Сначала я написал файл тегов как класс 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; 
    } 
} 

Затем я сделал 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> 

Тогда я сделал пользовательский тег, который использует этот тэг:

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} 

После этого я сделал страницу, чтобы проверить тег Я только что создали:

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

И это дало мне:

helloThar факультативные обезьяны

helloThere обезьян

helloYou 17

Смежные вопросы