效果如下:
1实现自定义标签接口,实现自定义标签的业务逻辑
pageTag.java
package com.asarja.astl;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
/**
* @author asarja
*
*
*/
public class PageTag extends TagSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 记录显示页码的数量
*/
private Integer num;
/**
* 当前页码
*/
private Integer pageNo;
/**
* 一次显示页码的数量
*/
private Integer pageCount;
/**
* 请求地址
*/
private String url;
/* (non-Javadoc)
* @see javax.servlet.jsp.tagext.TagSupport#doEndTag()
* 自定义标签的结束位置会调用该方法
*/
@Override
public int doEndTag() throws JspException {
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
//通过request将num pageCount pageNum存储
JspWriter out = pageContext.getOut();
//在页面上输出num个页码,并且区分出当前页
try {
printPage(request, out);
} catch (Exception e) {
e.printStackTrace();
}
return Tag.EVAL_PAGE;
}
//1 2 3 4 5
private void printPage(HttpServletRequest request,JspWriter out) throws Exception{
// TODO Auto-generated method stub
//对第一页及上一页链接进行处理
if(pageNo == 1){
out.write("第一页 ");
out.write("上一页 ");
}else{
out.write("<a href="+url+"?pageNo=1>第一页</a> ");
out.write("<a href="+url+"?pageNo="+(pageNo-1)+">上一页</a> ");
}
if(pageNo > (num-pageCount)){
for(Integer j = (num-pageCount+1);j <= num;j++){
if(pageNo.equals(j)){
out.write(j<10?"0"+j.toString()+" ":j.toString()+" ");
}else{
out.write("<a href="+url+"?pageNo="+j+">"+(j<10?"0"+j.toString()+" ":j.toString()+" ")+"</a> ");
}
}
}else{
for (Integer i = pageNo; i < (pageNo+pageCount); i++) {
if(pageNo.equals(i)){
out.write(i<10?"0"+i.toString()+" ":i.toString()+" ");
}else{
out.write("<a href="+url+"?pageNo="+i+">"+(i<10?"0"+i.toString()+" ":i.toString()+" ")+"</a> ");
}
}
}
//下一页及最后一页的链接处理
if(pageNo.equals(num)){
out.write("下一页 ");
out.write("最后一页 ");
}else{
out.write("<a href="+url+"?pageNo="+(pageNo+1)+">下一页</a> ");
out.write("<a href="+url+"?pageNo="+num+">最后一页</a> ");
}
}
/* (non-Javadoc)
* @see javax.servlet.jsp.tagext.TagSupport#doStartTag()
* 自定义标签的起始位置会调用该方法
*/
@Override
public int doStartTag() throws JspException {
if(num == null || num.equals(0)){
num = 25;
}
if(pageNo == null || pageNo<1){
pageNo = 1;
}
if(pageNo>num){
pageNo = num;
}
if(pageCount == null || pageCount.equals(0)){
pageCount = 5;
}
return Tag.EVAL_BODY_INCLUDE;
}
@Override
public void release() {
// TODO Auto-generated method stub
super.release();
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public Integer getPageNo() {
return pageNo;
}
public void setPageNo(Integer pageNo) {
this.pageNo = pageNo;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
1配置tld文件
out.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>ASTL 1.0 a Library</description>
<display-name>ASTL out</display-name>
<tlib-version>1.0</tlib-version>
<short-name>a</short-name>
<uri>http://www.asarja.com/astl/out</uri>
<tag>
<name>getPath</name>
<tag-class>com.asarja.astl.GetPathTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>getPage</name>
<tag-class>com.asarja.astl.PageTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>num</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageNo</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageCount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3 在web.xml文件中配置taglib
<jsp-config>
<taglib>
<taglib-uri>http://www.asarja.com/astl/out</taglib-uri>
<taglib-location>/WEB-INF/tlds/out.tld</taglib-location>
</taglib>
</jsp-config>
4 在页面中测试
<out:getPage
pageNo="${param.pageNo }"
num="${requestScope.num }"
pageCount="${requestScope.pageCount }"
url="pageServlet"
/>