java - tag - Valor predeterminado en el atributo de etiqueta personalizada JSP
tag lib java (2)
Así que no pude encontrar una manera de agregar esto a la directiva de attribute
sí misma; parece que la directiva no admite esta funcionalidad. Sin embargo, pude crear una etiqueta que encapsula la lógica <c:if>...</c:if>
. Tuve que escribir la etiqueta en Java, ya que no hay forma (que yo sepa) de usar un valor de atributo como nombre de variable.
Primero escribí el archivo de etiqueta como una clase de 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;
}
}
Luego hice un archivo 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>
Luego hice una etiqueta personalizada que usa esta etiqueta:
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}
Después de eso, hice una página para probar la etiqueta que acabo de crear:
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/>
Y eso me dio:
helloThar monos opcionales
Hola, monos
hola tu 17
Al definir un atributo para una etiqueta JSP personalizada, ¿es posible especificar un valor predeterminado? La directiva de attribute
no tiene un atributo de valor predeterminado. Actualmente me las estoy arreglando con:
<%@ attribute name="myAttr" required="false" type="java.lang.String" %>
<c:if test="${empty myAttr}" >
<c:set var="myAttr" value="defaultValue" />
</c:if>
¿Hay una mejor manera?
Hay una mejor manera:
<c:set var="title" value="${(empty title) ? ''Default title'' : title}" />
No hay necesidad de una etiqueta personalizada en java ni tld. Simplemente JSP EL y operador condicional.
En mi opinión, es más corto y más limpio que viejo:
<c:if test="${empty title}" >
<c:set var="title" value="Default title" />
</c:if>
Saludos