一、編寫標籤處理器類:RefererTag.javahtml
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.PageContext; 8 import javax.servlet.jsp.SkipPageException; 9 import javax.servlet.jsp.tagext.SimpleTagSupport; 10 11 /** 12 * @author gacl 13 * 防盜鏈標籤RefererTag 14 */ 15 public class RefererTag extends SimpleTagSupport { 16 17 /** 18 * 網站域名 19 */ 20 private String site; 21 22 /** 23 * 要跳轉的頁面 24 */ 25 private String page; 26 27 @Override 28 public void doTag() throws JspException, IOException { 29 //獲取jsp頁面的PageContext對象 30 PageContext pageContext = (PageContext) this.getJspContext(); 31 //經過PageContext對象來獲取HttpServletRequest對象 32 HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); 33 //獲取請求的來路(Referer) 34 String referer = request.getHeader("referer"); 35 //若是來路是null或者來路不是來自咱們本身的site,那麼就將請求重定向到page頁面 36 if (referer == null || !referer.startsWith(site)) { 37 //獲取HttpServletResponse對象 38 HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 39 String webRoot = request.getContextPath(); 40 if (page.startsWith(webRoot)) { 41 //重定向到page頁面 42 response.sendRedirect(page); 43 } else { 44 //重定向到page頁面 45 response.sendRedirect(webRoot+page); 46 } 47 //重定向後,控制保護的頁面不要執行 48 throw new SkipPageException(); 49 } 50 } 51 52 public void setSite(String site) { 53 this.site = site; 54 } 55 56 public void setPage(String page) { 57 this.page = page; 58 } 59 }
二、在WEB-INF目錄下tld文件中添加對該標籤的描述,以下:java
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> 6 7 <description>孤傲蒼狼開發的簡單標籤庫</description> 8 <tlib-version>1.0</tlib-version> 9 <short-name>TagLib</short-name> 10 <uri>/gaclTagLib</uri> 11 12 <tag> 13 <!-- 標籤名 --> 14 <name>referer</name> 15 <!-- 標籤處理器類 --> 16 <tag-class>me.gacl.web.simpletag.RefererTag</tag-class> 17 <!-- 標籤體容許的內容 --> 18 <body-content>empty</body-content> 19 <!-- 標籤的屬性描述 --> 20 <attribute> 21 <description>描述標籤的site屬性</description> 22 <!-- 標籤的site屬性 --> 23 <name>site</name> 24 <required>true</required> 25 <!-- rtexprvalue用來指示標籤的屬性值是否能夠是一個表達式, 通常設置爲true,true就表示容許標籤的屬性值能夠是一個表達式 --> 26 <rtexprvalue>true</rtexprvalue> 27 </attribute> 28 <attribute> 29 <description>描述標籤的page屬性</description> 30 <!-- 標籤的page屬性 --> 31 <name>page</name> 32 <required>true</required> 33 <!-- rtexprvalue用來指示標籤的屬性值是否能夠是一個表達式, 通常設置爲true,true就表示容許標籤的屬性值能夠是一個表達式 --> 34 <rtexprvalue>true</rtexprvalue> 35 </attribute> 36 </tag> 37 38 </taglib>
三、測試:在jsp頁面中導入標籤庫並使用防盜鏈標籤web
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中導入自定義標籤庫 --%> 3 <%@taglib uri="/gaclTagLib" prefix="gacl" %> 4 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 5 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="gacl"%> 6 --%> 7 <%--在Jsp頁面中使用防盜鏈標籤 8 當用戶嘗試直接經過URL地址(http://localhost:8080/JavaWeb_JspTag_study_20140816/simpletag/refererTagTest.jsp)訪問這個頁面時, 9 防盜鏈標籤的標籤處理器內部就會進行處理,將請求重定向到/index.jsp 10 --%> 11 <gacl:referer site="http://localhost:8080" page="/index.jsp"/> 12 <!DOCTYPE HTML> 13 <html> 14 <head> 15 <title>防盜鏈標籤測試</title> 16 </head> 17 18 <body> 19 網站內部資料 20 </body> 21 </html>
運行效果以下:api
一、編寫標籤處理器類:IFTag.java數組
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import javax.servlet.jsp.JspException; 5 import javax.servlet.jsp.tagext.SimpleTagSupport; 6 7 /** 8 * @author gacl 9 * 開發if標籤 10 */ 11 public class IFTag extends SimpleTagSupport { 12 13 /** 14 * if標籤的test屬性 15 */ 16 private boolean test; 17 18 @Override 19 public void doTag() throws JspException, IOException { 20 if (test) { 21 this.getJspBody().invoke(null); 22 } 23 } 24 25 public void setTest(boolean test) { 26 this.test = test; 27 } 28 }
二、在WEB-INF目錄下tld文件中添加對該標籤的描述,以下:tomcat
1 <tag> 2 <description>if標籤</description> 3 <name>if</name> 4 <tag-class>me.gacl.web.simpletag.IFTag</tag-class> 5 <body-content>scriptless</body-content> 6 <attribute> 7 <description>if標籤的test屬性</description> 8 <name>test</name> 9 <rtexprvalue>true</rtexprvalue> 10 <required>true</required> 11 </attribute> 12 </tag>
三、測試:在jsp頁面中導入標籤庫並使用if標籤服務器
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中導入自定義標籤庫 --%> 3 <%@taglib uri="/gaclTagLib" prefix="c" %> 4 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 5 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="c"%> 6 --%> 7 <!DOCTYPE HTML> 8 <html> 9 <head> 10 <title>if鏈標籤測試</title> 11 </head> 12 13 <body> 14 <%--if標籤的test屬性值爲true ,標籤體的內容會輸出--%> 15 <c:if test="true"> 16 <h3>網站內部資料</h3> 17 </c:if> 18 <%--if標籤的test屬性值爲false ,標籤體的內容不會輸出--%> 19 <c:if test="false"> 20 這裏的內部不輸出 21 </c:if> 22 </body> 23 </html>
運行效果以下:app
這個標籤的開發稍微有一點難度,由於這裏面涉及到兩個標籤處理器類共享同一個變量的問題,以下:less
1 <c:when test="${user != null}"> 2 用戶不爲空 3 </c:when> 4 <c:otherwise> 5 用戶爲空 6 </c:otherwise>
<c:when>標籤和<c:otherwise>標籤對應着兩個不一樣的標籤處理器類,咱們但願作到的效果是,若是<c:when>標籤執行了,那麼就<c:otherwise>標籤就不要再執行,那麼這裏面就涉及到一個問題:<c:when>標籤執行的時候該如何通知<c:otherwise>標籤不要執行了呢?這個問題就涉及到了兩個標籤處理器類如何作到相互通信的問題,若是<c:when>標籤執行了,就要經過某種方式告訴<c:otherwise>標籤不要執行,那麼該如何作到這樣的效果呢?讓<c:when>標籤處理器類和<c:otherwise>標籤處理器類共享同一個變量就能夠作到了,那麼又該怎麼作纔可以讓兩個標籤處理器類共享同一個變量呢,標準的作法是這樣的:讓兩個標籤擁有同一個父標籤。jsp
一、開發父標籤:ChooseTag.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import javax.servlet.jsp.JspException; 5 import javax.servlet.jsp.tagext.SimpleTagSupport; 6 7 /** 8 * @author gacl 9 * when標籤和otherwise標籤的父標籤 10 */ 11 public class ChooseTag extends SimpleTagSupport { 12 13 /** 14 * 定義一個boolean類型的屬性,該屬性用於標識該標籤下的某一個子標籤是否已經執行過了, 15 * 若是該標籤下的某一個子標籤已經執行過了,就將該屬性設置爲true 16 */ 17 private boolean isExecute; 18 19 @Override 20 public void doTag() throws JspException, IOException { 21 //輸出標籤體中的內容 22 this.getJspBody().invoke(null); 23 } 24 25 public boolean isExecute() { 26 return isExecute; 27 } 28 29 public void setExecute(boolean isExecute) { 30 this.isExecute = isExecute; 31 } 32 }
二、開發when標籤和otherwise標籤
WhenTag.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import javax.servlet.jsp.JspException; 5 import javax.servlet.jsp.tagext.SimpleTagSupport; 6 7 /** 8 * @author gacl 9 * when標籤 10 */ 11 public class WhenTag extends SimpleTagSupport { 12 13 /** 14 * test屬性,該屬性值爲true時,輸出標籤體中的內容 15 */ 16 private boolean test; 17 18 @Override 19 public void doTag() throws JspException, IOException { 20 //獲取標籤的父標籤 21 ChooseTag parentTag = (ChooseTag) this.getParent(); 22 if (test == true && parentTag.isExecute() == false) { 23 //輸出標籤體中的內容 24 this.getJspBody().invoke(null); 25 //將父標籤的isExecute屬性設置爲true,告訴父標籤,我(when標籤)已經執行過了 26 parentTag.setExecute(true); 27 } 28 } 29 30 public void setTest(boolean test) { 31 this.test = test; 32 } 33 }
OtherWiseTag.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import javax.servlet.jsp.JspException; 5 import javax.servlet.jsp.tagext.SimpleTagSupport; 6 7 /** 8 * @author gacl 9 * otherwise標籤 10 */ 11 public class OtherWiseTag extends SimpleTagSupport { 12 13 @Override 14 public void doTag() throws JspException, IOException { 15 //獲取標籤的父標籤 16 ChooseTag parentTag = (ChooseTag) this.getParent(); 17 //若是父標籤下的when標籤沒有執行過 18 if (parentTag.isExecute() == false) { 19 //輸出標籤體中的內容 20 this.getJspBody().invoke(null); 21 //設置父標籤的isExecute屬性爲true,告訴父標籤,我(otherwise標籤)已經執行過了 22 parentTag.setExecute(true); 23 } 24 } 25 }
三、在WEB-INF目錄下tld文件中添加對ChooseTag、WhenTag、OtherWiseTag這三對標籤的描述,以下:
1 <tag> 2 <description>choose標籤</description> 3 <name>choose</name> 4 <tag-class>me.gacl.web.simpletag.ChooseTag</tag-class> 5 <body-content>scriptless</body-content> 6 </tag> 7 <tag> 8 <description>when標籤</description> 9 <name>when</name> 10 <tag-class>me.gacl.web.simpletag.WhenTag</tag-class> 11 <body-content>scriptless</body-content> 12 <attribute> 13 <description>when標籤的test屬性</description> 14 <name>test</name> 15 <rtexprvalue>true</rtexprvalue> 16 <required>true</required> 17 </attribute> 18 </tag> 19 <tag> 20 <description>otherwise標籤</description> 21 <name>otherwise</name> 22 <tag-class>me.gacl.web.simpletag.OtherWiseTag</tag-class> 23 <body-content>scriptless</body-content> 24 </tag>
四、測試:在jsp頁面中導入標籤庫並測試when和otherwise標籤
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中導入自定義標籤庫 --%> 3 <%@taglib uri="/gaclTagLib" prefix="c" %> 4 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 5 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="c"%> 6 --%> 7 <!DOCTYPE HTML> 8 <html> 9 <head> 10 <title>when和otherwise標籤測試</title> 11 </head> 12 13 <body> 14 <c:choose> 15 <c:when test="${user==null}"> 16 when標籤標籤體輸出的內容: 17 <h3>用戶爲空</h3> 18 </c:when> 19 <c:otherwise> 20 用戶不爲空 21 </c:otherwise> 22 </c:choose> 23 <hr/> 24 <c:choose> 25 <c:when test="${user!=null}"> 26 用戶不爲空 27 </c:when> 28 <c:otherwise> 29 otherwise標籤標籤體輸出的內容: 30 <h3>用戶爲空</h3> 31 </c:otherwise> 32 </c:choose> 33 </body> 34 </html>
運行效果以下:
一、編寫標籤處理器類:ForEachTag.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import java.util.Iterator; 5 import java.util.List; 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.PageContext; 8 import javax.servlet.jsp.tagext.SimpleTagSupport; 9 10 /** 11 * @author gacl 12 * ForEach迭代標籤 13 */ 14 public class ForEachTag extends SimpleTagSupport { 15 16 /** 17 * 存儲集合 18 */ 19 private List items; 20 21 /** 22 * 迭代集合時使用的變量 23 */ 24 private String var; 25 26 public void setItems(List items) { 27 this.items = items; 28 } 29 30 public void setVar(String var) { 31 this.var = var; 32 } 33 34 @Override 35 public void doTag() throws JspException, IOException { 36 PageContext pageContext = (PageContext) this.getJspContext(); 37 Iterator it = items.iterator(); 38 while (it.hasNext()) { 39 //獲得一個迭代出來的對象 40 Object object = (Object) it.next(); 41 //將迭代出來的對象存放到pageContext對象中 42 pageContext.setAttribute(var, object); 43 //輸出標籤體中的內容 44 this.getJspBody().invoke(null); 45 } 46 } 47 }
二、在WEB-INF目錄下tld文件中添加對該標籤的描述,以下:
1 <tag> 2 <description>foreach標籤</description> 3 <name>foreach</name> 4 <tag-class>me.gacl.web.simpletag.ForEachTag</tag-class> 5 <body-content>scriptless</body-content> 6 <attribute> 7 <description>foreach標籤的items屬性</description> 8 <name>items</name> 9 <rtexprvalue>true</rtexprvalue> 10 <required>true</required> 11 </attribute> 12 <attribute> 13 <description>foreach標籤的var屬性</description> 14 <name>var</name> 15 <rtexprvalue>false</rtexprvalue> 16 <required>true</required> 17 </attribute> 18 </tag>
三、測試:在jsp頁面中導入標籤庫並使用foreach標籤
1 <%@page import="java.util.ArrayList"%> 2 <%@page import="java.util.List"%> 3 <%@ page language="java" pageEncoding="UTF-8"%> 4 <%--在jsp頁面中導入自定義標籤庫 --%> 5 <%@taglib uri="/gaclTagLib" prefix="c" %> 6 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 7 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="c"%> 8 --%> 9 <!DOCTYPE HTML> 10 <html> 11 <head> 12 <title>foreach標籤測試</title> 13 </head> 14 15 <% 16 List<String> data = new ArrayList<String>(); 17 data.add("孤傲蒼狼"); 18 data.add("xdp"); 19 //將集合存儲到pageContext對象中 20 pageContext.setAttribute("data", data); 21 %> 22 23 <body> 24 <%--迭代存儲在pageContext對象中的data集合 --%> 25 <c:foreach items="${data}" var="str"> 26 ${str}<br/> 27 </c:foreach> 28 </body> 29 </html>
運行效果以下:
目前這個foreach標籤的功能較弱,只能遍歷list集合,下面咱們改造一下,使咱們的foreach標籤能夠遍歷全部集合類型,修改後foreach標籤的代碼以下:
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import java.lang.reflect.Array; 5 import java.util.ArrayList; 6 import java.util.Collection; 7 import java.util.Iterator; 8 import java.util.Map; 9 10 import javax.servlet.jsp.JspException; 11 import javax.servlet.jsp.PageContext; 12 import javax.servlet.jsp.tagext.SimpleTagSupport; 13 14 /** 15 * @author gacl 16 * ForEach迭代標籤 17 */ 18 public class ForEachTag extends SimpleTagSupport { 19 20 /** 21 * 存儲數據 22 */ 23 private Object items; 24 25 /** 26 * 迭代集合時使用的變量 27 */ 28 private String var; 29 30 /** 31 * 集合,用於存儲items中的數據 32 */ 33 private Collection collection; 34 35 @Override 36 public void doTag() throws JspException, IOException { 37 PageContext pageContext = (PageContext) this.getJspContext(); 38 //迭代collection集合 39 Iterator it = collection.iterator(); 40 while (it.hasNext()) { 41 //獲得一個迭代出來的對象 42 Object object = (Object) it.next(); 43 //將迭代出來的對象存放到pageContext對象中 44 pageContext.setAttribute(var, object); 45 //輸出標籤體中的內容 46 this.getJspBody().invoke(null); 47 } 48 } 49 50 public void setVar(String var) { 51 this.var = var; 52 } 53 54 public void setItems(Object items) { 55 if (items instanceof Collection) { 56 collection = (Collection) items;//list 57 }else if (items instanceof Map) { 58 Map map = (Map) items; 59 collection = map.entrySet();//map 60 }else if (items.getClass().isArray()) { 61 collection = new ArrayList(); 62 //獲取數組的長度 63 int len = Array.getLength(items); 64 for (int i = 0; i < len; i++) { 65 //獲取數組元素 66 Object object = Array.get(items, i); 67 collection.add(object); 68 } 69 } 70 this.items = items; 71 } 72 }
測試功能加強後的foreach標籤,以下:
1 <%@page import="java.util.HashMap"%> 2 <%@page import="java.util.Map"%> 3 <%@page import="java.util.HashSet"%> 4 <%@page import="java.util.Set"%> 5 <%@page import="java.util.ArrayList"%> 6 <%@page import="java.util.List"%> 7 <%@ page language="java" pageEncoding="UTF-8"%> 8 <%--在jsp頁面中導入自定義標籤庫 --%> 9 <%@taglib uri="/gaclTagLib" prefix="c" %> 10 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 11 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="c"%> 12 --%> 13 <!DOCTYPE HTML> 14 <html> 15 <head> 16 <title>foreach標籤測試</title> 17 </head> 18 19 <% 20 //list集合 21 List<String> listData = new ArrayList<String>(); 22 listData.add("孤傲蒼狼"); 23 listData.add("xdp"); 24 25 //對象數組 26 Integer intObjArr[] = new Integer[]{1,2,3}; 27 28 //基本數據類型數組 29 int intArr[] = new int[]{4,5,6}; 30 31 //map集合 32 Map<String,String> mapData = new HashMap<String,String>(); 33 mapData.put("a", "aaaaaa"); 34 mapData.put("b", "bbbbbb"); 35 36 //將集合存儲到pageContext對象中 37 pageContext.setAttribute("listData", listData); 38 pageContext.setAttribute("intObjArr", intObjArr); 39 pageContext.setAttribute("intArr", intArr); 40 pageContext.setAttribute("mapData", mapData); 41 %> 42 43 <body> 44 <%--迭代存儲在pageContext對象中的list集合 --%> 45 <c:foreach items="${listData}" var="str"> 46 ${str}<br/> 47 </c:foreach> 48 <hr/> 49 <%--迭代存儲在pageContext對象中的數組 --%> 50 <c:foreach items="${intObjArr}" var="num"> 51 ${num}<br/> 52 </c:foreach> 53 <hr/> 54 <%--迭代存儲在pageContext對象中的數組 --%> 55 <c:foreach items="${intArr}" var="num"> 56 ${num}<br/> 57 </c:foreach> 58 <hr/> 59 <%--迭代存儲在pageContext對象中的map集合 --%> 60 <c:foreach items="${mapData}" var="me"> 61 ${me}<br/> 62 </c:foreach> 63 </body> 64 </html>
測試結果:
一、編寫標籤處理器類:HtmlEscapeTag.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import java.io.StringWriter; 5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7 8 /** 9 * @author gacl 10 * html轉義標籤 11 */ 12 public class HtmlEscapeTag extends SimpleTagSupport { 13 14 /** 15 * @param message 16 * @return 轉義html標籤 17 */ 18 private String filter(String message) { 19 20 if (message == null){ 21 return (null); 22 } 23 char content[] = new char[message.length()]; 24 message.getChars(0, message.length(), content, 0); 25 StringBuilder result = new StringBuilder(content.length + 50); 26 for (int i = 0; i < content.length; i++) { 27 switch (content[i]) { 28 case '<': 29 result.append("<"); 30 break; 31 case '>': 32 result.append(">"); 33 break; 34 case '&': 35 result.append("&"); 36 break; 37 case '"': 38 result.append("""); 39 break; 40 default: 41 result.append(content[i]); 42 } 43 } 44 return (result.toString()); 45 } 46 47 @Override 48 public void doTag() throws JspException, IOException { 49 StringWriter sw = new StringWriter(); 50 //將標籤體中的內容先輸出到StringWriter流 51 this.getJspBody().invoke(sw); 52 //獲得標籤體中的內容 53 String content = sw.getBuffer().toString(); 54 //轉義標籤體中的html代碼 55 content = filter(content); 56 //輸出轉義後的content 57 this.getJspContext().getOut().write(content); 58 } 59 }
二、在WEB-INF目錄下tld文件中添加對該標籤的描述,以下:
1 <tag> 2 <description>HtmlEscape標籤</description> 3 <name>htmlEscape</name> 4 <tag-class>me.gacl.web.simpletag.HtmlEscapeTag</tag-class> 5 <body-content>scriptless</body-content> 6 </tag>
三、測試:在jsp頁面中導入標籤庫並使用htmlEscape標籤
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中導入自定義標籤庫 --%> 3 <%@taglib uri="/gaclTagLib" prefix="c" %> 4 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 5 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="c"%> 6 --%> 7 <!DOCTYPE HTML> 8 <html> 9 <head> 10 <title>html轉義標籤測試</title> 11 </head> 12 13 <body> 14 <c:htmlEscape> 15 <a href="http://www.cnblogs.com">訪問博客園</a> 16 </c:htmlEscape> 17 </body> 18 </html>
運行結果:
一、編寫標籤處理器類:OutTag.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7 8 /** 9 * @author gacl 10 * 開發輸出標籤 11 */ 12 public class OutTag extends SimpleTagSupport { 13 14 /** 15 * 要輸出的內容 16 */ 17 private String content; 18 19 /** 20 * 是否將內容中的html進行轉義後輸出 21 */ 22 private boolean escapeHtml; 23 24 public void setContent(String content) { 25 this.content = content; 26 } 27 28 public void setEscapeHtml(boolean escapeHtml) { 29 this.escapeHtml = escapeHtml; 30 } 31 32 @Override 33 public void doTag() throws JspException, IOException { 34 if (escapeHtml == true) { 35 //轉義內容中的html代碼 36 content = filter(content); 37 //輸出轉義後的content 38 this.getJspContext().getOut().write(content); 39 }else { 40 this.getJspContext().getOut().write(content); 41 } 42 } 43 44 /** 45 * @param message 46 * @return 轉義html標籤 47 */ 48 private String filter(String message) { 49 50 if (message == null){ 51 return (null); 52 } 53 char content[] = new char[message.length()]; 54 message.getChars(0, message.length(), content, 0); 55 StringBuilder result = new StringBuilder(content.length + 50); 56 for (int i = 0; i < content.length; i++) { 57 switch (content[i]) { 58 case '<': 59 result.append("<"); 60 break; 61 case '>': 62 result.append(">"); 63 break; 64 case '&': 65 result.append("&"); 66 break; 67 case '"': 68 result.append("""); 69 break; 70 default: 71 result.append(content[i]); 72 } 73 } 74 return (result.toString()); 75 } 76 }
二、在WEB-INF目錄下tld文件中添加對該標籤的描述,以下:
1 <tag> 2 <description>out標籤</description> 3 <name>out</name> 4 <tag-class>me.gacl.web.simpletag.OutTag</tag-class> 5 <body-content>empty</body-content> 6 <attribute> 7 <description>out標籤的content屬性,表示要輸出的內容</description> 8 <name>content</name> 9 <rtexprvalue>true</rtexprvalue> 10 <required>true</required> 11 </attribute> 12 <attribute> 13 <description>out標籤的escapeHtml屬性,表示是否將內容中的html進行轉義後輸出</description> 14 <name>escapeHtml</name> 15 <rtexprvalue>true</rtexprvalue> 16 <required>false</required> 17 </attribute> 18 </tag>
三、測試:在jsp頁面中導入標籤庫並使用out標籤
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中導入自定義標籤庫 --%> 3 <%@taglib uri="/gaclTagLib" prefix="c" %> 4 <%--在jsp頁面中也能夠使用這種方式導入標籤庫,直接把uri設置成標籤庫的tld文件所在目錄 5 <%@taglib uri="/WEB-INF/TagLib.tld" prefix="c"%> 6 --%> 7 <!DOCTYPE HTML> 8 <html> 9 <head> 10 <title>out標籤測試</title> 11 </head> 12 13 <body> 14 <%--使用out標籤輸出content屬性的內容 --%> 15 <c:out content="<a href='http://www.cnblogs.com'>訪問博客園</a>"/> 16 <hr/> 17 <%--使用out標籤輸出 content屬性的內容,內容中的html代碼會進行轉義處理--%> 18 <c:out content="<a href='http://www.cnblogs.com'>訪問博客園</a>" escapeHtml="true"/> 19 </body> 20 </html>
運行效果以下:
咱們的標籤庫開發好以後,爲了方便別人使用,能夠將開發好的標籤庫打包成一個jar包,具體的打包步驟以下:
一、新建一個普通的java工程,例如:taglib
二、將在JavaWeb_JspTag_study_20140816這個web工程中開發好標籤庫的java代碼拷貝到普通java工程taglib項目中,以下:
此時,咱們能夠看到,拷貝到taglib項目的標籤代碼都有錯誤,這是由於taglib項目中缺乏了javaEE的jar包,而標籤類是是基於javaEE API進行開發的,因此還須要將javaEE的jar包添加到taglib項目中。
在taglib項目中建立一個【lib】文件夾,用於存放標籤類依賴的javaEE的jar包。找到tomcat服務器目錄下的lib文件夾,以下圖所示:
將【jsp-api.jar】和【servlet-api.jar】這兩個jar包拷貝到tagib項目中的lib文件夾中,而後添加【jsp-api.jar】和【servlet-api.jar】這兩個jar包的引用,以下所示:
在taglib項目中引用了【jsp-api.jar】和【servlet-api.jar】這兩個jar包後,標籤類中的代碼就再也不報錯了
三、在taglib項目中添加一個【META-INF】文件夾,以下所示:
將位於WEB-INF目錄下的標籤庫對應的tld文件拷貝到taglib項目的【META-INF】文件夾中
四、將taglib項目打包成jar包
此時就能夠看到咱們打包好的jar包了,以下所示:
將標籤庫打包成jar包以後,之後哪一個web項目要使用標籤庫,那麼就將打包好的標籤庫jar包添加到web項目中就能夠使用標籤庫中的標籤了。