- 使⽤ JavaBean 绑定参数
Spring MVC 会根据请求参数名和 JavaBean 属性名进行自动匹配,自动为对象填充属性值,同时支持及联属性。
import lombok.Data;
@Data
public class Address {
private String value;
}
import lombok.Data;
@Data
public class User {
private long id;
private String name;
private Address address;
}
在jsp页面中添加表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/hello/save" method="post">
用户id:<input type="text" name="id"/><br/>
用户名:<input type="text" name="name"/><br/>
用户地址:<input type="text" name="address.value"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
调用业务逻辑方法
@RequestMapping(value = "/save",method = RequestMethod.POST)
public String save(User user){//这里直接获取的是Javabean对象
System.out.println(user);
return "index";
}
如果出现中文乱码问题,只需在 web.xml 添加 Spring MVC 自带的过滤器即可。
<filter>
<filter-name>encodingFilter</filter-name>
<filterclass>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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
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 资源。相当于此处id传入的是“10”,则视图解析器会解析成 /10.jsp 物理地址 不加requesBody注解则传给浏览器10.
也可以这样理解: @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
- 包装类
包装类可以接收 null,当 HTTP 请求没有参数时,使用包装类定义形参的数据类型,程序不会抛出异常。
@RequestParam
value = “num”:将 HTTP 请求中名为 num 的参数赋给形参 id。
requried:设置 num 是否为必填项,true 表示必填,false 表示非必填,可省略。
defaultValue = “0”:如果 HTTP 请求中没有 num 参数,默认值为0.
@RequestMapping("/packageType")
@ResponseBody
public String packageType(@RequestParam(value = "num",required =
false,defaultValue = "0") Integer id){
return id+"";
}
- 数组
@RestController
@RequestMapping("/data")
public class DataBindHandler {
@RequestMapping("/array")
public String array(String[] name){
String str = Arrays.toString(name);
return str;
}
}
@RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。
把@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 集合进行包装。
集合封装类
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){//业务方法的形参只能和entity的属性对应 而这里的属性是一个list集合
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=UTF8"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
- Maps 数据
自定义封装map类、
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 中添加配置即可。
<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>
@RequestMa
业务方法:
@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>
注意 js 为静态资源 也会被 dispatcherServlet前端控制器拦截
需要在web.xml中配置不拦截
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=UTF8"></property>
</bean>
<!-- 配置fastjson -->
<bean
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4">
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
结果显示
前端传入json数据 通过fastjson工具解析成user对象
再返回user对象 又通过fastjson工具解析成json数据发送给前端