項目總結
一、工具類篇
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.郵件發(fā)送MailUtil
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* 發(fā)郵件工具類
*/
public final class MailUtils {
private static final String USER = "shangjin_qingnian@163.com"; // 發(fā)件人稱號,同郵箱地址
private static final String PASSWORD = "itcast123"; // 如果是qq郵箱可以使戶端授權碼,或者登錄密碼
/**
*
* @param to 收件人郵箱
* @param text 郵件正文
* @param title 標題
*/
/* 發(fā)送驗證信息的郵件 */
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");
// 發(fā)件人的賬號
props.put("mail.user", USER);
//發(fā)件人的密碼
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);
}
};
// 使用環(huán)境屬性和授權信息,創(chuàng)建郵件會話
Session mailSession = Session.getInstance(props, authenticator);
// 創(chuàng)建郵件消息
MimeMessage message = new MimeMessage(mailSession);
// 設置發(fā)件人
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");
// 發(fā)送郵件
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("發(fā)送成功");
}
}
二、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);
}
}
);