JavaWeb-【常用工具类】小结

话说:

各位读者朋友,中午好,今天小结下在Web项目开发过程中常用的工具类,很多东西我们感到麻烦的时候,就封装成工具类。

目录:


1.分页工具类
2.JDBC工具类
3.时间类工具类
4.字符串转Int工具类
5.UUID工具类


1.分页工具类

应用场景:很多地方都要分页,每次都写一遍分页5要素,很不方便。为了调高复用率,就封装起来。这种方式比较简化,但还不是最简化的,我见过一种最简化的,直接在.xml中配置一下即可。这个我不会。这个在上一篇博客中总结过。

package com.hmc.util;

import java.util.List;

/**
*
*2018年1月20日
*User:Meice
*下午4:08:25
*/
public class Pager {
    /**
     * 分页5要素 1条件
     * 1.pageIndex 当前页-页面传过来
     * 2.pageSize 每页显示数量 - 固定
     * 3.offset  偏移量 -根据pageSize 和pageIndex计算  offset = (pageIndex-1)*pageSize 也就是limit ?,? 第一个问号
     * 4.count  总数量-后台写方法查
     * 5.totalPage 总页数   根据count pageSize得出 totalPage = (int)Math.ceil((double)count/pageSize)
     * 6.list 存放集合数据
     */

    //结论:调用此实体类给3个参数即可 pageIndex pageSize count 


    private int pageIndex;
    private int pageSize;
    private int offset;
    private int count;
    private int totalPage;
    private List<?> list;//存放数据

    private int begin;//处理每一页 
    private int end;


    private int skipTo;//如果好玩点,可以加个跳转 

    public Pager() {}



    public Pager(int pageIndex, int pageSize, int offset, int count, int totalPage, List<?> list, int begin, int end,
            int skipTo) {
        super();
        this.pageIndex = pageIndex;
        this.pageSize = pageSize;
        this.offset = offset;
        this.count = count;
        this.totalPage = totalPage;
        this.list = list;
        this.begin = begin;
        this.end = end;
        this.skipTo = skipTo;
    }

    public int getPageIndex() {

        return pageIndex;
    }
    public void setPageIndex(int pageIndex) {
        //控制住首页
        if(pageIndex<=0) {
            pageIndex =1;
        }
        if(totalPage>=5) {
            if(pageIndex<=5 && totalPage>=pageSize) {
                begin = 1;
                end = pageSize;
            }else if(pageIndex<=(totalPage-pageSize) && totalPage>=pageSize) {
                begin = pageIndex - (int)Math.round(pageSize/2);
                end = pageIndex + (pageSize-((int)Math.round(pageSize/2.0)));
            }else {
                begin = totalPage-(pageSize-1);
                end = totalPage;
            }

        }else {
            begin = pageIndex;
            end = totalPage;
        }

        this.pageIndex = pageIndex;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getOffset() {
        //使用此实体类的用户,不用为这个赋值
        offset = (pageIndex -1)*pageSize;
        return offset;
    }
    public void setOffset(int offset) {

        this.offset = offset;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        totalPage = (int)Math.ceil((double)count/pageSize);
        this.count = count;
    }
    public int getTotalPage() {
        //这个写在get()方法里面,因为用户不用赋值,但是有不能直接写死,否则变为了常量,没发改变 不要写这里,因为还得认为调用 
    //totalPage = (int)Math.ceil((double)count/pageSize);
        return totalPage;
    }
    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }



    public List<?> getList() {
        return list;
    }


    public void setList(List<?> list) {
        this.list = list;
    }


    public int getBegin() {
        //这里赋值没用,因为方法没发调用!我们当前页赋值是通过setPageIndex()赋值的,框架底层也是这样 所以应该写在setPageIndex()
        /*if(pageIndex<=pageSize) {
            begin = 1;

        }else if(pageIndex <totalPage -pageSize) {
            begin = pageIndex - (int)Math.round(pageSize/2.0);
        }*/
        return begin;
    }


    public void setBegin(int begin) {
        this.begin = begin;
    }




    public int getEnd() {

        /*if(pageIndex<=pageSize) {
            end = pageSize;

        }else if(pageIndex <totalPage -pageSize) {
            end = pageIndex + (pageSize-((int)Math.round(pageSize/2.0)));
        }*/
        return end;
    }




    public void setEnd(int end) {
        this.end = end;
    }





    public int getSkipTo() {
        return skipTo;
    }





    public void setSkipTo(int skipTo) {
        this.skipTo = skipTo;
    }




    @Override
    public String toString() {
        return "Pager [pageIndex=" + pageIndex + ", pageSize=" + pageSize + ", offset=" + offset + ", count=" + count
                + ", totalPage=" + totalPage + ", list=" + list + ", begin=" + begin + ", end=" + end + ", skipTo="
                + skipTo + "]";
    }




}

一定要注意各个参数赋值的位置,否则没有效果!这绝对是考验对get() set()方法理解深刻与否的最好方式!

2.JDBC工具类

DBUtil——这个获取数据库连接、关闭资源

