jsp tag应用例子: 数据分页显示  

来源:互联网 发布:吾生也有涯,而知也无涯 编辑:程序博客网 时间:2024/04/30 23:14
定制自己的jsp tag需要做以下几个步骤
1,理清标签的需求,需要定制哪些属性,分页标签的使用:
<pagin:pagination paginationParamName="paginate" paginScope="3"></pagin:pagination>
属性分为必须属性和可选属性,
上面paginationParamName是必须属性,指向request中分页类的一个实例名。
paginScope是可选属性,默认6,指的是页码显示范围(如等于6时:  1 2 3 4 5 6)
formName是可选属性,默认是document.forms[0]
callBack是可选属性,默认是null,当指定一个函数名时,分页码或按钮被点击时,会触发相应的callBack方法,
函数可以定义为function callBackName(pn){}
2,在tld描述文件中描述tag,存为pagination.tld文件并置于WEB-INF下
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib
    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"
>

<taglib>
    
<tlib-version>1.0</tlib-version>
    
<jsp-version>1.2</jsp-version>
    
<short-name>pagination</short-name>
    
<uri></uri>
    
<display-name>pagination</display-name>
    
<description>pagination</description>
    
<tag>
        
<name>pagination</name>
        
<tag-class>org.metas.pagination.PaginationTag</tag-class>
        
<body-content>JSP</body-content>
        
<description>pagination</description>
        
<attribute>
            
<name>paginationParamName</name>
            
<required>true</required>
            
<rtexprvalue>false</rtexprvalue>
            
<description>pagination component</description>
        
</attribute>
        
<attribute>
          
<name>paginScope</name>
          
<required>false</required>
          
<rtexprvalue>false</rtexprvalue>
          
<description>number of page NOs to show</description>
        
</attribute>
        
<attribute>
          
<name>formName</name>
          
<rtexprvalue>false</rtexprvalue>
          
<description>formName</description>
        
</attribute>
        
<attribute>
          
<name>callBack</name>
          
<rtexprvalue>false</rtexprvalue>
          
<description>callBack</description>
        
</attribute>
    
</tag>
</taglib>

3,根据tld中的属性增加相应的get set方法,实现BodyTag 接口,tag-class 实现如下:
(注意,BodyTag在j2ee.jar包中有定义) org.metas.pagination.PaginationTag
/**
 * 
 
*/

package org.metas.pagination;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import javax.servlet.jsp.tagext.Tag;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.metas.dao.result.PaginateParameter;

/**
 * 
@author wzh
 *
 
*/

