• 自定义分页标签详解


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

    既然是自定义标签那么肯定少不了类和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;#ff0000;color: #FFF;}");  
    34.         sb.append(".pagination span.disabled {padding: 2px 5px;margin: 2px;border: 1px solid #eee; color: #ddd;}");  
    35.         sb.append("</style> ");  
    36.         sb.append("<div class="pagination"> ");  
    37.         if(recordCount == 0){  
    38.             sb.append("<strong>没有可显示的项目</strong> ");  
    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"> ");  
    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(""/> ");  
    69.             }  
    70.       
    71.             // 把当前页号设置成请求参数  
    72.             sb.append("<input type="hidden" name="").append("pageNo")  
    73.                 .append("" value="").append(pageNo).append(""/> ");  
    74.               
    75.             // 输出统计数据  
    76.             sb.append("&nbsp;共<strong>").append(recordCount)  
    77.                 .append("</strong>项")  
    78.                 .append(",<strong>")  
    79.                 .append(pageCount)  
    80.                 .append("</strong>页:&nbsp; ");  
    81.               
    82.             //上一页处理  
    83.             if (pageNo == 1) {  
    84.                 sb.append("<span class="disabled">&laquo;&nbsp;上一页")  
    85.                     .append("</span> ");  
    86.             } else {  
    87.                 sb.append("<a href="javascript:turnOverPage(")  
    88.                   .append((pageNo - 1))  
    89.                   .append(")">&laquo;&nbsp;上一页</a> ");  
    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> ");  
    97.                 sb.append("<a href="javascript:turnOverPage(2)">2</a> ");  
    98.                 sb.append("&hellip; ");  
    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> ");  
    110.                 }else{  
    111.                     sb.append("<a href="javascript:turnOverPage(")  
    112.                         .append(i)  
    113.                         .append(")">")  
    114.                         .append(i)  
    115.                         .append("</a> ");  
    116.                 }  
    117.             }  
    118.             //如果后面页数过多,显示"..."  
    119.             if(end < pageCount - 2){  
    120.                 sb.append("&hellip; ");  
    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> ");  
    128.             }  
    129.             if(end < pageCount){  
    130.                 sb.append("<a href="javascript:turnOverPage(")  
    131.                 .append(pageCount)  
    132.                 .append(")">")  
    133.                 .append(pageCount)  
    134.                 .append("</a> ");   
    135.             }  
    136.               
    137.             //下一页处理  
    138.             if (pageNo == pageCount) {  
    139.                 sb.append("<span class="disabled">下一页&nbsp;&raquo;")  
    140.                     .append("</span> ");  
    141.             } else {  
    142.                 sb.append("<a href="javascript:turnOverPage(")  
    143.                     .append((pageNo + 1))  
    144.                     .append(")">下一页&nbsp;&raquo;</a> ");  
    145.             }  
    146.             sb.append("</form> ");  
    147.       
    148.             // 生成提交表单的JS  
    149.             sb.append("<script language="javascript"> ");  
    150.             sb.append("  function turnOverPage(no){ ");  
    151.             sb.append("    if(no>").append(pageCount).append("){");  
    152.             sb.append("      no=").append(pageCount).append(";} ");  
    153.             sb.append("    if(no<1){no=1;} ");  
    154.             sb.append("    document.qPagerForm.pageNo.value=no; ");  
    155.             sb.append("    document.qPagerForm.submit(); ");  
    156.             sb.append("  } ");  
    157.             sb.append("</script> ");  
    158.         }  
    159.         sb.append("</div> ");  
    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.   `name` varchar(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" 

    • JSTL_Pager.rar (991.6 KB)
    • 描述: 完整分页标签项目
    • 下载次数: 542
  • 相关阅读:
    BZOJ1070[SCOI2007]修车
    BZOJ1061[Noi2008] 志愿者招募
    BZOJ 3511 土地划分
    BZOJ3130 [Sdoi2013]费用流
    POJ1797 Heavy Transportation
    P2866 糟糕的一天
    P1155 双栈排序
    P1027 car的旅行路线
    POJ3037 Skiing
    POJ1125 Stockbroker Grapevine
  • 原文地址:https://www.cnblogs.com/soundcode/p/6305969.html
Copyright © 2020-2023  润新知