package com.hmc.util;
/**
*
*2017年12月30日
*User:Meice
*下午8:35:12
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {
    //封装连接数据库的方法


    //处理异常:java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
    static  int retryCount = 5;  
   static  boolean transactionCompleted = false;  


    //1.加载驱动
    static {
        try {
            Class.forName(GetPropertyUtil.getVal("driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    //2.获取连接
    public static Connection getConn() {

        do {

            //分开放 尽量不要合并写在一块
            String url = GetPropertyUtil.getVal("url");
            String user = GetPropertyUtil.getVal("user");
            String password = GetPropertyUtil.getVal("password");



            try {
                Connection conn =   DriverManager.getConnection(url, user, password);
                return conn;
            } catch (SQLException e) {
                e.printStackTrace();
                String sqlState = e.getSQLState();
                if("08S01".equals(sqlState) || "40001".equals(sqlState)) {
                    retryCount--;
                }else {
                    retryCount = 0;
                }
            }

            return null;

        }while(!transactionCompleted && retryCount>0);

    }


    //3.关闭资源
    public static void closeConn(Connection conn,PreparedStatement ps,ResultSet rs) {
        //Alt + Shift + Z 抛出语句块异常
        try {
            if(rs != null) rs.close();
            if(ps != null) ps.close();
            if(conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }


    }


}

GetPropertyUtil——获取静态配置

package com.hmc.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
*
*2017年12月30日
*User:Meice
*下午8:49:31
*/
public class GetPropertyUtil {

    //获取静态资源
    public static String getVal(String key) {

        Properties pro = new Properties();
        InputStream is;
        try {
            is = new FileInputStream("D:\\WorkSpace\\eclipse\\xiaomeibbs\\db.properties");
            pro.load(is);
            return pro.getProperty(key);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;

    }

}


GetPreparedStatementUtil——获取PrepatedStatement对象 针对多个参数


package com.hmc.util;
/**
*
*2017年12月30日
*User:Meice
*下午9:04:45
*/

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class GetPreparedStatementUtil {

    //定义获取PrepatedStatement对象
    public static PreparedStatement getPs(Connection conn,PreparedStatement ps,String sql,Object... params) {
        try {
             ps =       conn.prepareStatement(sql);
            //这样有无参数都可以搞定
            if(params!= null) {
                for(int i=0;i<params.length;i++) {
                    ps.setObject((i+1),params[i]);
                }
            }


            return ps;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

}

这里需要注意一下,因为ps对象最好也从外部获取,而不要在工具类里面写死,否则如果在同一个方法中重复调用,容易出现对象替换。

1.bug1:
java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
SQL语句有3个参数,但是遍历的时候,只有2个。
问题导致原因:同一个Servlet调用2次底层方法,同时在GetPrepatedStatementUtil只是同一个PrepatedStatement对象,很可能重复使用。

3.时间类工具类

应用场景:数据库存值,如果是时间,那么一般这么处理
1.数据库存为varchar() 类型;赋值的时候直接格式化日期后然后存入;
2.数据库存为datetime 或者timestamp 然后前端取值时候通过jstl的fmt标签处理
不需要赋值,写SQL的时候,直接now()即可。

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<td><fmt:formatDate value="${menu.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/>

我们处理时间一般有这样几种情形:
1.格式化时间
2.获取时间戳
GetFormatTimeUtil——这个工具类可以把时间转换为2018-01-26 09:43:25 12进制或者24进制

package com.hmc.util;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
*
*2017年12月30日
*User:Meice
*下午9:44:05
*/
public class GetFormatTimeUtil {

    public static String getFormatTime(int TwelveOrTwentyFour) {

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        if(TwelveOrTwentyFour == 12) {
                return sdf2.format(date);
        }else if(TwelveOrTwentyFour == 24){

            return sdf.format(date);
        }else {
            return null;
        }

    }


    public static void main(String[] args) {
        System.out.println(getFormatTime(24));
        System.out.println(getFormatTime(12));
        /**
         * 运行结果:
         * 2018-01-26 09:43:25
            2018-01-26 09:43:25

         */





//3种方法获取时间戳(自1970年1月1日以来的时间的毫秒数) 48*365*24*60*60*1000 
        System.out.println(System.currentTimeMillis());//推荐这种,方便!
        System.out.println(new Date().getTime());
        System.out.println(Calendar.getInstance().getTimeInMillis());
        /**
         * 运行结果:
         * 1516887232623
            1516887232625
            1516887657528
         */


        //我们可以模仿QQ截图,生成这种方式命名的图片:             QQ截图20180125214517.png
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        System.out.println("小美截图"+sdf.format(new Date()));

        /**
         * 小美截图20180125215052
         * QQ截图20180125214926.png
         */
    }


}

4.字符串转Int工具类

这个JDBC初学者经常会用到

package com.hmc.util;
/**
*
*2018年1月1日
*User:Meice
*上午11:46:00
*/
public class GetStrToInt {

        public static int getInt(String str) {
            if(str!= null && !str.equals("")) {
                return Integer.parseInt(str);
            }
            return 0;

        }
}

5.UUID工具类

为了避免图片、文件名重复,可以使用UUID或者上面使用的时间工具类-时间戳

UUIDUtil——用java.util.UUID生成唯一标识符

package com.hmc.util;
import java.util.UUID;
/**
*
*2018年1月25日
*User:Meice
*下午9:05:40
*/



public class UUIDUtil {
    public   static String getStrUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    public static void main(String[] args) {
        System.out.println(UUID.randomUUID().toString());
        System.out.println(getStrUUID());
        /**
         * 测试结果:
         * 0cdcf40d-a7a4-4008-b666-1dc432b9f456
            7d819ab715674b50a57ef11258f22ede
            前后之所以不一样,是因为不同的随机产生滴
         */
    }


}

好了!小结到此,日后如有其它工具类,直接在这个基础上完善即可。上海今年好大雪!瑞雪兆丰年!今天我还沐浴更衣啦。2018!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值