Java JSP 自定义标签属性的默认值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3136415/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 16:46:09  来源:igfitidea点击:

Default value on JSP custom-tag attribute

javajspjsp-tagsdefault-value

提问by Vivin Paliath

When defining an attribute for a custom JSP tag, is it possible to specify a default value? The attributedirective doesn't have a default value attribute. Currently I'm making do with:

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

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

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

Is there a better way?

有没有更好的办法?

采纳答案by G. Demecki

There is a better way:

有一个更好的方法:

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

No need for custom tag in Java nor tld. Just plain JSP EL and conditional operator.

Java 和 tld 中不需要自定义标签。只是普通的 JSP EL 和条件运算符。



In my opinion it is shorter and cleaner than old:

在我看来,它比旧的更短更干净:

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

回答by Vivin Paliath

So I wasn't able to figure out a way to add this to the attributedirective itself; it appears that the directive does not support this functionality. I was, however, able to create a tag that encapsulates the <c:if>...</c:if>logic. I had to write the tag in Java since there is no way (that I know of) to use an attribute value as a variable name.

所以我无法想出一种方法将它添加到attribute指令本身;该指令似乎不支持此功能。但是,我能够创建一个封装<c:if>...</c:if>逻辑的标签。我不得不用 Java 编写标签,因为没有办法(据我所知)使用属性值作为变量名。

First I wrote the tag file as a Java class:

首先,我将标记文件编写为 Java 类:

DefaultTag.java

默认标签.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;
    }
}

Then I made a tldfile:

然后我做了一个tld文件:

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

Then I made a custom tag that uses this tag:

然后我制作了一个使用这个标签的自定义标签:

defaultTest.tag

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}

After that I made a page to test the tag I just created:

之后我做了一个页面来测试我刚刚创建的标签:

tagTest.jsp

标签测试.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/>

And that gave me:

这给了我:

helloThar optional monkeys

helloThere monkeys

helloYou 17

你好塔尔可选猴子

你好有猴子

你好你 17