Значение по умолчанию для атрибута custom-tag JSP

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

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

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

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


person Vivin Paliath    schedule 28.06.2010    source источник


Ответы (2)


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

<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>
person G. Demecki    schedule 15.01.2014
comment
‹C: if test = $ {empty title? «Заголовок по умолчанию»: «Новый заголовок»} ›...‹ / c: if › - person TheBilTheory; 22.01.2019
comment
Хорошо, а как насчет случая, когда указан атрибут и передается пустая строка (и предполагается, что эта пустая строка будет использоваться вместо значения по умолчанию)? Как различать случаи, когда атрибут не указан, атрибут указан, но передается пустое значение, атрибут указан, но передается нулевое значение, атрибут не указан, но существует непустая переменная сервлета с тем же именем? - person izogfif; 19.02.2020

Так что я не смог придумать, как добавить это к самой директиве 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 необязательные обезьяны

привет там обезьяны

привет тебе 17

person Vivin Paliath    schedule 29.06.2010