JSP 自定义标签属性的默认值
Posted
技术标签:
【中文标题】JSP 自定义标签属性的默认值【英文标题】:Default value on JSP custom-tag attribute 【发布时间】:2011-03-09 08:42:04 【问题描述】:在为自定义 JSP 标签定义属性时,是否可以指定默认值? attribute
指令没有默认值属性。目前我正在做:
<%@ attribute name="myAttr" required="false" type="java.lang.String" %>
<c:if test="$empty myAttr" >
<c:set var="myAttr" value="defaultValue" />
</c:if>
有没有更好的办法?
【问题讨论】:
【参考方案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>
【讨论】:
所以我无法想办法将它添加到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 可选猴子
你好猴子
你好 17
【讨论】:
以上是关于JSP 自定义标签属性的默认值的主要内容,如果未能解决你的问题,请参考以下文章