大可制作:QQ群:31564239(asp|jsp|php|mysql)

JSP/Servlet: 自订标签属性

像HTML等标签语言在使用时都可以设定属性,例如:
<font size="3" color="blue">
 

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

  • 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;
}
}

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>