public class PaginationTag implements BodyTag {
    
private Log log = LogFactory.getLog(PaginationTag.class);
    
//TagSupport
    private PageContext pageContext;
    
//attribute
    private String paginationParamName;
    
private String paginScope = "6";
    
private String formName = "document.forms[0]";
    
private String callBack = null;
    
private PaginateParameter paginationParam;
    
    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.BodyTag#doInitBody()
     
*/

    
public void doInitBody() throws JspException {
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.BodyTag#setBodyContent(javax.servlet.jsp.tagext.BodyContent)
     
*/

    
public void setBodyContent(BodyContent bc) {
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.IterationTag#doAfterBody()
     
*/

    
public int doAfterBody() throws JspException {
        
return SKIP_BODY;
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.Tag#doEndTag()
     
*/

    
public int doEndTag() throws JspException {
        
try {
            
this.writeHtml();
        }
 catch (IOException e) {
            log.error(e.getMessage());
        }

        
return EVAL_PAGE;
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.Tag#doStartTag()
     
*/

    
public int doStartTag() throws JspException {
        
return SKIP_BODY;
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.Tag#getParent()
     
*/

    
public Tag getParent() {
        
return null;
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.Tag#release()
     
*/

    
public void release() {}

    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.Tag#setPageContext(javax.servlet.jsp.PageContext)
     
*/

    
public void setPageContext(PageContext pc) {
        
this.pageContext = pc;
    }


    
/* (non-Javadoc)
     * @see javax.servlet.jsp.tagext.Tag#setParent(javax.servlet.jsp.tagext.Tag)
     
*/

    
public void setParent(Tag arg0) {}

    
private int getAsNumber(String param)throws JspTagException{
        
if(null == param
          
|| "".equals(param))
            
return 0;
        
try{
         
return Integer.parseInt(param);
        }
catch(NumberFormatException ex){
            log.error(ex.getMessage());
            
throw new JspTagException(ex.getMessage());
        }

    }

    
private void writeScript(JspWriter out, int start, int end, int currentPageNo)throws JspTagException, IOException{
        out.println(
"<script language='javascript'>");
        out.println(
"<!--");
        out.print(
"var start = ");
        out.print(start);
        out.println(
";");
        out.print(
"var end = ");
        out.print(end);
        out.println(
";");
        out.println(
"var callBackFunc;");
        
if(null != this.callBack){
            out.print(
" callBackFunc = ");
            out.print(
this.callBack);
            out.println(
";");
        }

        out.print(
"    var frm = ");out.print(this.formName);out.println(";");
        out.println(
"function setParam(value){");
        out.println(
"  if(callBackFunc){ callBackFunc(value); return;}");
        out.print(
"    if(!frm.pageNo){");
        out.println(
"   var pn = document.createElement('<input type="hidden" name=pageNo value="1">');");
        out.println(
"   frm.appendChild(pn);");
        out.println(
"  }");        
        out.println(
"   frm.pageNo.value = value;");
        out.println(
"    frm.submit();");
        out.println(
"}");        
        out.println(
"function gotoPrevious(){");
        out.print(
"        setParam(start-1);");
        out.println(
"}");
        out.println(
"function gotoNext(){");
        out.print(
"        setParam(end + 1);");
        out.println(
"}");
        out.println(
"function goto(pageNo){");
        out.print(
"        setParam(pageNo);");
        out.println(
"}");
        out.println(
"-->");
        out.println(
"</script>");
    }

    
private void writeHtml()throws JspTagException, IOException{
        
if(null == this.pageContext)
            
return;
        paginationParam 
= (PaginateParameter)this.pageContext.getRequest().getAttribute(this.paginationParamName);
        
if(null == this.paginationParamName)
            
return;
        JspWriter out 
= this.pageContext.getOut();
        
int paginNum = this.getAsNumber(this.getPaginScope());
        
int pageNo = paginationParam.getCurrentPageNo();
        
int scope = pageNo / paginNum;
        
int scopeStart = scope * paginNum;//start from Zero
        int scopeEnd = (scope + 1)* paginNum - 1;
        
int pgCnt = this.paginationParam.getPageCnt();
        
while(scopeEnd >= pgCnt)
            scopeEnd
--;
        writeScript(out, scopeStart, scopeEnd, pageNo);
        out.println(
"<div>");
        out.print(
"<span>");
        out.print(pageNo 
+ 1);
        out.print(
" of ");
        out.print(pgCnt);
        out.println(
"</span>");
        
if(pgCnt > 1)
            out.println(
"<div id='btn_first' onclick='goto(0);'>&nbsp;</div>");            
        
if(scopeStart != 0){
            out.println(
"<div id='btn_previous' onclick='gotoPrevious()'>&nbsp;</div>");
        }

        
for(;scopeStart<= scopeEnd;scopeStart++){
            out.print(
"<div ><a href='#' onclick='goto(");
            out.print(scopeStart);
            out.print(
")'");
            
if(pageNo == scopeStart)
                out.print(
" class='pn_selected' ");
            out.println(
">");
            out.print(scopeStart 
+ 1);
            out.println(
"</a></div>");
        }

        
if(scopeEnd != pgCnt - 1){
            out.println(
"<div id='btn_next' onclick='gotoNext()'>&nbsp;</div>");
        }

        
if(pgCnt > 1){
            out.print(
"<div id='btn_last' onclick='goto(");
            out.print(pgCnt
-1);
            out.println(
");'>&nbsp;</div>");
        }

        out.println(
"</div>");
    }


    
public String getFormName() {
        
return formName;
    }


    
public void setFormName(String formName) {
        
this.formName = formName;
    }


    
public String getPaginationParamName() {
        
return paginationParamName;
    }


    
public void setPaginationParamName(String paginationParamName) {
        
this.paginationParamName = paginationParamName;
    }


    
public String getCallBack() {
        
return callBack;
    }


    
public void setCallBack(String callBack) {
        
this.callBack = callBack;
    }


    
public String getPaginScope() {
        
return paginScope;
    }


    
public void setPaginScope(String paginScope) {
        
this.paginScope = paginScope;
    }


}

4,tag实用方法
jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.List"%>
<%@page import="org.metas.dao.result.MailItem"%>
<%@page import="org.metas.dao.result.PaginateParameter"%>
<%@taglib uri="/WEB-INF/pagination.tld" prefix="pagin" %>
<%
  PaginateParameter paginate 
= (PaginateParameter)request.getAttribute("paginate");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>mailing-list</title>
<style>

  
</style>
</head>
<link href="style/style1.css" type="text/css" rel="stylesheet"/>
<body>
 
<a href="<%=request.getContextPath()%>/index.jsp">main page</a><br>
 
<table cellspacing=0 cellpadding=0 border=1 style="width:100%;height:100%;">
        
<tr style='height:36px;text-align: center;background-color: buttonface;'>
          
<td>
           mail_no
          
</td>
          
<td>
            LINKED_EVENT
          
</td>
          
<td>
            SEND_FROM
          
</td>
          
<td>
            CC
          
</td>
          
<td>
            SEND_TIME
          
</td>
        
</tr>
        
<col align='center'>
        
<col align='center'>
        
<col align='center'>
        
<col align='center'>
        
<col align='center'>
<%
          List  retList 
= (List)request.getAttribute("result");
        
if(null != retList){
            
for(int i=0;i<retList.size();i++){
                MailItem item 
= (MailItem)retList.get(i);
%>
        
        
<tr>
            
<td><%=item.getMailNo() %></td>
            
<td><%=item.getLinkedEvent() %></td>
            
<td><%=item.getSendFrom() %></td>
            
<td><%=item.getCc() %></td>
            
<td><%=item.getSendTime() %></td>
        
</tr>
<%
            }

        }

%>        
    
</table>
    
<form name="frmPaginate" method="POST" action='<%=request.getContextPath()%>/mailList.do' target='_self'>
     
<div class="pagination" style="width:100%;height:9px;text-align: center;">
      
<pagin:pagination paginationParamName="paginate" paginScope="3"></pagin:pagination>
     
<div>
     
</form>
</body>
</html>
5,属性paginationParam关联的接口
package org.metas.dao.result;

public interface PaginateParameter {
    
/**
     * get item count per-page
     * 
@return
     
*/

  
public int getPageSize();
  
/**
   * set item count per-page
   * 
@param size
   
*/

  
public void setPageSize(int size);
  
/**
   * get current page number
   * 
@return
   
*/

  
public int getCurrentPageNo();
  
/**
   * set current page number
   * 
@param current
   
*/

  
public void setCurrentPageNo(int current);
  
/**
   * get total item count in all pages
   * 
@return
   
*/

  
public int getTotalItemCnt();
  
/**
   * set total item count
   * 
@param cnt
   
*/

  
public void setTotalItemCnt(int cnt);
  
/**
   * count the page 
   * 
@return
   
*/

  
public int getPageCnt();
  
/**
   * source query SQL for pagination
   * 
@return
   
*/

  
public String getQuerySQL();
  
/**
   * get the start paging number
   * 
@return
   
*/

  
public int getStartRow();
  
/**
   * get the end paging number
   * 
@return
   
*/

  
public int getEndRow();
  
/**
   * mapping for the disabled attribute of next page button for HTML
   * 
@return
   
*/

  
public boolean isNextDisabled();
  
/**
   * mapping for the disabled attribute of previous button for HTML
   * 
@return
   
*/

  
public boolean isPrevDisabled();
  
/**
   * mapping for the disabled attribute of first button for HTML
   * 
@return
   
*/

  
public boolean isFirstDisabled();
  
/**
   * mapping for the disabled attribute of last button for HTML
   * 
@return
   
*/

  
public boolean isLastDisabled();
}

6,pagination的CSS样式
.pagination div{
   width
:100%;
   height
: 9px; 
    text-align
: center;
    vertical-align
: middle;
    display
: inline;
  
}

  .pagination #btn_first
{
   width
:20px;
    height
: 15px;
    cursor
: hand;
    background
: url(../image/First.gif) no-repeat center ;
    padding
: 10px;
    display
: inline;
  
}

   .pagination #btn_last
{       
    width
:20px;
    height
: 15px;
    cursor
: hand;
    background
: url(../image/Last.gif) no-repeat center;
    display
: inline ;
    padding
: 10px;
  
}
  
  .pagination #btn_previous
{   
    width
:55px;
    height
: 15px;
    cursor
: hand;
    background
: url(../image/Previous.gif) no-repeat center ;
    display
: inline;
    padding
: 20px; 
  
}

  .pagination #btn_next
{    
    width
:55px;
    height
: 15px;
    cursor
: hand;
    background
: url(../image/Next.gif) no-repeat center;
    display
: inline ;
    padding
: 20px;
  
}


  .pagination div div
{
    display
: inline ;
   width
:30px;    
    padding
: 10px;
  
}

  .pagination div div a
{
    font-size
: 12px;
  
}

  .pagination div span
{
    float
:left;
     margin-top
: 6px;
     height
: 100%
     vertical-align: bottom
;
     font-size
: 12px;
  
}


7,以Oracle为例,分页SQL:
    <select id="queryResultItemByPage"
     parameterClass
="org.metas.dao.result.impl.PaginateParameterImpl" 
     resultClass
="MailItem"
     resultMap
="mailItem-map"
     
>
       
<![CDATA[
        SELECT * FROM
        (
           SELECT r.*, ROWNUM as row_number FROM
             ( $querySQL$ ) r
           WHERE ROWNUM  < #endRow#
         ) WHERE #startRow# <= row_number
        
]]>
    
</select>

8,结束
原创粉丝点击