自定义标签-------迭代标签、分页、打包标签库
一、打包自定义标签库
把自定义的标签打到一个jar包中,就是要把标签处理类的字节码和标签库描述文件按照一定的存放方式添加到一个jar包中。具体做法如下。
1、把标签处理类字节码和标签库描述文件按如下所示的结构组织。
2、使用jar命令来创建jar文件:
jar cvf mytaglib_0.9.jar META-INF com
3、完成这两个步骤之后,一个自定义标签库jar包就打好了,可以把它添加到任何想使用这个标签库的Web应用程序的WEB-INF/lib目录下使用了。
二、实用案例:自定义分页标签、
分页标签的使用方式如下:
<q:pager pageNo="当前页号" pageSize="每页要显示的记录数" recordCount="总记录数" url="要跳转的URI" />
通过给这个标签传入当前页号、每页要显示的记录数、总记录数和要跳转的URI,这个标签就可以生成翻页的HTML元素。
标签处理类
这个标签只是通过指定属性值就可以生成所有的翻页元素,因此这个标签不需要主体,可以直接继承自TagSupport类:public class PagerTag extends TagSupport {...}
然后为这个标签定义4个属性,给它们提供setter方法,以便使用标签时,从外部传值进来。
最主要的逻辑实现都是在doStartTag()方法中,首先通过总记录数和每页要显示的记录数计算出总页数:
int pageCount = (recordCount + pageSize - 1) / pageSize;
编写要输出到响应的StringBuilder实例。
把请求对象中获取的所有请求参数都作为隐藏表单域(<input type=“hidden”>)生成到一个form表单中:
生成翻页的HTML元素。这一段逻辑稍微复杂一些。
生成“总记录数和总页数”
是否要显示“上一页”超链接的逻辑处理。
如果总页数超过5页,显示“…”
当前页和它附近页的显示处理
如果总页数比当前页数超过2页,显示“...”
是否要显示“下一页”超链接的逻辑处理
在标签库描述符文件描述这个标签的信息
在页面中使用该分页标签
用taglib指令引用该标签库描述文件:
<%@ taglib uri="http://blog.csdn.net/qjyong/tags/pager" prefix="q"%>
为该分页标签准备好一些样式,让翻页元素更美观:
用代码片段显示数据
调用分页标签
创建一个TestPagerTagServlet的Servlet,用来准备测试数据,并为分页标签准备好参数值,然后转发到测试页。
三、迭代标签——案例
package com.hbsi.web.example;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ForEachDemo2 extends SimpleTagSupport {
//Collection是List、set的超级接口,不论传入何种集合,都把它转成Collection对象
private Collection collection;
//两个属性,得到set方法
private String var;
private Object items;
public void setVar(String var) {
this.var = var;
}
public void setItems(Object items) {
this.items = items;
//因为不知道items是什么类型,所以要对items进行判断
//(1)当items是Map集合时
if(items instanceof Map){
//new一个Map
Map map=(Map) items;
collection=map.entrySet();//返回值是set
}
//(2)当items是List、set集合时
if(items instanceof Collection){
collection=(Collection) items;
}
//(3)当items是数组时
if(items.getClass().isArray()){
collection =new ArrayList();
int length=Array.getLength(items);
for(int i=0;i<length;i++){
Object obj= Array.get(items, i);
collection.add(obj);
}
}
}
@Override
public void doTag() throws JspException, IOException {
Iterator it=collection.iterator();
while(it.hasNext()){
Object obj=it.next();
//把取出来的对象放到page域中
this.getJspContext().setAttribute(var,obj);
this.getJspBody().invoke(null);
}
}
}
<body>
<%
List list=new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
request.setAttribute("list",list);
%>
<c:forEach2 var="str" items="${list }">${str}<br/></c:forEach2>
<br/>--------------------------------------<br/>
<%
Map map=new LinkedHashMap();
map.put("aa","aa");
map.put("bb","bb");
map.put("cc","cc");
map.put("dd","dd");
request.setAttribute("map",map);
%>
<c:forEach2 var="str" items="${map }">
${str.key}-------${str.value }<br/>
</c:forEach2>
<br/>--------------------------------------<br/>
<%
String[] strs={"aa","bb","cc","dd"};
request.setAttribute("strs",strs);
%>
<c:forEach2 var="strs" items="${strs}">${strs}<br></c:forEach2>
<br/>--------------------------------------<br/>
<%
int[] is={1,2,3,4};
request.setAttribute("is",is);
%>
<c:forEach2 var="is" items="${is}">${is}<br></c:forEach2>
</body>
<tag>
<name>forEach2</name>
<tag-class>com.hbsi.web.example.ForEachDemo2</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>