JSP自定義標簽-標簽屬性_動力節(jié)點Java學(xué)院整理
對自定義標簽添加一些屬性,可以使我們的標簽功能更加靈活和復(fù)用。例如前一篇博客使用簡單標簽來對標簽體內(nèi)容執(zhí)行一定的次數(shù),就無法在標簽上規(guī)定要執(zhí)行的次數(shù),必須在標簽處理器類中修改,很不方便,如果使用帶屬性的標簽就能很好的解決這個問題。
要想使簡單標簽具有屬性,通常需要滿足以下兩個步驟:
?、?在標簽處理器類中定義屬性,同時為每個屬性生成setter方法;
?、?在TLD文件中對于的<tag>標簽下添加屬性的<attribute>標簽,同時<attribute>標簽下定義其從標簽,其中<name>從標簽是必須要有的。<attribute>標簽所擁有的從標簽如下:

name標簽:用于指定標簽中屬性的名稱。
required標簽:指定該屬性是否必須。
rtexprvalue標簽:指定該屬性是否支持運行時表達式,如JSP表達式(<%=value %>)和EL表達式( ${value} )。如果我們設(shè)定為“false”的話,那么該屬性只能支持字符串。
例1:使用簡單標簽來控制標簽體內(nèi)容執(zhí)行次數(shù)(帶屬性標簽方式)
編寫標簽處理器類:
package com.bjpowernode.simpletag;
public class LoopTagBody extends SimpleTagSupport {
private int count; //定義一個屬性,用來指定循環(huán)次數(shù)
public void setCount(int count) { //為該屬性設(shè)置setter方法
this.count = count;
}
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();
for(int i=0;i<this.count;i++) { //使用屬性就可以指定循環(huán)次數(shù)
fragment.invoke(null);
}
}
}
在TLD文件中定義和描述標簽處理器類,同時指定標簽所在的uri:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>simpletag</uri>
<tag>
<name>loopbody</name>
<tag-class>com.bjpowernode.simpletag.LoopTagBody</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
在JSP頁面的開頭導(dǎo)入taglib指令:
<%@ taglib uri="simpletag" prefix="simple" %>
最后就能在JSP頁面的主體中使用剛才定義好的帶屬性的簡單標簽了,使用“count”屬性就能指定標簽體循環(huán)的次數(shù):
<simple:loopbody count="5">
神樂! <br>
</simple:loopbody>
在瀏覽器中觀察:
通過上面的例子我們也可以看到,雖然“count”屬性在標簽處理器LoopTagBody類中的類型為int整型,但是在標簽上傳入的是字符串類型,這是因為JSP容器支持將標簽的屬性類型(字符串)轉(zhuǎn)換為八大基本數(shù)據(jù)類型。如果在標簽處理器類中定義一個非八大基本數(shù)據(jù)類型的屬性,那么上面的以上面的方式必定要報錯,因為JSP容器無法將字符串轉(zhuǎn)換為其它類型。除非在標簽屬性中使用其它類型:
例2:
package com.bjpowernode.simpletag;
public class DateAttributeTag extends SimpleTagSupport {
private Date date;
public void setDate(Date date) {
this.date = date;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().write(date.toString());
}
}
在TLD文件中描述(這里省略首尾,詳細內(nèi)容請看例1):
<tag>
<name>showtime</name> <tag-class>com.bjpowernode.simpletag.DateAttributeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
注:這里<rtexprvalue>標簽是必須要的。
在JSP頁面中導(dǎo)入taglib指令(此處略)后,在JSP頁面的主體中使用剛才定義的簡單標簽:
<simple:showtime date="<%=new Date() %>"/>
在瀏覽器中觀察:

