轉載於:http://blog.csdn.net/wabiaozia/article/details/50803581/
方案一:表單提交
jsp頁面
<form .....method="post"..............> 姓名1:<input type="text" name="id" value=""> 年齡1:<input type="text" name="age" value=""> 地址1:<input type="text" name="address" value=""> 姓名2:<input type="text" name="id" value=""> 年齡2:<input type="text" name="age" value=""> 地址2:<input type="text" name="address" value=""><pre code_snippet_id="1597573" snippet_file_name="blog_20160304_1_2164278" name="code" class="html"> </form>
@controller @RequestMapping("/...........") public String update(Export export, @RequestParam("id")String[] ids, @RequestParam("age")String[] ages, @RequestParam("address")String[] address, Model model){ //ids,ages,addres接收進來的是什么樣的數據呢? //接收的數據類型是ids[111,222,333],ages[222,333,444],address[sss,ddd,yyy] //拓展:若用@RequestParam("id")String ids接收,則傳進來的是一個個String字符串,用逗號分隔。例如ids:“abc,cde,def” //批量增加 for(int i=0,len=ids.length;i<len;i++){ User user=new User(); user.setId(ids[i]); user.setAge(ages[i]); user.setAddress(address[i]); userDao.isnert(user); } } 這種方案適合特別修改刪除,而且相比用js拼接數據有個好處,不用在前端拼接參數。
方案二:數組序列化成Json字符串提交,后台springmvc里用@ RequestBody String 方式接收
var users = JSON.stringify([ {name: "wabiaozai1", pwd: "123"}, {name: "wabiaozai2", pwd: "123"} ]); $.ajax({ type: "post", url: "/wabiaozai", data:users , contentType: "application/json; charset=utf-8", dataType: "json", success: function (response, ifo) { alert("success"); }, error: function () { alert("error"); } })
contentType: "application/json; charset=utf-8",//發送數據到服務器時所使用的內容類型。默認是:"application/x-www-form-urlencoded"。
關於ajax分享兩篇文章:jquery_ajax: 點我:我是外鏈 ajax: 點擊打開鏈接
@RequestMapping(value = "/wabiaozai", method = RequestMethod.POST) public void myDomain(HttpServletRequest request, @RequestBody String myDomain) throws Exception{ ObjectMapper objectMapper = new ObjectMapper(); JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, MyDomain.class); List<MyDomain> list = objectMapper.readValue(myDomain, javaType); System.out.println(""); }
象轉換回一個 HTTP 響應體。對於@RequestBody 注解,RequestMappingHandlerAdapter 提供了以下幾種默認的HttpMessageConverter 支持:
ByteArrayHttpMessageConverter 用以轉換字節數組 StringHttpMessageConverter 用以轉換字符串 FormHttpMessageConverter 用以將表格數據轉換成MultiValueMap<String, String>或從 MultiValueMap<String,String>中轉換出表格數據 SourceHttpMessageConverter 用於javax.xml.transform.Source 類的互相轉換....
四:思考
這個是在前端拼接組合的users,
var users = JSON.stringify([
{name: "wabiaozai1", pwd: "123"},
{name: "wabiaozai2", pwd: "123"}
]);
有沒有辦法不要拼?我要告訴你
http://blog.csdn.net/lutinghuan/article/details/46820023 里面的第4種方法:將表單對象序列化成Json字符串提交,以List接收 ,把對象轉換成json數組,我已經測試過,也成功轉換,但究竟有bug嗎暫時未知。
五:spring3.2 直接支持泛型集合
##注:spring 3.2 直接支持泛型集合,如List<Sample> Map<String, Sample>等集合泛型
具體步驟
1 要配置驅動注解<mvc:annotation-driven/> ,里面注冊了會把json綁定到list的"Bean實例"(注冊的實例會因為spring版本的不同而不同,具體注冊里哪些實例詳見官網)
2 前台傳json數組,后台直接@RequestBody List<Color> list接收就可以了。
親測可行。
也可以參見:http://jinnianshilongnian.iteye.com/blog/1835431 評論里demo
總結一下自己使用jackson處理對象與JSON之間相互轉換的心得。
jackson是一個用Java編寫的,用來處理JSON格式數據的類庫,它速度非常快,目前來看使用很廣泛,逐漸替代了Gson和json-lib。
如果直接引入jar包,可以訪問這個地址下載http://jackson.codehaus.org/1.9.11/jackson-all-1.9.11.jar
如果使用maven構建項目,加入下面的依賴
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.11</version>
</ dependency > 無代碼無真相,為了最簡單的說明,我直接上代碼。
public class User {
private String name;
private Gender gender;
private List<Account> accounts;
省略get和set方法
...
}
public enum Gender {
MALE,
FEMALE
}
public class Account {
private Integer id;
private String cardId;
private BigDecimal balance;
private Date date;
省略get和set方法
...
}
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("菠蘿大象");
user.setGender(Gender.MALE);
List<Account> accounts = new ArrayList<Account>();
Account account = new Account();
account.setId(1);
account.setBalance(BigDecimal.valueOf(1900.2));
account.setCardId("423335533434");
account.setDate(new Date());
accounts.add(account);
account = new Account();
account.setId(2);
account.setBalance(BigDecimal.valueOf(5000));
account.setCardId("625444548433");
account.setDate(new Date());
accounts.add(account);
user.setAccounts(accounts);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, Boolean.TRUE);
String json = mapper.writeValueAsString(user);
System.out.println("Java2Json: "+json);
user = mapper.readValue(json, User.class);
System.out.println("Json2Java: "+mapper.writeValueAsString(user));
} mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, Boolean.TRUE);這是輔助設置,控制格式化輸出。
之前使用的mapper.getSerializationConfig().setXxx方法現在很多都已經被標注為@Deprecated了,因此請大家使用上面的方式處理。
SerializationConfig.Feature枚舉里面還有很多其它的設置項,比如日期,比如要不要輸出null值等等。其它的還有:
org.codehaus.jackson.JsonGenerator.Feature.*
org.codehaus.jackson.JsonParser.Feature.*
讓我們來看看輸出結果,兩次轉換之后,打印出來的字符串應該是一樣的:
OK,果然結果是一致的,大家現在應該會使用jackson進行Java與Json的互相轉換了吧?恩,現在再考慮一種情況,如果想將List<User>的JSON字符串反轉為泛型,應該怎么做呢?
想這樣:mapper.readValue(json, List<User>.class)?這可是錯誤的,這里的參數是Class<T> valueType,valueType是Class<T>類的對象。如上面所示User.class 就是Class<User>類的對象。因此要想獲得泛型的集合類型需要通過其它辦法:
* 獲取泛型的 Collection Type
* @param jsonStr json 字符串
* @param collectionClass 泛型的 Collection
* @param elementClasses 元素類型
*/
public static <T> T readJson(String jsonStr, Class<?> collectionClass, Class<?>... elementClasses) throws Exception {
ObjectMapper mapper = new ObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
return mapper.readValue(jsonStr, javaType);
} 定義一個List<User>,向里面添加兩次user,先調用writeValueAsString方法打印出json,再調用readJson方法,這不僅可以轉換泛型List<T>,還可以用於其它集合,比如Map<K,V>等等。
List<User> list = readJson(json, List.class, User.class);
ObjectMapper可以讓對象與JSON之間相互轉換,除此之外Jackson還提供了JsonGenerator 和JsonParser 這兩個類,它們可以更細粒度的處理序列化與反序列化。調用ObjectMapper的writeValueAsString和readValue方法,最終還是會交給JsonGenerator 和JsonParser 去處理,對此還有疑惑的話,可以去看看這兩個方法的源碼。