zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    MVC 学习(二)之Linq to Sql 简单Demo
    MVC 学习(一)Linq to Entities 简单Demo
    MVC学习(三)Code-First Demo
    pickle 模块
    json 模块
    sys 模块
    os 模块
    random(随机)模块
    time 模块
    python之函数基础
  • 原文地址:https://www.cnblogs.com/JiangLai/p/9567008.html
Copyright © 2011-2022 走看看