自己以前編寫整理的工具類,不需要導包,主要部分僅使用JAVA系統自帶類庫即可完成。
爲了使用方便,直接處理 HttpServletRequest 對象,支持解析前端傳回JSON中帶的Map對象、List<Map>對象及鍵值對。
(測試時勿用String轉JSON的JSON,表達的Map及List<Map>會被解析成String)
具體代碼如下:
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.Map.Entry;
/**
* @author bluecoolcool
* @date 2018/06/28 16:12
*/
public class RequestUtils {
/**
* 返回map
* @param request
* @return
*/
public static Map<String,Object> getMap(HttpServletRequest request){
Map<String,Object> mapPrarm = new HashMap<String, Object>();
Map map = request.getParameterMap();
Set ketSet = map.entrySet();
String listName = "";
boolean isList = false;
List paramList = new ArrayList();
Map paramMap = new HashMap();
for (Iterator it = ketSet.iterator();it.hasNext();) {
Entry me = (Entry) it.next();
Object key = me.getKey();
Object value = me.getValue();
String[] valueArr = new String[1];
if(value instanceof String[]){
valueArr = (String[]) value;
}else{
valueArr[0] = value.toString();
}
if(key.toString().contains("[") && key.toString().contains("]")){
String newName = key.toString().substring(0,key.toString().indexOf("]")+1);
String[] finalValueArr = valueArr;
String newValue = Arrays.toString(finalValueArr).substring(1, Arrays.toString(finalValueArr).length()-1);
String keyName = key.toString().substring(key.toString().lastIndexOf("[")+1,key.toString().lastIndexOf("]"));
isList = letterOrNum(key.toString().substring(key.toString().indexOf("[")+1,key.toString().indexOf("]")));
if(listName.equals("")){
listName = newName;
paramMap.put( keyName , newValue);
}else if(listName.equals(newName)){
paramMap.put( keyName , newValue);
}else if(listName.substring(0,listName.indexOf("[")).equals(newName.substring(0,newName.indexOf("[")))){
if(isList){
paramList.add(paramMap);
listName = newName;
paramMap = new HashMap();
paramMap.put( keyName , newValue);
}else{
paramMap.put( keyName , newValue);
}
}else{
if(letterOrNum(listName.substring(listName.indexOf("[")+1,listName.indexOf("]")))){
paramList.add(paramMap);
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramList);
}else{
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramMap);
}
listName = newName;
paramList = new ArrayList<>();
paramMap = new HashMap();
paramMap.put( keyName , newValue);
}
}else{
if(listName.equals("")){
for(int k = 0;k<valueArr.length;k++){
mapPrarm.put(key.toString(), valueArr[k]);
}
}else{
if(letterOrNum(listName.substring(listName.indexOf("[")+1,listName.indexOf("]")))) {
paramList.add(paramMap);
mapPrarm.put(listName.substring(0, listName.indexOf("[")), paramList);
}else{
mapPrarm.put(listName.substring(0, listName.indexOf("[")), paramMap);
}
for (int k = 0; k < valueArr.length; k++) {
mapPrarm.put(key.toString(), valueArr[k]);
}
listName = "";
paramList = new ArrayList<>();
paramMap = new HashMap();
}
}
}
if(!(listName.equals(""))){
if(letterOrNum(listName.substring(listName.indexOf("[")+1,listName.indexOf("]")))) {
paramList.add(paramMap);
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramList);
}else{
mapPrarm.put(listName.substring(0, listName.indexOf("[")), paramMap);
}
}else if(!(paramMap.size()==0)){
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramMap);
}
return mapPrarm;
}
/**
* 判斷字符串中是否包含字符串和字母的情況
* 都爲數字返回true
* 包含數字和字符或都是字符返回false
* 來自網絡
* @param str
* @return
*/
public static boolean letterOrNum(String str){
boolean isDigit = false;//定義一個boolean值,用來表示是否包含數字
boolean isLetter = false;//定義一個boolean值,用來表示是否包含字母
for(int i=0 ; i<str.length() ; i++){ //循環遍歷字符串
if(Character.isDigit(str.charAt(i))){ //用char包裝類中的判斷數字的方法判斷每一個字符
isDigit = true;
}
if(Character.isLetter(str.charAt(i))){ //用char包裝類中的判斷字母的方法判斷每一個字符
isLetter = true;
}
}
if(isDigit && (!isLetter)){
return true;
}else{
return false;
}
}
}
測試下,前端頁面寫個簡單的請求,對象中包含三種結構的數據,如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button onclick="test()" >測試</button>
</body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
let data = {
"name": "張某某",
"age": "15",
"address": {
"city": "黑龍江",
"country": "中國"
},
"another": [
{
"name": "操作手冊",
"property": "中文"
},
{
"name": "簡介文檔",
"property": "概括"
}
]
}
function test(){
$.post("http://localhost:8088/test/jsm",data,function(result){
alert("success")
});
}
</script>
</html>
後臺測試打印:
@Override
public Object jsm(HttpServletRequest request) {
//獲得的Map
Map<String, Object> map = RequestUtils.getMap(request);
System.out.println("Map: "+ map);
//獲得Map中的成員Map
Map address = (Map) map.get("address");
System.out.println("成員Map: "+ address);
//獲得Map中的成員List<Map>
List another = (List) map.get("another");
System.out.println("成員List<Map>: "+ another);
return "";
}
控制檯輸出結果:
Map: {address={country=中國, city=黑龍江}, another=[{name=操作手冊, property=中文}, {name=簡介文檔, property=概括}], name=張某某, age=15}
成員Map: {country=中國, city=黑龍江}
成員List<Map>: [{name=操作手冊, property=中文}, {name=簡介文檔, property=概括}]
綜上所屬,可以拿來就用。
但功能還未完善,以後有需求在修改。