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>
Y a-t-il une meilleure façon?
Il y a un meilleur moyen:
<c:set var="title" value="${(empty title) ? 'Default title' : title}" />
Pas besoin de balise personnalisée dans Java ni tld. Juste JSP EL simple 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>
Je n'ai donc pas été en mesure de trouver un moyen d'ajouter cela à la directive attribute
elle-même; il semble que la directive ne prend pas en charge cette fonctionnalité. J'ai cependant pu créer une balise qui encapsule le <c:if>...</c:if>
logique. J'ai dû écrire la balise dans Java car il n'y a aucun moyen (à ma connaissance) d'utiliser une valeur d'attribut comme nom de variable.
J'ai d'abord écrit le fichier de balises sous la forme Java class:
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;
}
}
J'ai ensuite créé un fichier 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>
Ensuite, j'ai créé une balise personnalisée qui utilise cette balise:
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 cela m'a donné:
helloThar singes en option
bonjour il y a des singes
bonjourvous 17