SpringMVC(二) 参数绑定 与 JSON
参数绑定
http请求传输的参数都是String类型,但是Hanlder业务方法中的参数都是我们指定的数据类型,如int,Object等,所以需要处理参数的类型转换。此项工作不需要我们开发人员去完成,SpringMVC的HandlerAdapter组件会在执行Handler业务方法之前,完成参数的绑定。
基本数据类型
//以int类型为例 @RequestMapping("/itemEdit") public String itemEdit(Integer id, Model model) { Items items = itemService.getItemById(id); //向jsp传递数据 model.addAttribute("item", items); //设置跳转的jsp页面 return"editItem"; }
数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。
使用@RequestParam常用于处理简单类型的绑定,一般是在前台页面的name属性值和后台的实体类中的属性名不一致的情况下使用。
value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错。
defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
public String editItem(@RequestParam(value="item_id",required=true,defaultValue="1") String id) { }
绑定pojo类型
直接使用类名即可
@RequestMapping("/updateitem") public String updateItem(Items items) { itemService.updateItem(items); return"success"; }
数组
@RequestMapping(value="/arrayType") @ResponseBody public String arrayType(String[] name){ StringBuffer sbf = new StringBuffer(); for(String item:name) { sbf.append(item).append(" "); } return "name:"+sbf.toString(); }
List、Set集合
绑定的参数应该为List或者Set中的参数类型
public class UserList { private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } } @RequestMapping(value="/listType") @ResponseBody public String listType(UserList userList){ StringBuffer sbf = new StringBuffer(); for(User user:userList.getList()){ sbf.append(user); } return "用户:"+sbf.toString(); }
<form action="listType" method="post"> 用户1姓名:<input type="text" name="users[0].name"/><br/> 用户1年龄:<input type="text" name="users[0].age"/><br/> 用户2姓名:<input type="text" name="users[1].name"/><br/> 用户2年龄:<input type="text" name="users[1].age"/><br/> 用户3姓名:<input type="text" name="users[2].name"/><br/> 用户3年龄:<input type="text" name="users[2].age"/><br/> <input type="submit" value="提交"/> </form>
Map
JAVA方法,遍历Map集合的key值,通过key值获取value。JSP页面与List和Set不同的是,不能通过下标区分不同的对象,改为通过key值区分。
<form action="mapType" method="post"> 用户1姓名:<input type="text" name="users['a'].name"/><br/> 用户1年龄:<input type="text" name="users['a'].age"/><br/> 用户2姓名:<input type="text" name="users['b'].name"/><br/> 用户2年龄:<input type="text" name="users['b'].age"/><br/> 用户3姓名:<input type="text" name="users['c'].name"/><br/> 用户3年龄:<input type="text" name="users['c'].age"/><br/> <input type="submit" value="提交"/> </form>
public class UserMap { private Map<String,User> users; public Map<String, User> getUsers() { return users; } public void setUsers(Map<String, User> users) { this.users = users; } } @RequestMapping(value="/mapType") @ResponseBody public String mapType(UserMap userMap){ StringBuffer sbf = new StringBuffer(); for(String key:userMap.getUsers().keySet()){ User user = userMap.getUsers().get(key); sbf.append(user); } return "用户:"+sbf.toString(); }
解决中文乱码
<!--在配置文件中加入转换器--> <mvc:annotation-driven > <!-- 消息转换器 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven> <!--在web.xml文件中插入过滤器--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
JSON
<script type="text/javascript"> var user = { "name":"张三", "age":22 }; $.ajax({ url:"jsonType", data:JSON.stringify(user), type:"post", contentType: "application/json;charse=UTF-8", dataType:"text", success:function(data){ } }) </script>
注意
1.json数据必须用JSON.stringify()方法将对象转换成JSON字符串。
2.原生AJAX中的contentType不能省略。
//@RequestBody:接受前台传递的JSON //@ResponseBody:返回JSON对象 @RequestMapping(value="/jsonType") @ResponseBody public User jsonType(@RequestBody User user){ //修改年龄 user.setAge(user.getAge()+10); //返回前端 return user; }
JSON补充
上面的是SpringMVC原生的JSON的方式,开发中经常使用的是阿里的fastjson来取代Spring默认的Jackson进行数据绑定。
fastjson的优势在于如果属性为空就不会将其转化为json,数据会简洁很多。
步骤:
1.pom.xml引入fastjson依赖jar包。
2.springmvc.xml中配置fastjson。
3.运行代码。
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.18</version> </dependency>
<mvc:annotation-driven > <!-- 消息转换器 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/> </bean> <!-- 阿里fastjson --> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"/> </mvc:message-converters> </mvc:annotation-driven>