Ajax+json 前後臺互動,以及通用查詢方法的優化
阿新 • • 發佈:2018-12-11
1、 前臺的 jQuery的ajax請求 (用法及其簡單):
$(function(){ $.ajax({ url: "userAction.action", //請求的url data: { name : "name", pwd : "pwd", //傳給後臺的引數 t : new Date(); } success: function(data){ //回撥函式,data為後臺返回給前臺的資料 }, dataType: "json" // 此屬性為聲明後臺返回的資料型別,可填text、json、xml、html、script、jsonp。 }); });
2、後臺json的使用:
我們學習所使用的 json jar 包為 jackson
其主要是ObjectMapper物件,writeValueAsString()方法可將Java物件轉換為json物件,程式碼如下:
ObjectMapper mapper = new ObjectMapper();
String jsonReturn=mapper.writeValueAsString(map);
json的格式包括:
①JavaBean/Map {"sid":"s001", "sname": "張三"} (注:與Map集合類似,有著鍵相同值會覆蓋的特vv點)
②陣列/List/Set [1,2,3]
③類裡嵌類 混合模式 {"sid":"s001", "sname": "張三","shoppy", [1,2,3] }
3、後臺controller層的資料處理優化
1、BaseDao類不變:
package com.zking.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; /** * 查詢資料庫的通用查詢類 * @author lenovo * * @param <T> */ public class BaseDao<T> { /** * 使用策略模式對ResultSet 返回的結果集進行優化 * @author lenovo * * @param <T> */ protected interface CallBack<T> { public List<T> forEach(ResultSet rs) throws SQLException; } /** * 通用查詢的方法 * @param sql 要執行的sql語句 * @param pb 分頁的實體類 * @param call 對結果集進行操作 * @return */ protected List<T> executeQuery(String sql, PageBean pb, CallBack<T> call) { Connection con = Dbhelper.getConnection(); PreparedStatement ps = null; ResultSet rs = null; try { if (pb != null) { sql += " limit " + (pb.getPage() - 1) * pb.getRows() + "," + pb.getRows(); } ps = con.prepareStatement(sql); rs = ps.executeQuery(); return call.forEach(rs); } catch (SQLException e) { e.printStackTrace(); } finally { Dbhelper.close(con, ps, rs); } return null; } }
2、EntityBaseDao中將原本的泛型T該成了Map集合(省去了實體類),由於rs.getMetaData() 可以得到該表資料的資料原型,即可得到表的列名與該列對應的值,所以這是可以實現的。
package com.zking.util;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EntityBaseDao extends BaseDao<Map<String, Object>> {
public List<Map<String, Object>> executeQuery(String sql, PageBean pb) {
return super.executeQuery(sql, pb, new CallBack<Map<String, Object>>() {
@Override
public List<Map<String, Object>> forEach(ResultSet rs) throws SQLException {
/**
* 1、建立一個實體類的例項
* 2、給建立的例項屬性賦值
* 3、將新增完內容的實體類新增到list集合中 (這裡是使用json以及map集合接收資料)
*/
List<Map<String, Object>> list = new ArrayList<>();
/**
* 得到資料庫的表的資料原型
* (其中包括表中的列名以及該列名所對應的值)
*/
ResultSetMetaData metaData = rs.getMetaData(); //metaData包含了rs中的行和列
int count = metaData.getColumnCount();
Map<String, Object> map = null;
while (rs.next()) {
map = new HashMap<String, Object>();
for (int i = 1; i <= count; i++) {
map.put(metaData.getColumnName(i), rs.getObject(i));
}
list.add(map);
}
return list;
}
});
}
}
隨著通用查詢方法的改變,dao層也同樣發生了改變,其中需要注意的有:
①由於Map集合取代了實體類,所以查詢方法的引數也變成了Map<String, String[]>( request.getParameterMap() 返回的型別為Map<String, String[]> )
package com.zking.dao;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zking.util.EntityBaseDao;
import com.zking.util.JsonResultSetUtils;
import com.zking.util.PageBean;
public class AddressDao {
private EntityBaseDao baseDao = new EntityBaseDao();
/**
* 地址三級聯動的查詢方法
* @param map
* @param pb
* @return
* @throws JsonProcessingException
*/
public List<Map<String, Object>> queryAddress(Map<String, String[]> map, PageBean pb)
throws JsonProcessingException {
String parent_id = JsonResultSetUtils.getJsonVal(map, "PARENT_ID");
String region_parent_id = JsonResultSetUtils.getJsonVal(map, "REGION_PARENT_ID");
String sql = "select * from ch_region where true";
if (parent_id != null && !"".equals(parent_id)) {
sql += " and parent_id=" + parent_id;
} else if (region_parent_id != null && !"".equals(region_parent_id)) {
sql += " and region_parent_id="+region_parent_id;
}
return baseDao.executeQuery(sql, pb);
}
}
②對於從Map集合內取值進行了優化,將其提取了出來,寫成了一個類方法。
package com.zking.util;
import java.util.Arrays;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
public class JsonResultSetUtils {
/**
* 根據鍵key得到map內對應的值
* @param map
* @param key 你想得到誰的值
* @return
* @throws JsonProcessingException
*/
public static String getJsonVal(Map<String, String[]> map, String key) throws JsonProcessingException {
if(map!=null && map.size()>0) {
String[] strings = map.get(key);
if (strings != null && strings.length > 0) {
String string = Arrays.toString(strings);
// Arrays.toString()方法 將陣列轉換成字串( [s001] )左右會多出一組中括號
return string.substring(1, string.length()-1);
}
}
return "";
}
}