ITEEDU

JSP/Servlet: 自订卷标属性

像HTML等卷标语言在使用时都可以设定属性,例如:

<font size="3" color="blue"> 
ValidateTag.java package onlyfun.caterpillar; 
import java.io.*; 
import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 
public class ValidateTag extends TagSupport { 
private String username; 
private String password; 
public void setUsername(String username) { 
this.username = username; 
} 
public void setPassword(String password) { 
this.password = password; 
} 
public int doEndTag() throws JspException { 
if(username.equals("justin") && 
password.equals("toto")) { 
return EVAL_PAGE; 
} 
return SKIP_PAGE; 
} 
} 

您也可以在自订卷标库时,让卷标处理类别接受属性设定,这只要透过setter就可以了,例如写一个简单的验证使用者名称与密码的卷标处理类别,如下:

setUsername()与setPassword两个setter分别用作自订标签中username与password两个属性,要在tld档案中指定这两个属性使用时的条件:

validate.tld
<tag> 
<description>Validate User</description> 
<name>validate</name> 
<tag-class>onlyfun.caterpillar.ValidateTag</tag-class> 
<body-content>empty</body-content>
<attribute> 
<name>username</name> 
<required>true</required> 
<rtexprvalue>true</rtexprvalue> 
</attribute> 
<attribute> 
<name>password</name> 
<required>true</required> 
<rtexprvalue>true</rtexprvalue> 
</attribute> 
</tag> 
... 

在tld文件中是在<attribute>中设定属性条件,<required>用来指定属性是否一定要使用,若设定为true, 则一定要使用指定的属性,设定为false表示属性为可选的(optional),<rtexprvalue>用来表示属性指定时,是否可以 使用表示式等动态属性,例如 EL ${param.username}这样的指定,如果设定为true表示可以,设定为false表示必须为静态属性。

同样的,您可以选择在web.xml中指定tld档与uri的对应,接下来撰写一个简单的程序来测试:

test.jsp
<%@taglib prefix="caterpillar" 
uri="http://caterpillar.onlyfun.net/"%> 
<html> 
<body> 
这个网页要使用者名称与密码才看的到喔。。。。。<br><br>
<caterpillar:validate username="${param.username}" 
password="${param.password}"/>
<H1>嗨!${param.username},请领取您的机密文件。。。。</H1>
</body> 
</html> 

为了要看到<caterpillar:validate>标签下的网页内容,您必须指定正确的username与password,例如:

http://localhost:8080/myjsp/test.jsp?username=justin&password=toto

这样的话,JSP网页会传回以下的内容:

<html> 
<body> 
这个网页要使用者名称与密码才看的到喔。。。。。<br><br>
<H1>嗨!justin,请领取您的机密文件。。。。</H1>
</body> 
</html>