项目总结
一、工具类篇
1. 根据计算机Mac地址获取全球唯一标识码UuidUtil
import java.util.UUID;
/**
* 产生UUID随机字符串工具类
*/
public final class UuidUtil {
private UuidUtil(){}
public static String getUuid(){
return UUID.randomUUID().toString().replace("-","");
}
/**
* 测试
*/
public static void main(String[] args) {
System.out.println(UuidUtil.getUuid());
System.out.println(UuidUtil.getUuid());
System.out.println(UuidUtil.getUuid());
System.out.println(UuidUtil.getUuid());
}
}
2. 密码的MD5加密Md5Util
import java.security.MessageDigest;
/**
* 写一个MD5算法,运行结果与MySQL的md5()函数相同
* 将明文密码转成MD5密码
* 123456->e10adc3949ba59abbe56e057f20f883e
*/
public final class Md5Util {
private Md5Util(){}
/**
* 将明文密码转成MD5密码
*/
public static String encodeByMd5(String password) throws Exception{
//Java中MessageDigest类封装了MD5和SHA算法,今天我们只要MD5算法
MessageDigest md5 = MessageDigest.getInstance("MD5");
//调用MD5算法,即返回16个byte类型的值
byte[] byteArray = md5.digest(password.getBytes());
//注意:MessageDigest只能将String转成byte[],接下来的事情,由我们程序员来完成
return byteArrayToHexString(byteArray);
}
/**
* 将byte[]转在16进制字符串
*/
private static String byteArrayToHexString(byte[] byteArray) {
StringBuffer sb = new StringBuffer();
//遍历
for(byte b : byteArray){//16次
//取出每一个byte类型,进行转换
String hex = byteToHexString(b);
//将转换后的值放入StringBuffer中
sb.append(hex);
}
return sb.toString();
}
/**
* 将byte转在16进制字符串
*/
private static String byteToHexString(byte b) {//-31转成e1,10转成0a,。。。
//将byte类型赋给int类型
int n = b;
//如果n是负数
if(n < 0){
//转正数
//-31的16进制数,等价于求225的16进制数
n = 256 + n;
}
//商(14),数组的下标
int d1 = n / 16;
//余(1),数组的下标
int d2 = n % 16;
//通过下标取值
return hex[d1] + hex[d2];
}
private static String[] hex = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
/**
* 测试
*/
public static void main(String[] args) throws Exception{
String password = "123456";
String passwordMD5 = Md5Util.encodeByMd5(password);
System.out.println(password);
System.out.println(passwordMD5);
}
}
3.邮件发送MailUtil
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* 发邮件工具类
*/
public final class MailUtils {
private static final String USER = "shangjin_qingnian@163.com"; // 发件人称号,同邮箱地址
private static final String PASSWORD = "itcast123"; // 如果是qq邮箱可以使户端授权码,或者登录密码
/**
*
* @param to 收件人邮箱
* @param text 邮件正文
* @param title 标题
*/
/* 发送验证信息的邮件 */
public static boolean sendMail(String to, String text, String title){
try {
final Properties props = new Properties();
props.put("mail.smtp.auth", "true");
//props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.host", "smtp.163.com");
// 发件人的账号
props.put("mail.user", USER);
//发件人的密码
props.put("mail.password", PASSWORD);
// 构建授权信息用于进行SMTP进行身份验证,
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
// 设置发件人
String username = props.getProperty("mail.user");
InternetAddress form = new InternetAddress(username);
message.setFrom(form);
// 设置收件人
InternetAddress toAddress = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件标题
message.setSubject(title);
// 设置邮件的内容体
message.setContent(text, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
return true;
}catch (Exception e){
e.printStackTrace();
}
return false;
}
public static void main(String[] args) throws Exception { // 做测试用
MailUtils.sendMail("tanshuai@itcast.cn","你好,这是一封测试邮件,无需回复。","测试邮件");
System.out.println("发送成功");
}
}
二、JQuery操作补充
1. JQuery去除字符串前后空格
$.trim($("选择器").val())
2. 跳转页面
location.href = "url"
3.【重要】,获取地址栏参数
var variable = location.search;
# 可以封装成一个函数
function getParameter(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)","i");
var r = location.search.substr(1).match(reg);
if (r!=null) return (r[2]); return null;
}
4. 分页器核心代码实现
// 3. 渲染生成分页条,最多10条,前五后四当前中!
var currentPage = data.currentPage; // 当前页码
var totalPage = data.totalPage; // 最大页码
// 3.1 记录分页器的起始位置
var begin;
var end;
// 逻辑判断
if(totalPage <= 10) {
begin = 1;
end = totalPage;
} else {
if(currentPage <= 6) {
begin = 1;
end = 10;
} else if(currentPage >= totalPage - 4) {
begin = totalPage - 9;
end = totalPage;
} else {
begin = currentPage - 5;
end = currentPage + 4;
}
}
5. 当前操作需要跳转到登录,登录成功后回到之前操作页码的技巧
在跳转路径后面加上当前路径以及相关参数,登录页实现登录后根据地址栏的参数实现跳转;当然,也可以用这种方式实现参数的传递
- 跳转页核心代码如下案例
location.href = "login.html?nowpage.html?var=" + variable;
- 登录页核心代码
location.href = location.search.substring(1)
/* substring(1)的作用是去掉问号 */
三、编码问题
解决tomcat7等get/post中文编码问题,思路是在Filter中使用代理器增强getParameterMap等对应的方法
6.地址栏获取参数,解决中文乱码踩的坑
假如地址栏没有“varable”这个参数,返回null,但是decodeURIComponent会将其转换为字符串形式的"null";如果后台收到这个字符串的"null",一般情况下就懵逼了!所以得判断!
var varable = decodeURIComponent(getParameter("varable"));
# 此时 varable == "null";应该加入以下判断!
if(varable == "null")
varable = null;
Filter下的doFilter方法中
// 使用代理模式,增强返回值,解决tomcat7带来的中文乱码问题!
HttpServletRequest request = (HttpServletRequest)Proxy.newProxyInstance(
req.getClass().getClassLoader(),
req.getClass().getInterfaces(),
(proxy, method, args) -> {
if("getParameterMap".equals(method.getName())) {
Map<String, String[]> map = (Map<String, String[]>)method.invoke(req, args);
Map<String, String[]> newMap = new HashMap<>();
for (String s : map.keySet()) {
String[] temp = map.get(s);
for (int i = 0; i < temp.length; i++) {
// 解决tomcat7中文乱码问题!
if(temp[i] != null) {
temp[i] = new String(temp[i].getBytes("iso-8859-1"), "utf-8");
}
}
newMap.put(s, temp);
}
map = null;
return newMap;
} else {
return method.invoke(req, args);
}
}
);