博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb学习总结(二十七)——jsp简单标签开发案例和打包
阅读量:5093 次
发布时间:2019-06-13

本文共 13324 字,大约阅读时间需要 44 分钟。

一、开发标签库

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 
2 3
6 7
孤傲苍狼开发的简单标签库
8
1.0
9
TagLib
10
/gaclTagLib
11 12
13
14
referer
15
16
me.gacl.web.simpletag.RefererTag
17
18
empty
19
20
21
描述标签的site属性
22
23
site
24
true
25
26
true
27
28
29
描述标签的page属性
30
31
page
32
true
33
34
true
35
36
37 38

  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 
12 13 14 15 防盗链标签测试 16 17 18 19 网站内部资料 20 21
 

  运行效果如下:

  

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 
2
if标签
3
if
4
me.gacl.web.simpletag.IFTag
5
scriptless
6
7
if标签的test属性
8
test
9
true
10
true
11
12
 

  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  8  9  10 if链标签测试 11  12 13  14 <%--if标签的test属性值为true ,标签体的内容会输出--%> 15 
16

网站内部资料

17
18 <%--if标签的test属性值为false ,标签体的内容不会输出--%> 19
20 这里的内部不输出 21
22 23
 

  运行效果如下:

  

1.3、开发<c:when><c:otherwise>标签

  这个标签的开发稍微有一点难度,因为这里面涉及到两个标签处理器类共享同一个变量的问题,如下:

 
1 
2 用户不为空 3
4
5 用户为空 6
 

  <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     
2
choose标签
3
choose
4
me.gacl.web.simpletag.ChooseTag
5
scriptless
6
7
8
when标签
9
when
10
me.gacl.web.simpletag.WhenTag
11
scriptless
12
13
when标签的test属性
14
test
15
true
16
true
17
18
19
20
otherwise标签
21
otherwise
22
me.gacl.web.simpletag.OtherWiseTag
23
scriptless
24
 

  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  8  9  10 when和otherwise标签测试 11  12 13  14 
15
16 when标签标签体输出的内容: 17

用户为空

18
19
20 用户不为空 21
22
23

24
25
26 用户不为空 27
28
29 otherwise标签标签体输出的内容: 30

用户为空

31
32
33 34
 

  运行效果如下:

  

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     
2
foreach标签
3
foreach
4
me.gacl.web.simpletag.ForEachTag
5
scriptless
6
7
foreach标签的items属性
8
items
9
true
10
true
11
12
13
foreach标签的var属性
14
var
15
false
16
true
17
18
 

  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  10  11  12 foreach标签测试 13  14 15 <% 16 List
data = new ArrayList
(); 17 data.add("孤傲苍狼"); 18 data.add("xdp"); 19 //将集合存储到pageContext对象中 20 pageContext.setAttribute("data", data); 21 %> 22 23 24 <%--迭代存储在pageContext对象中的data集合 --%> 25
26 ${str}
27
28 29
 

  运行效果如下:

  

  目前这个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  14  15  16 foreach标签测试 17  18 19 <% 20 //list集合 21 List
listData = new ArrayList
(); 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
mapData = new HashMap
(); 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"

转载于:https://www.cnblogs.com/jameslif/p/4088912.html

你可能感兴趣的文章
走高端树品牌 IT大佬竞相“归田”
查看>>
大型网站应用之海量数据和高并发解决方案总结一二
查看>>
[BZOJ4518][SDOI2016]征途(斜率优化DP)
查看>>
Android recycleView的研究和探讨
查看>>
HDU1024 Max Sum Plus Plus 【DP】
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
十六进制的ASCII码 "\u6cf0\u56fd" 解码成unicode
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
android中自定义下拉框(转)
查看>>
Android设计模式源码解析之外观模式(Facade)
查看>>
使用word发布博客
查看>>
构建oracle12c的Docker镜像
查看>>
用户权限命令(chmod,chown,umask,lsattr/chattr)
查看>>
Maven详解
查看>>
Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
查看>>
数据结构 : Hash Table [II]
查看>>
面向对象的小demo
查看>>
获取地址栏参数
查看>>
java之hibernate之helloworld
查看>>