JavaWeb-【常用工具类】小结
2018-01-26 07:23
295 查看
话说:
各位读者朋友,中午好,今天小结下在Web项目开发过程中常用的工具类,很多东西我们感到麻烦的时候,就封装成工具类。
目录:
1.分页工具类
2.JDBC工具类
3.时间类工具类
4.字符串转Int工具类
5.UUID工具类
1.分页工具类
应用场景:很多地方都要分页,每次都写一遍分页5要素,很不方便。为了调高复用率,就封装起来。这种方式比较简化,但还不是最简化的,我见过一种最简化的,直接在.xml中配置一下即可。这个我不会。这个在上一篇博客中总结过。
一定要注意各个参数赋值的位置,否则没有效果!这绝对是考验对get() set()方法理解深刻与否的最好方式!
2.JDBC工具类
这里需要注意一下,因为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()即可。
我们处理时间一般有这样几种情形:
1.格式化时间
2.获取时间戳
GetFormatTimeUtil——这个工具类可以把时间转换为2018-01-26 09:43:25 12进制或者24进制
4.字符串转Int工具类
这个JDBC初学者经常会用到
5.UUID工具类
为了避免图片、文件名重复,可以使用UUID或者上面使用的时间工具类-时间戳
好了!小结到此,日后如有其它工具类,直接在这个基础上完善即可。上海今年好大雪!瑞雪兆丰年!今天我还沐浴更衣啦。2018!
各位读者朋友,中午好,今天小结下在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;//如果好玩点,可以加个跳 105fe 转 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!
相关文章推荐
- 一些javaweb开发常用工具类
- javaweb开发中常用的时间工具类
- JavaWeb 常用工具类问题
- [Java工具类]Spring常用工具类 1.文件资源操作和Web相关工具类
- Linux Java Web开发菜鸟级常用命令
- Java Web基础:第十四讲 客户端验证的常用方法
- Java Web 系统 小结
- Java Web系统常用的第三方接口
- Java工具类:读配置文件,jdbc,数据源,hsqldb随web启动的Listener
- 基于web开发的java常用工具
- javaWeb开发的常用jar包
- Ubuntu10和VirtualBox4实用总结-常用Java Web应用软件 (LNMJ,LAMJ)安装
- Java Web系统常用的第三方接口
- Java Web系统常用的第三方接口
- 常用的java工具类
- [JAVA][StringUtils]字符串工具类的常用方法
- Java数组操作的常用工具类
- [JAVA][StringUtils]字符串工具类的常用方法
- Java中Date类和Calendar类的常用实例小结
- NO.63 [file]IO常用工具类IOUtils(Java读文件、写文件、打Zip包)