`

自定义分页标签详解

 
阅读更多

 

关于自定义分页标签的使用,我想大家都见过许多人写过,我今天也来凑个热闹写下我见到的自定义标签的使用步骤

既然是自定义标签那么肯定少不了类和tld文件这两大因素,因为这两个才能构成标签

首先奉献上最核心的自定义分页标签类的写法PagerTag.java,前提是要继承自TagSupport类

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.web.tag;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Enumeration;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.jsp.JspException;  
  8. import javax.servlet.jsp.tagext.TagSupport;  
  9.   
  10.   
  11. /** 
  12.  * 分页标签处理类 
  13.  */  
  14. public class PagerTag extends TagSupport {  
  15.     private static final long serialVersionUID = 5729832874890369508L;  
  16.     private String url;         //请求URI  
  17.     private int pageSize = 10;  //每页要显示的记录数  
  18.     private int pageNo = 1;     //当前页号  
  19.     private int recordCount;    //总记录数  
  20.   
  21.     @SuppressWarnings("unchecked")  
  22.     public int doStartTag() throws JspException {  
  23.         int pageCount = (recordCount + pageSize - 1) / pageSize;  //计算总页数  
  24.           
  25.         //拼写要输出到页面的HTML文本  
  26.         StringBuilder sb = new StringBuilder();  
  27.           
  28.           
  29.         sb.append("<style type=\"text/css\">");  
  30.         sb.append(".pagination {padding: 5px;float:right;font-size:12px;}");  
  31.         sb.append(".pagination a, .pagination a:link, .pagination a:visited {padding:2px 5px;margin:2px;border:1px solid #aaaadd;text-decoration:none;color:#006699;}");  
  32.         sb.append(".pagination a:hover, .pagination a:active {border: 1px solid #ff0000;color: #000;text-decoration: none;}");  
  33.         sb.append(".pagination span.current {padding: 2px 5px;margin: 2px;border: 1px solid #ff0000;font-weight: bold;background-color: #ff0000;color: #FFF;}");  
  34.         sb.append(".pagination span.disabled {padding: 2px 5px;margin: 2px;border: 1px solid #eee; color: #ddd;}");  
  35.         sb.append("</style>\r\n");  
  36.         sb.append("<div class=\"pagination\">\r\n");  
  37.         if(recordCount == 0){  
  38.             sb.append("<strong>没有可显示的项目</strong>\r\n");  
  39.         }else{  
  40.             //页号越界处理  
  41.             if(pageNo > pageCount){      pageNo = pageCount; }  
  42.             if(pageNo < 1){      pageNo = 1; }  
  43.               
  44.             sb.append("<form method=\"post\" action=\"").append(this.url)  
  45.                 .append("\" name=\"qPagerForm\">\r\n");  
  46.               
  47.             //获取请求中的所有参数  
  48.             HttpServletRequest request = (HttpServletRequest) pageContext  
  49.                     .getRequest();  
  50.             Enumeration<String> enumeration = request.getParameterNames();  
  51.             String name = null;  //参数名  
  52.             String value = null//参数值  
  53.             //把请求中的所有参数当作隐藏表单域  
  54.             while (enumeration.hasMoreElements()) {  
  55.                 name =  enumeration.nextElement();  
  56.                 value = request.getParameter(name);  
  57.                 // 去除页号  
  58.                 if (name.equals("pageNo")) {  
  59.                     if (null != value && !"".equals(value)) {  
  60.                         pageNo = Integer.parseInt(value);  
  61.                     }  
  62.                     continue;  
  63.                 }  
  64.                 sb.append("<input type=\"hidden\" name=\"")  
  65.                   .append(name)  
  66.                   .append("\" value=\"")  
  67.                   .append(value)  
  68.                   .append("\"/>\r\n");  
  69.             }  
  70.       
  71.             // 把当前页号设置成请求参数  
  72.             sb.append("<input type=\"hidden\" name=\"").append("pageNo")  
  73.                 .append("\" value=\"").append(pageNo).append("\"/>\r\n");  
  74.               
  75.             // 输出统计数据  
  76.             sb.append("&nbsp;共<strong>").append(recordCount)  
  77.                 .append("</strong>项")  
  78.                 .append(",<strong>")  
  79.                 .append(pageCount)  
  80.                 .append("</strong>页:&nbsp;\r\n");  
  81.               
  82.             //上一页处理  
  83.             if (pageNo == 1) {  
  84.                 sb.append("<span class=\"disabled\">&laquo;&nbsp;上一页")  
  85.                     .append("</span>\r\n");  
  86.             } else {  
  87.                 sb.append("<a href=\"javascript:turnOverPage(")  
  88.                   .append((pageNo - 1))  
  89.                   .append(")\">&laquo;&nbsp;上一页</a>\r\n");  
  90.             }  
  91.               
  92.             //如果前面页数过多,显示"..."  
  93.             int start = 1;   
  94.             if(this.pageNo > 4){  
  95.                 start = this.pageNo - 1;  
  96.                 sb.append("<a href=\"javascript:turnOverPage(1)\">1</a>\r\n");  
  97.                 sb.append("<a href=\"javascript:turnOverPage(2)\">2</a>\r\n");  
  98.                 sb.append("&hellip;\r\n");  
  99.             }  
  100.             //显示当前页附近的页  
  101.             int end = this.pageNo + 1;  
  102.             if(end > pageCount){  
  103.                 end = pageCount;  
  104.             }  
  105.             for(int i = start; i <= end; i++){  
  106.                 if(pageNo == i){   //当前页号不需要超链接  
  107.                     sb.append("<span class=\"current\">")  
  108.                         .append(i)  
  109.                         .append("</span>\r\n");  
  110.                 }else{  
  111.                     sb.append("<a href=\"javascript:turnOverPage(")  
  112.                         .append(i)  
  113.                         .append(")\">")  
  114.                         .append(i)  
  115.                         .append("</a>\r\n");  
  116.                 }  
  117.             }  
  118.             //如果后面页数过多,显示"..."  
  119.             if(end < pageCount - 2){  
  120.                 sb.append("&hellip;\r\n");  
  121.             }  
  122.             if(end < pageCount - 1){  
  123.                 sb.append("<a href=\"javascript:turnOverPage(")  
  124.                 .append(pageCount - 1)  
  125.                 .append(")\">")  
  126.                 .append(pageCount - 1)  
  127.                 .append("</a>\r\n");  
  128.             }  
  129.             if(end < pageCount){  
  130.                 sb.append("<a href=\"javascript:turnOverPage(")  
  131.                 .append(pageCount)  
  132.                 .append(")\">")  
  133.                 .append(pageCount)  
  134.                 .append("</a>\r\n");   
  135.             }  
  136.               
  137.             //下一页处理  
  138.             if (pageNo == pageCount) {  
  139.                 sb.append("<span class=\"disabled\">下一页&nbsp;&raquo;")  
  140.                     .append("</span>\r\n");  
  141.             } else {  
  142.                 sb.append("<a href=\"javascript:turnOverPage(")  
  143.                     .append((pageNo + 1))  
  144.                     .append(")\">下一页&nbsp;&raquo;</a>\r\n");  
  145.             }  
  146.             sb.append("</form>\r\n");  
  147.       
  148.             // 生成提交表单的JS  
  149.             sb.append("<script language=\"javascript\">\r\n");  
  150.             sb.append("  function turnOverPage(no){\r\n");  
  151.             sb.append("    if(no>").append(pageCount).append("){");  
  152.             sb.append("      no=").append(pageCount).append(";}\r\n");  
  153.             sb.append("    if(no<1){no=1;}\r\n");  
  154.             sb.append("    document.qPagerForm.pageNo.value=no;\r\n");  
  155.             sb.append("    document.qPagerForm.submit();\r\n");  
  156.             sb.append("  }\r\n");  
  157.             sb.append("</script>\r\n");  
  158.         }  
  159.         sb.append("</div>\r\n");  
  160.           
  161.         //把生成的HTML输出到响应中  
  162.         try {  
  163.             pageContext.getOut().println(sb.toString());  
  164.         } catch (IOException e) {  
  165.             throw new JspException(e);  
  166.         }  
  167.         return SKIP_BODY;  //本标签主体为空,所以直接跳过主体  
  168.     }  
  169.   
  170.     public void setUrl(String url) {  
  171.         this.url = url;  
  172.     }  
  173.     public void setPageSize(int pageSize) {  
  174.         this.pageSize = pageSize;  
  175.     }  
  176.     public void setPageNo(int pageNo) {  
  177.         this.pageNo = pageNo;  
  178.     }  
  179.     public void setRecordCount(int recordCount) {  
  180.         this.recordCount = recordCount;  
  181.     }  
  182. }</span>  

 WEB-INF/pager.tld的写法

Xml代码  收藏代码
  1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">  
  5.     <tlib-version>0.9</tlib-version>  
  6.    <!--标签头-->  
  7.     <short-name>w</short-name>  
  8.     <!--将来在页面用taglib引用时的uri属性,这部分的名字可以随便写,只要是符合HTTP网址形式的 -->  
  9.     <uri>http://javacrazyer.iteye.com/tags/pager</uri>  
  10.       
  11.     <!-- 自定义标签的描述信息 -->  
  12.     <tag>  
  13.         <!-- 标签名 -->  
  14.         <name>pager</name>  
  15.         <!-- 对应的标签处理类全限定名 -->  
  16.         <tag-class>com.javacrazyer.web.tag.PagerTag</tag-class>  
  17.         <!-- 标签主体的类型 -->  
  18.         <body-content>empty</body-content>  
  19.         <!-- 当前页号属性的描述信息 -->  
  20.         <attribute>  
  21.             <!-- 属性名 -->  
  22.             <name>pageNo</name>  
  23.             <!-- 该属性是否为必要的 -->  
  24.             <required>true</required>  
  25.             <!-- 属性值是否可以在JSP运行时期动态产生 -->  
  26.             <rtexprvalue>true</rtexprvalue>  
  27.             <!-- 属性的数据类型 -->  
  28.             <type>int</type>  
  29.         </attribute>  
  30.         <!-- 总记录数属性的描述信息 -->  
  31.         <attribute>  
  32.             <name>recordCount</name>  
  33.             <required>true</required>  
  34.             <rtexprvalue>true</rtexprvalue>  
  35.             <type>int</type>  
  36.         </attribute>  
  37.         <!-- 总页数属性的描述信息 -->  
  38.         <attribute>  
  39.             <name>pageSize</name>  
  40.             <required>true</required>  
  41.             <rtexprvalue>true</rtexprvalue>  
  42.             <type>int</type>  
  43.         </attribute>  
  44.         <!-- 分页标签要跳转的URI属性的描述信息 -->  
  45.         <attribute>  
  46.             <name>url</name>  
  47.             <required>true</required>  
  48.             <rtexprvalue>true</rtexprvalue>  
  49.             <type>java.lang.String</type>  
  50.         </attribute>  
  51.     </tag>  
  52. </taglib></span>  

 

好了,就上面的两个基本要素就已经构成了完整的分页标签,下面就差在页面的使用方式了

一般的使用步骤为在JSP页面中:

先倒入标签库:<%@taglib uri="http://javacrazyer.iteye.com/tags/pager" prefix="w"%>

然后使用: <w:pager pageSize="${pageSize}" pageNo="${pageNo}" url="do.jsp" recordCount="${pm.recordCount}"/>

 

具体使用示例,上面两个类保持不变

这个例子可以说非常好的纯servlet项目的例子,大家今后编程如果没有用到任何框架的话,我希望这个例子能给你带来点启示

前提是导入所有需要的jar包:包括common-dbcp.jar(数据源需要用到),common-dbutils-1.2.jar(数据库CURD操作需要用到,可取代最原始的JDBC操作),junit.jar(测试用到)以及数据库驱动包

关于上面的common-dbutils非常有用,尤其是在非框架项目中,后面我提供下载



 

 

首先数据库,这个数据库脚本是我用navicat导出来的

Sql代码  收藏代码
  1. <span style="font-size: medium;">/*  
  2. Navicat MySQL Data Transfer  
  3. Source Host     : localhost:3306  
  4. Source Database : jstl  
  5. Target Host     : localhost:3306  
  6. Target Database : jstl  
  7. Date: 2010-11-18 14:30:30  
  8. */  
  9.   
  10. SET FOREIGN_KEY_CHECKS=0;  
  11. -- ----------------------------  
  12. -- Table structure for news  
  13. -- ----------------------------  
  14. DROP TABLE IF EXISTS `news`;  
  15. CREATE TABLE `news` (  
  16.   `detail` varchar(255) DEFAULT NULL,  
  17.   `namevarchar(255) DEFAULT NULL,  
  18.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  19.   PRIMARY KEY (`id`)  
  20. ) ENGINE=InnoDB AUTO_INCREMENT=1253 DEFAULT CHARSET=utf8;  
  21. </span>  

 

实体类News.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.domain;  
  2.   
  3. public class News {  
  4.     private int id;  
  5.     private String name;  
  6.     private String detail;  
  7.   
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.   
  12.     public void setId(int id) {  
  13.         this.id = id;  
  14.     }  
  15.   
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.   
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.   
  24.     public String getDetail() {  
  25.         return detail;  
  26.     }  
  27.   
  28.     public void setDetail(String detail) {  
  29.         this.detail = detail;  
  30.     }  
  31.   
  32.     @Override  
  33.     public String toString() {  
  34.         return "News [detail=" + detail + ", id=" + id + ", name=" + name + "]";  
  35.     }  
  36.       
  37.   
  38. }</span>  

 NewsDao.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3. import com.javacrazyer.common.PageModel;  
  4. import com.javacrazyer.domain.News;  
  5.   
  6. public interface NewsDao {  
  7.     PageModel<News> findByPager(int pageNo, int pageSize);  
  8.   
  9.     void createNews(News news);  
  10.       
  11.     void update(News news);  
  12.       
  13.     void delete(int id);  
  14.       
  15.     News findbyId(int id);  
  16.       
  17.     int findTotalSize();  
  18.       
  19.   
  20. }</span>  

NewsImplDao.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.daoimpl;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import java.util.List;  
  6.   
  7. import org.apache.commons.dbutils.DbUtils;  
  8. import org.apache.commons.dbutils.QueryRunner;  
  9. import org.apache.commons.dbutils.handlers.BeanHandler;  
  10. import org.apache.commons.dbutils.handlers.BeanListHandler;  
  11. import org.apache.commons.dbutils.handlers.ScalarHandler;  
  12.   
  13. import com.javacrazyer.common.ConnectionFactory;  
  14. import com.javacrazyer.common.DAOException;  
  15. import com.javacrazyer.common.PageModel;  
  16. import com.javacrazyer.dao.NewsDao;  
  17. import com.javacrazyer.domain.News;  
  18.   
  19. public class NewsDaoImpl implements NewsDao {  
  20.     private QueryRunner qr = new QueryRunner();  
  21.     public void createNews(News news) {  
  22.           
  23.         Connection conn = null;  
  24.         String sql = "insert into news(name,detail) "  
  25.                 + " values(?,?)";  
  26.         Object[] param = { news.getName(),news.getDetail() };  
  27.         try {  
  28.             conn = ConnectionFactory.getConn();  
  29.             qr.update(conn, sql, param);  
  30.         } catch (SQLException e) {  
  31.             e.printStackTrace();  
  32.             throw new DAOException("新增新闻信息时出现异常", e);  
  33.         } finally {  
  34.             DbUtils.closeQuietly(conn);  
  35.         }  
  36.   
  37.     }  
  38.   
  39.     public PageModel<News> findByPager(int pageNo, int pageSize) {  
  40.         PageModel<News> pm=new PageModel<News>();  
  41.         Connection conn=null;  
  42.         String sql="select *from news limit ?,?";  
  43.         Object[] param={(pageNo-1)*pageSize,pageSize};  
  44.         List<News> cates=null;  
  45.         int count;  
  46.         try {  
  47.             conn=ConnectionFactory.getConn();  
  48.             cates=(List<News>)qr.query(conn, sql, new BeanListHandler(News.class), param);  
  49.             pm.setDatas(cates);  
  50.             pm.setRecordCount(findTotalSize());  
  51.         } catch (SQLException e) {            
  52.             e.printStackTrace();  
  53.             throw new DAOException("分页查询出错",e);  
  54.         }finally{  
  55.             DbUtils.closeQuietly(conn);  
  56.         }  
  57.         return pm;  
  58.     }  
  59.   
  60.     public void delete(int id) {  
  61.         Connection conn = null;  
  62.         String sql = "delete from news where id=?";  
  63.         Object[] param = { id };  
  64.         try {  
  65.             conn = ConnectionFactory.getConn();  
  66.             qr.update(conn, sql, param);  
  67.         } catch (SQLException e) {  
  68.             e.printStackTrace();  
  69.             throw new DAOException("删除新闻信息时出现异常", e);  
  70.         } finally {  
  71.             DbUtils.closeQuietly(conn);  
  72.         }  
  73.     }  
  74.   
  75.     public News findbyId(int id) {  
  76.         News news=null;  
  77.         Connection conn=null;  
  78.         String sql="select * from news where id=?";  
  79.         Object[] param={id};  
  80.         try {  
  81.             conn=ConnectionFactory.getConn();  
  82.             news=(News)qr.query(conn,sql, new BeanHandler(News.class), param);  
  83.         } catch (SQLException e) {  
  84.             e.printStackTrace();  
  85.             throw new DAOException("根据ID查询新闻信息时出现异常",e);  
  86.         }finally{  
  87.             DbUtils.closeQuietly(conn);  
  88.         }  
  89.         return news;  
  90.     }  
  91.   
  92.     public void update(News news) {  
  93.         Connection conn=null;  
  94.         String sql="update news set name=?,detail=? where id=?";  
  95.         Object[] param={news.getName(),news.getDetail(),news.getId()};  
  96.         try {  
  97.             conn=ConnectionFactory.getConn();  
  98.             qr.update(conn, sql, param);  
  99.               
  100.         } catch (SQLException e) {  
  101.             e.printStackTrace();  
  102.             throw new DAOException("更新新闻信息出错",e);  
  103.         }finally{  
  104.             DbUtils.closeQuietly(conn);  
  105.         }         
  106.     }  
  107.   
  108.     public int findTotalSize() {  
  109.         Connection conn=null;  
  110.         String sql="select count(id) from news";  
  111.         int count=0;  
  112.         try {  
  113.             conn=ConnectionFactory.getConn();  
  114.             count=((Long)qr.query(conn,sql,new ScalarHandler())).intValue();  
  115.               
  116.         } catch (SQLException e) {  
  117.             e.printStackTrace();  
  118.             throw new DAOException("查询记录总数出错",e);  
  119.         }finally{  
  120.             DbUtils.closeQuietly(conn);  
  121.         }  
  122.         return count;  
  123.     }  
  124.   
  125. }</span>  

 PageModel.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.common;  
  2.   
  3. import java.util.List;  
  4.   
  5. /**  
  6.  * 分页组件(包含当前页结果数据列表和总记录数)  
  7.  * 注意,它不是持久化实体类  
  8.  *   
  9.  */    
  10. public class PageModel<T> {    
  11.     private int recordCount;    
  12.     private List<T> datas;    
  13.         
  14.         
  15.     public int getRecordCount() {    
  16.         return recordCount;    
  17.     }    
  18.     public void setRecordCount(int recordCount) {    
  19.         this.recordCount = recordCount;    
  20.     }    
  21.     public List<T> getDatas() {    
  22.         return datas;    
  23.     }    
  24.     public void setDatas(List<T> datas) {    
  25.         this.datas = datas;    
  26.     }    
  27. }  </span>  

 

 数据库连接工具类

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.common;  
  2.   
  3. import java.io.IOException;  
  4. import java.sql.Connection;  
  5. import java.sql.SQLException;  
  6. import java.util.Properties;  
  7.   
  8. import javax.sql.DataSource;  
  9.   
  10. import org.apache.commons.dbcp.BasicDataSource;  
  11.   
  12. /** 
  13.  *  
  14.  * 数据库连接工厂类 
  15.  *  
  16.  */  
  17. public class ConnectionFactory {  
  18.     private static DataSource dss=null;  
  19.     static{  
  20.         Properties pr=new Properties();  
  21.         try {  
  22.             pr.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));  
  23.         } catch (IOException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.         BasicDataSource ds=new BasicDataSource();  
  27.         ds.setDriverClassName(pr.getProperty("driver_name"));  
  28.         ds.setUrl(pr.getProperty("url"));  
  29.         ds.setUsername(pr.getProperty("username"));  
  30.         ds.setPassword(pr.getProperty("password"));  
  31.         dss=ds;  
  32.     }  
  33.     private ConnectionFactory(){}  
  34.     public static Connection getConn() throws SQLException{  
  35.         return dss.getConnection();  
  36.     }  
  37.   
  38. }</span>  

  上面代码用到的config.properties

