javaweb學習總結(二十七)——jsp簡單標籤開發案例和打包


一、開發標籤庫

1.1、開發防盜鏈標籤

  1、編寫標籤處理器類:RefererTag.java

複製代碼
 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 }
複製代碼

  2、在WEB-INF目錄下tld文件中添加對該標籤的描述,如下:

複製代碼
 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>
複製代碼

  3、測試:在jsp頁面中導入標籤庫並使用防盜鏈標籤

複製代碼
 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>
複製代碼

  運行效果如下:

  

1.2、開發<c:if>標籤

  1、編寫標籤處理器類: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 }
複製代碼

  2、在WEB-INF目錄下tld文件中添加對該標籤的描述,如下:

複製代碼
 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>
複製代碼

  3、測試:在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>
複製代碼

  運行效果如下:

  

1.3、開發<c:when><c:otherwise>標籤

  這個標籤的開發稍微有一點難度,因爲這裏面涉及到兩個標籤處理器類共享同一個變量的問題,如下:

複製代碼
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>標籤處理器類共享同一個變量就可以做到了,那麼又該怎麼做才能夠讓兩個標籤處理器類共享同一個變量呢,標準的做法是這樣的:讓兩個標籤擁有同一個父標籤。

 1、開發父標籤: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 }
複製代碼

  2、開發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 }
複製代碼

  3、在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>
複製代碼

  4、測試:在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>
複製代碼

  運行效果如下:

  

1.4、開發foreach迭代標籤

  1、編寫標籤處理器類: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 }
複製代碼

   2、在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>
複製代碼

  3、測試:在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>
複製代碼

  測試結果:

  

1.5、開發html轉義標籤

   1、編寫標籤處理器類: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("&lt;");
30                 break;
31             case '>':
32                 result.append("&gt;");
33                 break;
34             case '&':
35                 result.append("&amp;");
36                 break;
37             case '"':
38                 result.append("&quot;");
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 }
複製代碼

  2、在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>
複製代碼

  3、測試:在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>
複製代碼

  運行結果:

  

1.6、開發out輸出標籤

  1、編寫標籤處理器類: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("&lt;");
60                 break;
61             case '>':
62                 result.append("&gt;");
63                 break;
64             case '&':
65                 result.append("&amp;");
66                 break;
67             case '"':
68                 result.append("&quot;");
69                 break;
70             default:
71                 result.append(content[i]);
72             }
73         }
74         return (result.toString());
75     }
76 }
複製代碼

  2、在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>
複製代碼

  3、測試:在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包,具體的打包步驟如下:

  1、新建一個普通的java工程,例如:taglib

  

  2、將在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包後,標籤類中的代碼就不再報錯了

  3、在taglib項目中添加一個【META-INF】文件夾,如下所示:

  

  將位於WEB-INF目錄下的標籤庫對應的tld文件拷貝到taglib項目的【META-INF】文件夾中

  

  4、將taglib項目打包成jar包

  

  

  

  

  此時就可以看到我們打包好的jar包了,如下所示:

  

  將標籤庫打包成jar包之後,以後哪個web項目要使用標籤庫,那麼就將打包好的標籤庫jar包添加到web項目中就可以使用標籤庫中的標籤了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章