From Gossip@caterpillar

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>