Xml代码  收藏代码
  1. <span style="font-size: medium;">#mysql  
  2. driver_name=com.mysql.jdbc.Driver  
  3. url=jdbc:mysql:///jstl  
  4. username=root  
  5. password=root</span>  

DAO实例工具类,类似于Spring的BeanFactory

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.common;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Properties;  
  5.   
  6. /** 
  7.  *  
  8.  *  
  9.  *  自定义简单工厂 
  10.  */  
  11. public class DAOFactory {  
  12.     public static Properties pr = new Properties();  
  13.     static {  
  14.         try {  
  15.             pr.load(Thread.currentThread().getContextClassLoader()  
  16.                     .getResourceAsStream("daoname.properties"));  
  17.         } catch (IOException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22.     public static Object newInstance(String name){  
  23.         Object obj=null;  
  24.         String daoImplName = pr.getProperty(name);  
  25.         if(null!=daoImplName){  
  26.             try {  
  27.                 obj=Class.forName(daoImplName).newInstance();  
  28.             } catch (InstantiationException e) {  
  29.                 // TODO Auto-generated catch block  
  30.                 e.printStackTrace();  
  31.             } catch (IllegalAccessException e) {  
  32.                 // TODO Auto-generated catch block  
  33.                 e.printStackTrace();  
  34.             } catch (ClassNotFoundException e) {  
  35.                 // TODO Auto-generated catch block  
  36.                 e.printStackTrace();  
  37.             }  
  38.         }else{  
  39.             throw new RuntimeException("指定名称的DAO类未找到");  
  40.         }  
  41.         return obj;  
  42.     }  
  43. }</span>  

  上面代码用到的配置daoname.properties

Xml代码  收藏代码
  1. <span style="font-size: medium;">newsdao=com.javacrazyer.daoimpl.NewsDaoImpl  
  2. coursedao=com.javacrazyer.web.tag.CourseDAOImpl  
  3. teacherdao=com.javacrazyer.web.tag.TeacherDAOImpl  
  4. catedao=com.javacrazyer.web.tag.CategoryDAOImpl  
  5. gradao=com.javacrazyer.web.tag.GraduateDAOImpl  
  6. accountdao=com.javacrazyer.web.tag.AccountDAOImpl</span>  

 平时开发中常用到的常量存放类

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.common;  
  2.   
  3. import java.util.LinkedHashMap;  
  4. import java.util.Map;  
  5.   
  6. /** 
  7.  * 系统常量类 
  8.  *  
  9.  * @author tjitcast.com 
  10.  */  
  11. public class Constant {  
  12.       
  13.       
  14.     /** 状态:可用 */  
  15.     public static final int STATUS_ACTIVE = 1;  
  16.     /** 状态:不可用 */  
  17.     public static final int STATUS_INACTIVE = 0;  
  18.   
  19.     /** 课程类型:全日制 */  
  20.     public static final int COURSE_FULL_TIME = 1;  
  21.     /** 课程类型:业务 */  
  22.     public static final int COURSE_SPARE_TIME = 2;  
  23.     /** 课程类型:免费 */  
  24.     public static final int COURSE_FREE_TIME = 3;  
  25.   
  26.     /** 账号类型:超级管理员 */  
  27.     public static final int ACCOUNT_SUPER = 100;  
  28.     /** 账号类型:普通管理员 */  
  29.     public static final int ACCOUNT_COMMON = 50;  
  30.   
  31.     /** 账号状态:激活 */  
  32.     public static final int ACCOUNT_STATUS_ACTIVE = 1;  
  33.     /** 账号状态:未激活 */  
  34.     public static final int ACCOUNT_STATUS_INACTIVE = 0;  
  35.     /** 账号状态:锁定 */  
  36.     public static final int ACCOUNT_STATUS_LOCK = -1;  
  37.   
  38.     /** 每页要显示的记录数:10 */  
  39.     public static final int PAGE_SIZE =10;  
  40.   
  41.     private static Map<Integer, String> statusMap = new LinkedHashMap<Integer, String>();  
  42.   
  43.     static {  
  44.         // 对状态Map进行初始化  
  45.         statusMap.put(Integer.valueOf(STATUS_ACTIVE), "可用");  
  46.         statusMap.put(Integer.valueOf(STATUS_INACTIVE), "不可用");  
  47.     }  
  48.   
  49.     public static Map<Integer, String> getStatusMap() {  
  50.         return statusMap;  
  51.     }  
  52.   
  53. }</span>  

 

开发中常用到的用来判断空值,类型转换,集合操作等等的自定义常用工具类

Java代码  收藏代码
  1. <span style="font-size: medium;">/** 
  2.  *  ClassName: DataValidateUtil.java 
  3.  *  created on Jul 10, 2009 
  4.  *  Copyrights 2009 www.tjicast.com All rights reserved. 
  5.  *  site: http://www.tjitcast.com 
  6.  *  email: tjhr@csdn.net 
  7.  *  phone: 022-83726777,89721888 
  8.  */  
  9. package com.javacrazyer.common;  
  10.   
  11. import java.text.ParseException;  
  12. import java.text.SimpleDateFormat;  
  13. import java.util.Collection;  
  14. import java.util.Date;  
  15. import java.util.Map;  
  16.   
  17. /** 
  18.  * 对一些常用数据进行操作的工具类 
  19.  *  
  20.  */  
  21. public class DataOptUtil {  
  22.       
  23.       
  24.     /** 日期长格式 */  
  25.     public static final String DATE_PATTERN_LONG = "yyyy-MM-dd HH:mm:ss";  
  26.     /** 日期格式 */  
  27.     public static final String DATE_PATTERN = "yyyy-MM-dd";  
  28.       
  29.     public static boolean isNotNull(String str){  
  30.         if(null != str && !"".equals(str)){  
  31.             return true;  
  32.         }else{  
  33.             return false;  
  34.         }  
  35.     }  
  36.       
  37.     public static int parseInt(String str){  
  38.         if(isNotNull(str)){  
  39.             return Integer.parseInt(str);  
  40.         }else{  
  41.             throw new RuntimeException("字符串为空,不能转换成数字");  
  42.         }  
  43.     }  
  44.       
  45.     public static Date parseDate(String str, String pattern){  
  46.         SimpleDateFormat sdf = new SimpleDateFormat(pattern);  
  47.         Date date = null;  
  48.         if(isNotNull(str)){  
  49.             try {  
  50.                 date = sdf.parse(str);  
  51.             } catch (ParseException e) {  
  52.                 e.printStackTrace();  
  53.             }  
  54.         }else{  
  55.             throw new RuntimeException("字符串为空,不能转换成日期");  
  56.         }  
  57.         return date;  
  58.     }  
  59.       
  60.     public static Date parseDate(String str){  
  61.         return parseDate(str, DataOptUtil.DATE_PATTERN);  
  62.     }  
  63.       
  64.     public static Date parseLongDate(String str){  
  65.         return parseDate(str, DataOptUtil.DATE_PATTERN_LONG);  
  66.     }  
  67.       
  68.     public static String date2String(Date date, String pattern){  
  69.         SimpleDateFormat sdf = new SimpleDateFormat(pattern);  
  70.         return sdf.format(date);  
  71.     }  
  72.       
  73.     public static String Date2String(Date date){  
  74.         return date2String(date, DataOptUtil.DATE_PATTERN);  
  75.     }  
  76.       
  77.     public static String Date2LongString(Date date){  
  78.         return date2String(date, DataOptUtil.DATE_PATTERN_LONG);  
  79.     }  
  80.       
  81.     public static int getSize(Collection<?> coll){  
  82.         int size = coll == null ? 0 : coll.size();  
  83.         return size;  
  84.     }  
  85.       
  86.     public static int getSize(Map<?,?> map){  
  87.         int size = map == null ? 0 : map.size();  
  88.         return size;  
  89.     }  
  90.       
  91.     public static int getLength(Object[] obj){  
  92.         int length = 0;  
  93.         length = obj == null ? 0 : obj.length;  
  94.         return length;  
  95.     }  
  96. }</span>  

 

还有一个自定义非受检异常类

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.common;  
  2.   
  3. /** 
  4.  * 
  5.  * 自定义的非受检异常 
  6.  *  
  7.  */  
  8. public class DAOException extends RuntimeException {  
  9.   
  10.     private static final long serialVersionUID = 1047748781772098415L;  
  11.   
  12.     public DAOException() {  
  13.         super();  
  14.     }  
  15.   
  16.     public DAOException(String message, Throwable cause) {  
  17.         super(message, cause);  
  18.     }  
  19.   
  20.     public DAOException(String message) {  
  21.         super(message);  
  22.     }  
  23.   
  24.     public DAOException(Throwable cause) {  
  25.         super(cause);  
  26.     }  
  27.       
  28. }  
  29. </span>  

 

页面方面

index.html

Java代码  收藏代码
  1. <span style="font-size: medium;"><html>  
  2.     <head>  
  3.          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
  4.         <meta http-equiv="refresh" content="0; url=do.jsp" />  
  5.     </head>  
  6. </html></span>  

 

do.jsp

Java代码  收藏代码
  1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@page import="com.javacrazyer.common.DAOFactory"%>  
  3. <%@page import="com.javacrazyer.dao.NewsDao"%>  
  4. <%@page import="com.javacrazyer.common.PageModel"%>  
  5. <%@page import="com.javacrazyer.common.DataOptUtil"%>  
  6. <%@page import="com.javacrazyer.common.Constant"%>  
  7. <%@page import="com.javacrazyer.domain.News"%>  
  8. <%  
  9. NewsDao dao=(NewsDao)DAOFactory.newInstance("newsdao");  
  10.   
  11. int pageNo = 1;  
  12. String temp = request.getParameter("pageNo");  
  13. if (DataOptUtil.isNotNull(temp)) {  
  14.     pageNo = Integer.parseInt(temp);  
  15. }  
  16. int categoryid = 1;  
  17. String temp1 = request.getParameter("category_id");  
  18. if (DataOptUtil.isNotNull(temp1)) {  
  19.     categoryid = Integer.parseInt(temp1);  
  20. }  
  21. PageModel<News> pm=dao.findByPager(pageNo,Constant.PAGE_SIZE);  
  22. request.setAttribute("pm",pm);  
  23. request.setAttribute("pageNo", Integer.valueOf(pageNo));  
  24. request.setAttribute("pageSize", Constant.PAGE_SIZE);  
  25. request.getRequestDispatcher("/index.jsp").forward(request,response);  
  26. %></span>  

 index.jsp

Java代码  收藏代码
  1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@taglib uri="http://javacrazyer.iteye.com/tags/pager" prefix="w"%>  
  3. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
  4. <%  
  5. String path = request.getContextPath();  
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  7. %>  
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.   <head>  
  12.     <base href="<%=basePath%>">  
  13.       
  14.     <title>My JSP 'index.jsp' starting page</title>  
  15.     <meta http-equiv="pragma" content="no-cache">  
  16.     <meta http-equiv="cache-control" content="no-cache">  
  17.     <meta http-equiv="expires" content="0">      
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  19.     <meta http-equiv="description" content="This is my page">  
  20.     <!--  
  21.     <link rel="stylesheet" type="text/css" href="styles.css">  
  22.     -->  
  23.   </head>  
  24.     
  25.   <body>  
  26.    <h3>新闻列表</h3><hr/>  
  27.    <table>  
  28.    <tr><td>新闻编号</td><td>新闻标题</td><td>新闻内容</td></tr>   
  29.    <c:forEach items="${pm.datas}" var="news">  
  30.    <tr><td>${news.id}</td><td>${news.name }</td><td>${news.detail}</td></tr>  
  31.    </c:forEach>  
  32.    </table>  
  33.    <w:pager pageSize="${pageSize}" pageNo="${pageNo}" url="do.jsp" recordCount="${pm.recordCount}"/>  
  34.   </body>  
  35. </html></span>  

 实际运行出来的效果



虽然自定义标签使用成功了,但总不可能每次开发项目都写下这个类和加上TLD文件吧,比较简洁的方式就是将编译类编译好的class文件和tld一起打成jar包,以后直接导入到项目lib中就可以使用了

 

具体步骤:将整个目录com/javacrazyer/web/tag/PagerTag.class放到一个目录中去,同时将META-INF拷贝到与com目录相同的目录下,最后将WEB-INF下的pager.tld拷贝到MET-INF下


META-INF中的文件
 

最后将com文件夹与META-INF文件选中右键添加到压缩文件,选中ZIP压缩格式



改名为jar后缀后确定,这样在同一目录就会多出一个jar来了


 

 

以后只要在需要的地方导入该分页JAR包,并且在网页上

<%@taglib uri="http://javacrazyer.iteye.com/tags/pager" prefix="w"%>

 <w:pager pageSize="${pageSize}" pageNo="${pageNo}" url="do.jsp" 

分享到:
评论

相关推荐

    struts2自定义标签案例详解

    例如,在示例中创建了一个名为`tangs.tld`的文件,其中包含了对自定义分页标签`pages`的定义。TLD文件遵循JSP Tag Library 1.2的DTD规范,使得Web服务器可以解析并理解自定义标签的结构。 ```xml &lt;!-- tangs.tld --...

    自定义分页标签

    ### 自定义分页标签知识点详解 #### 一、概述 在Web开发中,分页是一项常见的功能需求。本文档将详细介绍一个使用Java Server Pages (JSP)技术实现的自定义分页标签——`PagerTag`。该标签允许开发者在不编写冗余...

    自定义JSP分页标签

    而在Java Web开发中,利用JSP(Java Server Pages)技术进行网页开发时,自定义分页标签能够更加灵活高效地实现分页功能。本文将详细介绍如何自定义一个JSP分页标签,并通过具体的代码示例来演示其实现过程。 #### ...

    hibernate + 自定义标签分页

    本例中,我们探讨的是如何结合Struts、Hibernate和自定义标签实现分页功能,这是一种常见的优化用户界面体验的技术,特别是对于数据量大的查询结果。 1. **分页原理** 分页的基本思想是将大量数据分成多个小部分,...

    GridView自定义分页实例详解(附demo源码下载)

    标题中提到的“GridView自定义分页实例详解”表明本文将重点讲解如何实现自定义分页功能,使用的是GridView控件。自定义分页是指在不使用***自带的分页功能(如GridView自带的分页功能)的情况下,通过编程方式来...

    JSTL JSP 自定义标签 分页

    1.分页标签库 PageModel pagem = new PageModel(); pagem.setDtotal(168); pagem.setPerPageNum(10); pagem.executeCalculate(); if(null!=request.getParameter("cpage")){ pagem.setCpage(Integer.valueOf...

    Jsp 自定义标签 分页TagSuport

    **JSP自定义标签(Tag Support)详解** 在Java服务器页面(JSP)技术中,自定义标签是扩展JSP功能的重要手段,它允许开发者创建可重用的、符合XML语法规则的自定义标签库,以提高代码的可读性和可维护性。本篇文章...

    jpager分页标签(用于jsp页面中数据分页)

    **JPager 分页标签库详解** 在Web开发中,数据分页是一项常见且重要的功能,尤其是在处理大量数据时,为了提高用户体验和加载速度,我们通常会将数据分页展示。`jpager` 是一个专为 JSP 页面设计的分页标签库,它...

    KingCMS的自定义模型标签

    ### KingCMS自定义模型标签详解 #### 一、KingCMS简介 KingCMS是一款基于Web技术构建的内容管理系统(CMS),以其小巧、高效、人性化的特点而受到众多网站开发者的青睐。它能够帮助用户轻松地管理和发布网站内容,...

    asp.net2.0 大数据量分页

    #### 自定义分页技术详解 ##### SQL Server 2005 新特性支持 为了更好地实现自定义分页,Microsoft SQL Server 2005 引入了一个新的关键字来帮助排序结果,这使得我们可以编写更高效的查询语句来精确获取所需的子集...

    source insight 分页标签插件

    **Source Insight 分页标签插件:sihook 使用详解** Source Insight是一款广受欢迎的源代码查看和编辑工具,尤其在程序员和软件开发人员中备受青睐。它提供了强大的代码导航、搜索和分析功能。为了进一步增强其功能...

    asp.net web页面自定义分页控件使用详解

    本文档就详尽地介绍了一个自定义分页控件在*** Web页面中的实现过程,让我们一起来深入理解其实现原理和关键知识点。 首先,自定义分页控件的开发通常从创建一个ASCX文件开始,该文件是***的用户控件,可以包含HTML...

    jsp分页标签

    **JSP分页标签详解** 在Java Web开发中,数据量较大的时候,为了提高用户体验,通常会采用分页展示数据。JSP(JavaServer Pages)作为动态网页技术,提供了多种方式来实现分页功能,其中之一就是使用分页标签。本文...

    jsp表格显示及分页标签

    《jsp表格显示及分页标签详解》 在Java Web开发中,JSP(JavaServer Pages)作为常用的服务器端脚本语言,常常用于构建动态网页。然而,为了提高开发效率和用户体验,开发者通常会使用标签库(Tag Library)来简化...

    jsp自定义标签实例

    ### JSP自定义标签知识点详解 #### 一、概述 JSP(JavaServer Pages)是一种基于Java技术的服务器端动态网页开发技术。JSP自定义标签则是为了提高JSP页面的可读性和重用性而引入的一个重要特性。通过自定义标签,...

    ActivityGroup + GridView 实现Tab分页标签

    在Android开发中,实现Tab分页标签是一种常见的用户界面设计,可以为用户提供便捷的导航体验。本示例中,我们采用`ActivityGroup`和`GridView`来构建这种功能。`ActivityGroup`是早期Android SDK中的一个类,用于在...

    在django中使用自定义标签实现分页功能

    ### 在Django中使用自定义标签实现分页功能 #### 概述 本文将详细介绍如何在Django项目中通过自定义模板标签的方式来实现一个高级、动态的分页功能。分页是在任何涉及到大量数据展示的应用中都不可或缺的一个功能。...

    jQuery实现的可自定义输入页码的分页插件jqPagination.zip

    - `selector`: 自定义分页按钮的DOM元素选择器,默认是`.jq-pagination-item`. - `onInit`: 插件初始化完成后的回调函数。 此外,你还可以通过`setPage`方法动态改变当前页,例如: ```javascript $("#pagination...

    ci_分页类_pages

    CI 分页类还支持更多高级特性,如分页的URL参数传递、使用路由规则、自定义分页标签等,可以根据具体需求进行扩展。 总的来说,CI 分页类为开发者提供了一种简单、灵活的方式来管理大量数据的分页显示,通过合理的...

Global site tag (gtag.js) - Google Analytics