关于Spring MVC数据绑定

数据绑定:在后端的业务方法中直接获取客户端 HTTP 请求中的参数,将请求参数映射到业务方法的形参中,Spring MVC 中数据绑定的工作是由 HandlerAdapter 来完成的。

  • 基本数据类型
@RequestMapping("/baseType")
@ResponseBody
public String baseType(int id){
    
    
    return id+"";
}

上述代码中:
@ResponseBody 表示 Spring MVC 会直接将业务方法的返回值响应给客户端,如果不加 @ResponseBody 注解,Spring MVC 会将业务方法的放回值传递给 DispatcherServlet,再由 DisptacherServlet 调用 ViewResolver 对返回值进行解析,映射到一个 JSP 资源。

  • 包装类
@RequestMapping("/packageType")
@ResponseBody
public String packageType(@RequestParam(value = "num",required = false,defaultValue = "0") Integer id){
    
    
   return id+"";
}

包装类可以接收 null,当 HTTP 请求没有参数时,使用包装类定义形参的数据类型,程序不会抛出异常。
关于上述代码的@RequestParam
value = “num”:将 HTTP 请求中名为 num 的参数赋给形参 id。

requried:设置 num 是否为必填项,true 表示必填,false 表示非必填,可省略。

defaultValue = “0”:如果 HTTP 请求中没有 num 参数,默认值为0.

  • 数组
@RestController
@RequestMapping("/data")
public class DataBindHandler {
    
    
    @RequestMapping("/array")
    public String array(String[] name){
    
    
        String str = Arrays.toString(name);
        return str;
    }
}

@RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。

@Controller 表示该控制器的每一个业务方法的返回值都会交给视图解析器进行解析,如果只需要将数据响应给客户端,而不需要进行视图解析,则需要在对应的业务方法定义处添加 @ResponseBody。

@RestController
@RequestMapping("/data")
public class DataBindHandler {
    
    
    @RequestMapping("/array")
    public String array(String[] name){
    
    
        String str = Arrays.toString(name);
        return str;
    }
}

上述代码等同于:

@Controller
@RequestMapping("/data")
public class DataBindHandler {
    
    
    @RequestMapping("/array")
    @ResponseBody
    public String array(String[] name){
    
    
        String str = Arrays.toString(name);
        return str;
    }
}
  • List 集合

Spring MVC 中不支持 List 类型的直接转换,需要对 List 集合进行包装。

package com.southwind.entity;

import lombok.Data;

import java.util.List;

@Data
public class UserList {
    
    
    private List<User> users;
}

JSP代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/list" method="post">
        用户1编号:<input type="text" name="users[0].id"/><br/>
        用户1名称:<input type="text" name="users[0].name"/><br/>
        用户2编号:<input type="text" name="users[1].id"/><br/>
        用户2名称:<input type="text" name="users[1].name"/><br/>
        用户3编号:<input type="text" name="users[2].id"/><br/>
        用户3名称:<input type="text" name="users[2].name"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

对应方法:

@RequestMapping("/list")
public String list(UserList userList){
    
    
    StringBuffer str = new StringBuffer();
    for(User user:userList.getUsers()){
    
    
        str.append(user);
    }
    return str.toString();
}

如出现@ResponseBody 中文乱码问题
解决方案:在 springmvc.xml 中配置消息转换器

<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"></property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
  • Map 集合
package com.southwind.entity;

import lombok.Data;

import java.util.Map;

@Data
public class UserMap {
    
    
   private Map<String,User> users;
}

对应方法:

@RequestMapping("/map")
public String map(UserMap userMap){
    
    
    StringBuffer str = new StringBuffer();
    for(String key:userMap.getUsers().keySet()){
    
    
        User user = userMap.getUsers().get(key);
        str.append(user);
    }
    return str.toString();
}

JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/map" method="post">
        用户1编号:<input type="text" name="users['a'].id"/><br/>
        用户1名称:<input type="text" name="users['a'].name"/><br/>
        用户2编号:<input type="text" name="users['b'].id"/><br/>
        用户2名称:<input type="text" name="users['b'].name"/><br/>
        用户3编号:<input type="text" name="users['c'].id"/><br/>
        用户3名称:<input type="text" name="users['c'].name"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
  • JSON
    客户端发生 JSON 格式的数据,直接通过 Spring MVC 绑定到业务方法的形参中。
    处理 Spring MVC 无法加载静态资源,在 web.xml 中添加配置即可。

web.xml:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        $(function(){
     
     
           var user = {
     
     
               "id":1,
               "name":"张三"
           };
           $.ajax({
     
     
               url:"/data/json",
               data:JSON.stringify(user),
               type:"POST",
               contentType:"application/json;charset=UTF-8",
               dataType:"JSON",
               success:function(data){
     
     
                   alter(data.id+"---"+data.name);
               }
           })
        });
    </script>
</head>
<body>

</body>
</html>

对应方法:

@RequestMapping("/json")
public User json(@RequestBody User user){
    
    
    System.out.println(user);
    user.setId(6);
    user.setName("二狗子");
    return user;
}

需要注意的是:Spring MVC 中的 JSON 和 JavaBean 的转换需要借助于 fastjson,pom.xml 引入相关依赖。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>

springmvc.xml 添加 fastjson 配置:

<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"></property>
        </bean>
        <!-- 配置fastjson -->
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean>
    </mvc:message-converters>
</mvc:annotation-driven>

猜你喜欢

转载自blog.csdn.net/weixin_47723535/article/details/108961711