2010-06-28 71 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