【问题标题】:Default value on JSP custom-tag attributeJSP 自定义标签属性的默认值
【发布时间】:2011-03-09 08:42:04
【问题描述】:

在为自定义 JSP 标签定义属性时,是否可以指定默认值? attribute 指令没有默认值属性。目前我正在做:

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

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

有没有更好的办法?

【问题讨论】:

    标签: java jsp jsp-tags default-value


    【解决方案1】:

    有更好的办法:

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

    【讨论】:

    • ...
    • 好的,如果指定了属性并传递了一个空字符串(并且应该使用这个空字符串而不是默认值)的情况呢?如何区分“未指定属性”、“指定属性但传递了空值”、“指定了属性但传递了空值”、“未指定属性但有非空servlet”的情况同名变量”?
    【解决方案2】:

    所以我无法想办法将它添加到attribute 指令本身;该指令似乎不支持此功能。但是,我能够创建一个封装&lt;c:if&gt;...&lt;/c:if&gt; 逻辑的标签。我不得不用 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 可选猴子

    你好猴子

    你好 17

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多