SpringMVC数据绑定2
SpringMVC数据绑定
使用JavaBean绑定参数
-
Spring MVC会根据请求参数名和JavaBean属性名进行自动匹配,自动为对象填充属性值,同时支持级联属性
package com.soutwind.entity; import lombok.Data; @Data public class Address { private String value; }
package com.soutwind.entity;
import lombok.Data;
@Data
public class User {
private long id;
private String name;
private Address address;
}
<%--
Created by IntelliJ IDEA.
User: DELL
Date: 2023/2/10
Time: 14:52
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/save" method="post">
<%-- 表单里name的值映射到User类里面--%>
用户id:<input type="text" name="id"><br/>
用户名:<input type="text" name="name"><br/>
<%--级联操作,把name里面的值赋值adress属性里的value属性--%>
用户地址<input type="text" name="address.value"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
handler类中的save方法
@RequestMapping(value = "/save",method =RequestMethod.POST )
public String save(User user){//discapterAdapter对传过来的值进行自动填充,填充的参数可以是类创建的对象的方式
System.out.println(user);
return "index";
}
上述操作如果出现中文乱码问题,只需要在web.xml添加Spring自带的过滤器即可。
<!--在web.xml中配置解决中文乱码的过滤器-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- JSP转发和重定向
- 转发是一次请求,重定向是两次请求。
- 转发请求的数据可以保留使用,重定向第一次请求的数据不可以给第二次请求。
Spring默认是以转发的形式相应jsp。
//转发,SpringMVC默认接收JSP的方式为转发
@RequestMapping(value = "/forward")
public String forward(){
return "foward:/index.jsp";//效果和 return "index"默认效果一样
}
重定向
//重定向
@RequestMapping("/redirect")
public String redirect(){
return "redirect:/index.jsp";
}
-
Spring MVC数据绑定
概念:数据绑定:在后端的业务方法中直接获取客户端http请求中的参数,将请求参数映射到业务方法的形参中。
SpringMVC 中数据绑定的工作是由 HandlerAdapter来完成的。
-
基本数据类型。
package com.soutwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/data")
public class DataBindHandler {
@RequestMapping("baseType" )
@ResponseBody
//@ResponseBody注解作用,不会把业务方法的返回值通过解析器解析成jsp,而是以它本身的形式返回给客户端
public String baseType(int id){
return id+"";
}
}
@ResponseBody表示SpringMVC 会直接将业务方法的返回值响应给客户端,如果不加@ResponseBody
注解,SpringMVC会将业务方法的返回值传递给DisapatherServlet,再由DisapatherServlet调用ViewResolver
对返回值进行解析,映射到一个JSP资源。
存在问题,id是基本数据类型,所以不能为空,不然会报错.
解决方法:包装类
- 包装类:可以接受null
@RequestMapping("/packageType")
@ResponseBody
public String packageType(Integer id){
return id +"";
}
@RequestMapping("/packageType")
@ResponseBody
//“value = "num"”把客户端请求的num赋值给id,required = false当num为空时不报错,defaultValue = "没有传输值!"为空时的返回值。
public String packageType(@RequestParam(value = "num",required = false,defaultValue = "0") Integer id){
return id +"";
}
@RequestParam注解的属性
- value="num":将HTTP请求中名为num的参数赋值给形参id
- required:设置num是否为必填项,true为必填,不填页面报错,false为非必填,默认必填。
- defaultValue="0":如果HTTP请求中没有num参数,默认值为0.
数组
@RequestMapping("/array")
//每个方法基本都要写 @ResponseBody,把他提取到类上面,和@Controller进行合并成RestController.
// @ResponseBody
public String array(String[] name){
String str =Arrays.toString(name);
return str;
}
@RestContoller表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。
@Controller表示该控制器的每一个业务方法的返回值都会交给视图解析器进行解析,如果只需要将数据响应给客户端,而且不需要进行视图解析,则需要在对应的业务方法定义处添加@ResponseBody注解。
- list集合
SpringMVC 不支持List类型的直接转换拿,需要对List集合进行包装。
处理@ResponseBody中文乱码,在springmvc.xml中配置消息转换器