53 votes

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

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 ? L'adresse 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>

Y a-t-il un meilleur moyen ?

59voto

Grzesiek D. Points 656

Il y a un meilleur moyen :

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

Pas besoin de balise personnalisée en Java ni de tld. Juste une simple JSP EL et un 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>

0 votes

<c:if test="${empty title ? 'Default Title' : 'New Title'}"> ... </c:if>

1 votes

OK, qu'en est-il du cas où l'attribut est spécifié et une chaîne vide est passée (et il est censé utiliser cette chaîne vide au lieu de la valeur par défaut) ? Comment distinguer les cas "aucun attribut n'est spécifié", "l'attribut est spécifié mais une valeur vide est passée", "l'attribut est spécifié mais une valeur nulle est passée", "l'attribut n'est pas spécifié, mais il existe une variable de servlet non vide avec le même nom" ?

23voto

Vivin Paliath Points 40975

Je n'ai donc pas réussi à trouver un moyen d'ajouter ceci à l' attribute Il semble que la directive ne prenne pas en charge cette fonctionnalité. J'ai cependant réussi à créer une balise qui encapsule la directive <c:if>...</c:if> logique. J'ai dû écrire la balise en Java car il n'existe aucun moyen (à ma connaissance) d'utiliser une valeur d'attribut comme nom de variable.

J'ai d'abord écrit le fichier de balises comme une 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>

Puis j'ai fait un tag personnalisé qui utilise ce 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}

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 ça m'a donné :

singes facultatifs helloThar

HelloThere singes

HelloYou 17

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X