自定义分页标签详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

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

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

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

   Java代码  收藏代码

  1. "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("");  
  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("\r\n");  
  36.        sb.append("\r\n");  
  37.        if(recordCount == 0){  
  38.            sb.append("没有可显示的项目\r\n");  
  39.        }else{  
  40.            //页号越界处理  
  41.            if(pageNo > pageCount){      pageNo = pageCount; }  
  42.            if(pageNo < 1){      pageNo = 1; }  
  43.              
  44.            sb.append("this.url)  
  45.                .append("\" name=\"qPagerForm\">\r\n");  
  46.              
  47.            //获取请求中的所有参数  
  48.            HttpServletRequest request = (HttpServletRequest) pageContext  
  49.                    .getRequest();  
  50.            Enumeration 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("
  65.                  .append(name)  
  66.                  .append("\" value=\"")  
  67.                  .append(value)  
  68.                  .append("\"/>\r\n");  
  69.            }  
  70.      
  71.            // 把当前页号设置成请求参数  
  72.            sb.append(""pageNo")  
  73.                .append("\" value=\"").append(pageNo).append("\"/>\r\n");  
  74.              
  75.            // 输出统计数据  
  76.            sb.append(" 共").append(recordCount)  
  77.  
  78.                .append("项")  
  79.                .append(",")  
  80.  
  81.                .append(pageCount)  
  82.  
  83.                .append("页: \r\n");  
  84.              
  85.            //上一页处理  
  86.            if (pageNo == 1) {  
  87.                sb.append("« 上一页")  
  88.                    .append("\r\n");  
  89.            } else {  
  90.                sb.append("
  91.                  .append((pageNo - 1))  
  92.                  .append(")\">« 上一页\r\n");  
  93.            }  
  94.              
  95.            //如果前面页数过多,显示"..."  
  96.            int start = 1;  
  97.            if(this.pageNo > 4){  
  98.                start = this.pageNo - 1;  
  99.                sb.append("1\r\n");  
  100.                sb.append("2\r\n");  
  101.                sb.append("…\r\n");  
  102.            }  
  103.            //显示当前页附近的页  
  104.            int end = this.pageNo + 1;  
  105.            if(end > pageCount){  
  106.                end = pageCount;  
  107.            }  
  108.            for(int i = start; i <= end; i++){  
  109.                if(pageNo == i){   //当前页号不需要超链接  
  110.                    sb.append("")  
  111.                        .append(i)  
  112.                        .append("\r\n");  
  113.                }else{  
  114.                    sb.append("
  115.                        .append(i)  
  116.                        .append(")\">")  
  117.                        .append(i)  
  118.                        .append("\r\n");  
  119.                }  
  120.            }  
  121.            //如果后面页数过多,显示"..."  
  122.            if(end < pageCount - 2){  
  123.                sb.append("…\r\n");  
  124.            }  
  125.            if(end < pageCount - 1){  
  126.                sb.append("
  127.                .append(pageCount - 1)  
  128.                .append(")\">")  
  129.                .append(pageCount - 1)  
  130.                .append("\r\n");  
  131.            }  
  132.            if(end < pageCount){  
  133.                sb.append("
  134.                .append(pageCount)  
  135.                .append(")\">")  
  136.                .append(pageCount)  
  137.                .append("\r\n");  
  138.            }  
  139.              
  140.            //下一页处理  
  141.            if (pageNo == pageCount) {  
  142.                sb.append("下一页 »")  
  143.                    .append("\r\n");  
  144.            } else {  
  145.                sb.append("
  146.                    .append((pageNo + 1))  
  147.                    .append(")\">下一页 »\r\n");  
  148.            }  
  149.            sb.append("\r\n");  
  150.      
  151.            // 生成提交表单的JS  
  152.            sb.append("\r\n");  
  153.            sb.append("  function turnOverPage(no){\r\n");  
  154.            sb.append("    if(no>").append(pageCount).append("){");  
  155.            sb.append("      no=").append(pageCount).append(";}\r\n");  
  156.            sb.append("    if(no<1){no=1;}\r\n");  
  157.            sb.append("    document.qPagerForm.pageNo.value=no;\r\n");  
  158.            sb.append("    document.qPagerForm.submit();\r\n");  
  159.            sb.append("  }\r\n");  
  160.            sb.append("\r\n");  
  161.        }  
  162.        sb.append("

\r\n");      

  •          
  •        //把生成的HTML输出到响应中  
  •        try {  
  •            pageContext.getOut().println(sb.toString());  
  •        } catch (IOException e) {  
  •            throw new JspException(e);  
  •        }  
  •        return SKIP_BODY;  //本标签主体为空,所以直接跳过主体  
  •    }  
  •  
  •    public void setUrl(String url) {  
  •        this.url = url;  
  •    }  
  •    public void setPageSize(int pageSize) {  
  •        this.pageSize = pageSize;  
  •    }  
  •    public void setPageNo(int pageNo) {  
  •        this.pageNo = pageNo;  
  •    }  
  •    public void setRecordCount(int recordCount) {  
  •        this.recordCount = recordCount;  
  •    }  
  • }  
  • 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.9tlib-version>  
    6.    
    7.    <short-name>wshort-name>  
    8.      
    9.    <uri>http://javacrazyer.iteye.com/tags/pageruri>  
    10.      
    11.      
    12.    <tag>  
    13.          
    14.        <name>pagername>  
    15.          
    16.        <tag-class>com.javacrazyer.web.tag.PagerTagtag-class>  
    17.          
    18.        <body-content>emptybody-content>  
    19.          
    20.        <attribute>  
    21.              
    22.            <name>pageNoname>  
    23.              
    24.            <required>truerequired>  
    25.              
    26.            <rtexprvalue>truertexprvalue>  
    27.              
    28.            <type>inttype>  
    29.        attribute>  
    30.          
    31.        <attribute>  
    32.            <name>recordCountname>  
    33.            <required>truerequired>  
    34.            <rtexprvalue>truertexprvalue>  
    35.            <type>inttype>  
    36.        attribute>  
    37.          
    38.        <attribute>  
    39.            <name>pageSizename>  
    40.            <required>truerequired>  
    41.            <rtexprvalue>truertexprvalue>  
    42.            <type>inttype>  
    43.        attribute>  
    44.          
    45.        <attribute>  
    46.            <name>urlname>  
    47.            <required>truerequired>  
    48.            <rtexprvalue>truertexprvalue>  
    49.            <type>java.lang.Stringtype>  
    50.        attribute>  
    51.    tag>  
    52. taglib>span>  

     

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

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

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

    然后使用:

     

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

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

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

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



     

     

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

       Sql代码  收藏代码

    1. "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.  

     

    实体类News.java

       Java代码  收藏代码

    1. "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. }  

    NewsDao.java

       Java代码  收藏代码

    1. "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 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. }  

    NewsImplDao.java

       Java代码  收藏代码

    1. "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 findByPager(int pageNo, int pageSize) {  
    40.        PageModel pm=new PageModel();  
    41.        Connection conn=null;  
    42.        String sql="select *from news limit ?,?";  
    43.        Object[] param={(pageNo-1)*pageSize,pageSize};  
    44.        List cates=null;  
    45.        int count;  
    46.        try {  
    47.            conn=ConnectionFactory.getConn();  
    48.            cates=(List)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. }  

    PageModel.java

       Java代码  收藏代码

    1. "font-size: medium;">package com.javacrazyer.common;  
    2.  
    3. import java.util.List;  
    4.  
    5. /**  
    6. * 分页组件(包含当前页结果数据列表和总记录数)  
    7. * 注意,它不是持久化实体类  
    8. *  
    9. */    
    10. public class PageModel {    
    11.    private int recordCount;    
    12.    private List 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 getDatas() {    
    22.        return datas;    
    23.    }    
    24.    public void setDatas(List datas) {    
    25.        this.datas = datas;    
    26.    }    
    27. }    

     

    数据库连接工具类

       Java代码  收藏代码

    1. "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. }  

     上面代码用到的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=rootspan>  

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

       Java代码  收藏代码

    1. "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. }  

     上面代码用到的配置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.AccountDAOImplspan>  

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

       Java代码  收藏代码

    1. "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 statusMap = new LinkedHashMap();  
    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 getStatusMap() {  
    50.        return statusMap;  
    51.    }  
    52.  
    53. }  

     

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

       Java代码  收藏代码

    1. "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. }  

     

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

       Java代码  收藏代码

    1. "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.  

     

    页面方面

    index.html

       Java代码  收藏代码

    1. "font-size: medium;">  
    2.      
    3.         "Content-Type" content="text/html; charset=UTF-8" />  
    4.        "refresh" content="0; url=do.jsp" />  
    5.      
    6.  

     

    do.jsp

       Java代码  收藏代码

    1. "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 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. %>  

    index.jsp

       Java代码  收藏代码

    1. "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. "-//W3C//DTD HTML 4.01 Transitional//EN">  
    10.  
    11.    
    12.    "<%=basePath%>">  
    13.      
    14.    My JSP <span class="string" style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">'index.jsp' starting page  
    15.    "pragma" content="no-cache">  
    16.    "cache-control" content="no-cache">  
    17.    "expires" content="0">      
    18.    "keywords" content="keyword1,keyword2,keyword3">  
    19.    "description" content="This is my page">  
    20.      
    21.    
    22.    
    23.    
    24.  

      新闻列表


       
    25.    
    26.  
    27.   "${pm.datas}" var="news">  
    28.  
    29.    
    30.  
    31. 新闻编号 新闻标题 新闻内容
      ${news.id} ${news.name } ${news.detail}
    32.   "${pageSize}" pageNo="${pageNo}" url="do.jsp" recordCount="${pm.recordCount}"/>  
    33.    
    34.  

    实际运行出来的效果



    虽然自定义标签使用成功了,但总不可能每次开发项目都写下这个类和加上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"%>

     

     

     

     

     

     

     

    • JSTL_Pager.rar (991.6 KB)
    • 描述: 完整分页标签项目
    • 下载次数: 542

    本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/6305969.html,如需转载请自行联系原作者

    相关实践学习
    每个IT人都想学的“Web应用上云经典架构”实战
    本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
    MySQL数据库入门学习
    本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
    相关文章
    |
    2月前
    |
    人工智能 数据处理
    Qoder 全新「上下文压缩」功能正式上线,省 Credits !
    Qoder 全新「上下文压缩」功能正式上线,高效管理会话上下文,节省开发成本,同时保持高效协作!
    |
    2月前
    |
    安全 Linux Shell
    Linux系统提权方式全面总结:从基础到高级攻防技术
    本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
    280 1
    |
    7月前
    |
    存储 机器学习/深度学习 人工智能
    阿里云第八代云服务器c8i与g8i深度解析:技术对比、场景适配与选购指南
    阿里云服务器计算型c8i与通用型g8i实例属于阿里云的第八代云服务器实例规格,是除了计算型c7与c8y和通用型g7与g8y之外同样深受用户喜欢的云服务器实例规格。本文将详细解析计算型c8i与通用型g8i实例的技术特性、适用场景、性能优势,以及最新的活动价格情况,并为用户提供购买建议。
    |
    数据可视化 数据挖掘 数据处理
    R语言高级可视化技巧:使用Plotly与Shiny制作互动图表
    【8月更文挑战第30天】通过使用`plotly`和`shiny`,我们可以轻松地创建高度互动的数据可视化图表。这不仅增强了图表的表现力,还提高了用户与数据的交互性,使得数据探索变得更加直观和高效。本文仅介绍了基本的使用方法,`plotly`和`shiny`还提供了更多高级功能和自定义选项,等待你去探索和发现。希望这篇文章能帮助你掌握使用`plotly`和`shiny`制作互动图表的技巧,并在你的数据分析和可视化工作中发挥更大的作用。
    Flutter&鸿蒙next 布局架构原理详解
    Flutter&鸿蒙next 布局架构原理详解
    |
    Web App开发 API 图形学
    QtWebEngine性能问题
    QtWebEngine性能问题
    658 1
    |
    JavaScript
    Selenium--WebDriverWait--你知道显示等待?(结合源码让你更加得心应手)
    Selenium--WebDriverWait--你知道显示等待?(结合源码让你更加得心应手)
    323 0
    |
    存储 关系型数据库 MySQL
    MySQL查询执行计划详解(EXPLAIN)
    一、单表查询 访问方法/访问类型: • const:通过主键值或唯一二级索引与一个常熟进行等值查询(不包括NULL),只会生成一条记录 • ref:普通二级索引与一个常数进行等值比较,可能生成多条记录 • ref_or_null:ref的前提下可以加上or key is null • range:对应的扫描区间为若干个单点扫描区间或范围扫描区间(不包括负无穷到正无穷的范围) • index:扫描区间为全表,但是可以在二级索引中扫描(因为二级索引每条记录占用空间更小,所以需要读的页更少) • all:直接扫描全部的聚集索引记录
    |
    存储 安全 关系型数据库
    技术人必修课:利用金字塔原理高效思考与表达
    作者写这篇文章的目的就是希望能够帮助更多同学了解金字塔原理并合理应用,不只是写作,更是要着眼于思考和表达。本文将围绕认识金字塔结构、表达的逻辑、思考的逻辑、解决问题的框架、演示的逻辑这几个方面带领大家深入学习金字塔原理。
    |
    安全 异构计算
    阿里云新用户与老用户同享云服务器月付与年付优惠价格参考
    在以往的阿里云各个活动中,云服务器的价格往往有两套,分为新用户专享和企业新用户专享,不过现在阿里云的活动策略改变了,现在除了特惠轻量应用云服务器之外,其他系列的云服务器优惠价格都改成了新用户与老用户同享了,而且还增加了月付和多年优惠价格,下面是2023年截至目前,阿里云新用户与老用户同享云服务器优惠价格。
    阿里云新用户与老用户同享云服务器月付与年付优惠价格参考