因為在JSP頁面屬性上若以字符串,則因為在標簽處理器類并非八大基本數(shù)據(jù)類型,因此只能使用JSP表達式或EL表達式將對象傳入,因此必須在TLD文件中將<rtexprvalue>標簽設(shè)置為“true”。
簡單標簽的應(yīng)用,包括無屬性的和帶屬性的標簽如何使用都已經(jīng)學(xué)習(xí)完畢,內(nèi)容就這么多,剩下的就可以根據(jù)所學(xué)的進行開發(fā)了。
例3:使用簡單標簽來防盜鏈
如果某個JSP頁面需要防止被別的網(wǎng)站盜鏈,可以在該JSP頁面的最開始部分使用一個簡單標簽,添加一些屬性如指定從哪過來的網(wǎng)站才可以瀏覽本頁面內(nèi)容,指定如果是非指定網(wǎng)址過來的鏈接應(yīng)該先讓請求跳到哪里去。
編寫標簽處理器類:
package com.bjpowernode.simpletag;
public class RefererTag extends SimpleTagSupport {
private String site; //指定允許來訪請求的網(wǎng)址
private String location; //若非指定來訪請求的網(wǎng)址應(yīng)該先跳轉(zhuǎn)到哪里去
public void setSite(String site) {
this.site = site;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) this.getJspContext();
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
String requestUrl = request.getHeader("referer");
if(requestUrl==null || !requestUrl.startsWith(site)) {
response.sendRedirect(request.getContextPath()+this.location);
throw new SkipPageException();
}
}
}
在TLD文件中描述(這里省略首尾,詳細內(nèi)容請看例1):
<tag>
<name>referer</name>
<tag-class>com.bjpowernode.simpletag.RefererTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>site</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>location</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
在JSP頁面中導(dǎo)入taglib指令(此處略)后,在JSP頁面的主體中使用剛才定義的簡單標簽:
<simple:referer site="http://www.bjpowernode.com" location="/index.jsp" /> <!DOCTYPE HTML> <html> <head> <title>My JSP 'simpletagdemo.jsp' starting page</title> </head> 。。。 </html>
結(jié)果:若想訪問該JSP頁面,只有滿足請求的URL前綴為page屬性指定的網(wǎng)址才能訪問,如果是別的web中的超鏈接或者直接在瀏覽器中輸入該JSP的URL,都會被跳轉(zhuǎn)到location屬性指定的網(wǎng)頁。
例4:使用簡單標簽將標簽體中的HTML過濾轉(zhuǎn)義
編寫標簽處理器類:
package com.bjpowernode.simpletag;
public class HtmlFilterTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();
StringWriter writer = new StringWriter();
fragment.invoke(writer);
StringBuffer buffer = writer.getBuffer();
String content = filter(buffer.toString());
this.getJspContext().getOut().write(content);
}
public String filter(String message) {
if (message == null)
return (null);
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
}
其中過濾方法filter方法可以在Tomcat中參考代碼(位置:【Tomcat】--->【webapps】--->【examples】--->【W(wǎng)EB-INF】--->【classes】--->【utils】--->“HTMLFilter.java”)。
在TLD文件中定義和描述標簽:
<tag>
<name>filterhtml</name>
<tag-class>com.bjpowernode.simpletag.HtmlFilterTag</tag-class>
<body-content>scriptless</body-content>
</tag>
在JSP頁面中的主體部分中使用剛才自定義的簡單標簽:
<simple:filterhtml>
<a href="www.baidu.com" rel="external nofollow" >百度</a>
</simple:filterhtml>
瀏覽器中觀察:

相關(guān)文章
jsp實現(xiàn)仿QQ空間新建多個相冊名稱并向相冊中添加照片功能
這篇文章主要介紹的是新建相冊,可以建多個相冊,在相冊中添加多張照片,刪除照片,刪除相冊,當相冊下有照片時先刪除照片才能刪除相冊,具體實現(xiàn)代碼,大家參考下本文吧2017-04-04
SSM框架JSP使用Layui實現(xiàn)layer彈出層效果
這篇文章主要介紹了SSM框架JSP使用Layui實現(xiàn)layer彈出層效果,文章通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
jsp+ajax實現(xiàn)的局部刷新較驗驗證碼(onblur事件觸發(fā)較驗)
這篇文章主要介紹了jsp+ajax實現(xiàn)的局部刷新較驗驗證碼,基于onblur事件觸發(fā)較驗功能,以實例形式詳細的分析了前臺顯示、圖片生成及Ajax動態(tài)驗證等詳細技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
基于javaweb+jsp實現(xiàn)學(xué)生宿舍管理系統(tǒng)
這篇文章主要介紹了基于javaweb+jsp實現(xiàn)的學(xué)生宿舍管理系統(tǒng)的示例代碼,文中的代碼介紹詳細,對我們學(xué)習(xí)JSP有一定的幫助,需要的朋友可以參考一下2021-12-12

