Valeur par défaut sur l'attribut JSP custom-tag

Lors de la définition d'un attribut pour une balise JSP personnalisée, est-il possible de spécifier une valeur par défaut? La directive attribute n'a pas d'attribut de valeur par défaut. Actuellement, je me contente de:

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

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

Est-il un meilleur moyen?

46
demandé sur Vivin Paliath 2010-06-29 01:51:31

2 réponses

Il y a un meilleur moyen:

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

Pas besoin de tag personnalisé en Java ni tld. Tout simplement JSP el et opérateur conditionnel.


, À mon avis, il est plus court et plus propre que l'ancien:

<c:if test="${empty title}" >
 <c:set var="title" value="Default title" />
</c:if>
49
répondu G. Demecki 2018-08-30 07:27:31

Donc, je n'ai pas pu trouver un moyen d'ajouter ceci à la directive attribute elle-même; il semble que la directive ne supporte pas cette fonctionnalité. J'ai cependant été capable de créer une balise qui encapsule la logique <c:if>...</c:if>. J'ai dû écrire la balise en Java car il n'y a aucun moyen (que je connaisse) d'utiliser une valeur d'attribut comme nom de variable.

J'ai d'abord écrit le fichier de balise en tant que classe 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;
    }
}

Puis j'ai fait un tld fichier:

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>

Ensuite, j'ai fait une balise personnalisée qui utilise cette balise:

Defaultest.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}

Après cela, j'ai fait une page pour tester la balise que je viens de créer:

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

Et cela m'a donné:

HelloThar singes optionnels

HelloThere singes

HelloYou 17

22
répondu Vivin Paliath 2010-06-30 15:58:26