Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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>

Привет

Ответ 2

Поэтому мне не удалось найти способ добавить это в директиву 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