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

说明:对于布尔类型的参数,请求的参数值为truefalse

使用@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>
原文地址:https://www.cnblogs.com/JiangLai/p/9567008.html