SpringMVC前后台數據傳遞中Json格式的相互轉換(前台顯示格式、Json-lib日期處理)及Spring中的WebDataBinder淺析


兩個方向:

一、前台至后台:

  Spring可以自動封裝Bean,也就是說可以前台通過SpringMVC傳遞過來的屬性值會自動對應到對象中的屬性並封裝成javaBean,但是只能是基本數據類型(int,String等)。如果傳遞過來的是特殊對象,則需要手動進行封裝。

  Spring提供了@initBinder(初始化綁定封裝)注解和WebDataBinder工具。用戶只需要向WebDataBinder注冊自己需要的類型的屬性編輯器即可。

/*
前台傳遞過來的String類型時間,通過下面的初始化綁定,轉換成Date類型
*/ @initBinder public void initBinder(WebDataBinder binder){ SimpleDateFormate sdf=new SimpleDateFormate("yyyy-MM-dd HH:mm"); binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));//true表示允許空值,false不允許
}

  更多詳細內容轉載鏈接

  1,http://blog.csdn.net/hongxingxiaonan/article/details/50282001(前台傳遞過來非Date類型,及WebDataBinder的其它方法)

  2,http://www.cnblogs.com/AloneSword/p/3998943.html(前台傳遞過來兩個不同名和不同格式的Date類型)

二、后台到前台:

  1,可以直接在后台將值存入session或request或page中,后台就可以直接通過EL表達式¥{key.value}取值

  2,主要記錄后台將List<javaBean>值存入json中,前台如何取值及轉換。

  我寫的項目前台運用的是easyui-datagrid顯示值

  (1),前台封裝的值不包含特殊類型,如java.util.Date

  easyui前台顯示數據可以使用JSONObject,也可以使用JSONArray。但是如果需要在datagrid表格中進行數據顯示,只能使用JSONObject,這是easyui的規范。

  一般后台會將查詢出的List使用JSONArray.fromObject()方法將List轉換成JSONArray,但如果是在datagrid的表格中顯示,則需要將JSONArray  put到JSONobject中;如果不用在datagrid表格中顯示,那么JSONObject和JSONArray都可以傳遞給前台值。

  如combobox,后台只需要將List放入JSONArray中即可傳向前台。

  先給個工具類,用於前台顯示:

  
1 public class ResponseUtil {
2     public static void write(HttpServletResponse response, Object o) throws Exception {
3         response.setContentType("text/html;charset=utf-8");
4         PrintWriter writer = response.getWriter();
5         writer.println(o.toString());
6         writer.flush();
7         writer.close();
8     }
9 }
ResponseUtil.java

  Controller層方法,PageBean也是自己創建的實體類,是用來給sql語句的limit提供數據而已:

  
 1 public class PageBean {
 2     private int page;// 頁數
 3     private int rows;// 每頁行數
 4     private int start;// 起始頁
 5 
 6     public PageBean(int page, int rows) {
 7         super();
 8         this.page = page;
 9         this.rows = rows;
10     }
11 
12     public int getPage() {
13         return page;
14     }
15 
16     public void setPage(int page) {
17         this.page = page;
18     }
19 
20     public int getRows() {
21         return rows;
22     }
23 
24     public void setRows(int rows) {
25         this.rows = rows;
26     }
27 
28     public int getStart() {
29         start = (page - 1) * rows;
30         return start;
31     }
32 
33 }
PageBean.java
@RequestMapping("/getProductList") public void getProductList(@RequestParam(value = "page", required = false) String page,@RequestParam(value = "rows") String rows, HttpServletResponse response, Product product) throws Exception {   PageBean pageBean = new PageBean(Integer.parseInt(page), Integer.parseInt(rows));   Map<String, Object> map = new HashMap<>();   map.put("start", pageBean.getStart());   map.put("size", pageBean.getRows());   map.put("productName", product.getProductName());   List<Product> productList = productService.getProductList(map);   int total = productService.getTotal(map);   JSONObject jsonObject = new JSONObject();   JSONArray jsonArray = JSONArray.fromObject(productList);//將查詢出的List先轉換成JSONArray   jsonObject.put("rows", jsonArray);   jsonObject.put("total", total);   ResponseUtil.write(response, jsonObject); }

  (2),前台封裝的值包含如java.util.Date的特殊類型

  用Json-lib日期處理:將后台的傳遞的時間類型轉換成前台可以顯示的Json格式,用類JsonConfig和接口JsonValueProcessor處理,用法也很簡單:

  源碼JsonValueProcessor接口中只包含兩個方法,我定義一個類JavaDateObjectToJsonUtil繼承該接口,定義新類是為了可以在類中添加我需要的時間格式

  
 1 public class JavaDateObjectToJsonUtil implements JsonValueProcessor {
 2 
 3     private String format = null;
 4 
 5     public JavaDateObjectToJsonUtil(String format) {
 6         super();
 7         this.format = format;
 8     }
 9 
10     @Override
11     public Object processArrayValue(Object value, JsonConfig jsonConfig) {
12         return null;
13     }
14 
15     @Override
16     public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
17         if (value == null) {
18             return "";
19         }
20         if (value instanceof Date) {
21             return new SimpleDateFormat(format).format((Date) value);
22         }
23         return value.toString();
24     }
25 
26 }
JavaDataObjectToJsonUtil.java

  Controller層方法,實體類SaleChance類中包含有屬性java.util.Date createTime;並且有createTime的get/set方法:

@RequestMapping("/getSaleChanceList") public void getSaleChanceList(@RequestParam(value = "page", required = false) String page,@RequestParam(value = "rows") String rows, HttpServletResponse response, SaleChance saleChance)throws Exception {   PageBean pageBean = new PageBean(Integer.parseInt(page), Integer.parseInt(rows));   Map<String, Object> map = new HashMap<>();   map.put("start", pageBean.getStart());   map.put("size", pageBean.getRows());   map.put("createMan", saleChance.getCreateMan());   List<SaleChance> saleChanceList = saleChanceService.getSaleChanceList(map);   int total = saleChanceService.getTotal(map);   JSONObject jsonObject = new JSONObject();   JsonConfig jsonConfig = new JsonConfig();   jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JavaDateObjectToJsonUtil("yyyy:MM:dd hh:mm"));//只需將時間類型和新類通過JsonConfig注冊即可   JSONArray jsonArray = JSONArray.fromObject(saleChanceList, jsonConfig);//轉換成JSONArray時多帶上剛注冊的JsonConfig   jsonObject.put("rows", jsonArray);   jsonObject.put("total", total);   ResponseUtil.write(response, jsonObject);
}

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM