2010-06-28 39 views
41

爲定製JSP標記定義屬性時,是否可以指定默認值? attribute指令不具有默認值屬性。目前我正在做: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