您的位置:首页 > 编程语言 > Java开发

JavaWeb-【常用工具类】小结

2018-01-26 07:23 295 查看
话说:

各位读者朋友,中午好,今天小结下在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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: