1.3(Spring MVC学习笔记)数据绑定
一、数据绑定介绍
用户发送过来的数据,只有传递到服务器端的参数上才会起作用。
比如用户输入的用户名和密码要和后台方法中代表用户名和密码的变量关联起来,
从而才能使用用户传递的数据进行一些操作,这样数据才是有意义的,
两者之间的关联也称数据绑定。
数据绑定流程:
1.SpringMVC将ServletRequest对象传递给DataBinder组件。
2.将处理方法的入参对象传递给DataBinder.
3.DataBider组件调用ConversionService组件,ConversionService组件进行数据类型转换等工作
并将ServletReqeust对象中的消息填充到参数对象中。
4.调用Validator组件对绑定了请求消息的的参数对象进行数据合法校验。
5.校验完成会生成数据绑定结果BindingResult对象,SpringMVC将BindingResult对象赋给处理方法中相应的参数。

二、简单数据绑定
2.1绑定简单数据类型
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>SpringMVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class >
org.springframework.web.servlet.DispatcherServlet
</servlet-class> <!-- 初始化时加载配置文件,该配置文件是在src目录下创建的。 -->
<!-- <init-param> 该选项不配做会自动寻找WEB-INF下名为springmvc-servlet.xml的文件。-->
<!-- <param-name>contextConfigLocation</param-name>-->
<!-- <param-value>classpath:springmvc-config.xml</param-value>-->
<!--</init-param>-->
<!-- 当前servlet与容器一起加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 所有请求都会被前端控制器拦截-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Controller类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
@RequestMapping("/dataBinder")
public class DataBinder {
@RequestMapping("/getData")
public String TestDataBinder(HttpServletRequest request, HttpServletResponse reponse, String name, int age) {
String _name = request.getParameter("name");
String _age = request.getParameter("age");
System.out.println("_name:" + _name +"\n" + "name:" + name);
System.out.println("_age:" + _age +"\n" + "age:" + age);
return "success";
}
}
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启扫描 -->
<context:component-scan base-package = "com.springmvc.*"></context:component-scan>
<!-- 配置处理器(Handle),映射/firstController请求 (Controller类),已由注解完成-->
<!-- <bean name = "/firstController" class = "com.springmvc.firstmvc.FirstController"/> -->
<!-- 配置映射处理器(handlerMapping) 将处理器(Handle)的name作为url进行查找(Spirng4.0以后无需配置) -->
<!-- 配置适配处理器(HandlerAdapter) 适配处理器会调用处理器(Handle)即FirstController类(Spirng4.0以后无需配置) -->
<!-- 处理器会返回一个ModelAndView,适配处理器将返回的ModelAndView交给前端控制器去处理了 -->
<!-- 前端控制器根据ModelAndView中的View选择一个视图解析器(ViewReslover) -->
<!-- 前端控制器将Model(msg "hello SpringMVC")填充进视图解析器返回的视图,用户看到最后页面 -->
<!-- 设置视图处理器及其前缀后缀 -->
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value = "/WEB-INF/jsp/"></property>
<property name="suffix" value = ".jsp"></property>
</bean>
<!-- 视图处理器解析后会将视图传递给前端控制器,前端控制对View进行渲染(将模型数据填入视图) -->
<!-- 渲染结果会返回客户端浏览器显示 -->
</beans>
/WEB-INF/jsp/success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
success
</body>
</html>
http://localhost:8080/SpringMVC/dataBinder/getData?name=hcf&age=20


可以发现,通过reqeust.getParameter() 可以获取到请求参数。
Controller类中的TestDataBinder方法中的参数也获取到了请求参数。
注:控制器类中方法的参数名和请求中的参数名保持一致才能自动填充。
如果不一致可以通过注解的方法进行绑定。
例如
public String test(@RequestParam(value="name") String userName){
....
}
这样就可以将请求参数名为name的值绑定到userName上。
2.2绑定POJO类型。
绑定POJO类型即将用户请求信息封装到一个类中,然后这个类来完成参数的绑定。
注:请求参数名要和类中属性名一致。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>SpringMVC</display-name> <!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class >
org.springframework.web.servlet.DispatcherServlet
</servlet-class> <!-- 初始化时加载配置文件,该配置文件是在src目录下创建的。 -->
<!-- <init-param> 该选项不配置,容器会自动寻找WEB-INF下名为springmvc(前端控制器配置的servlet-name)-servlet.xml的文件。-->
<!-- <param-name>contextConfigLocation</param-name>-->
<!-- <param-value>classpath:springmvc-config.xml</param-value>-->
<!--</init-param>-->
<!-- 当前servlet与容器一起加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 所有请求都会被前端控制器拦截-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启扫描 -->
<context:component-scan base-package = "com.springmvc.*"></context:component-scan>
<!-- 配置处理器(Handle),映射/firstController请求 (Controller类),已由注解完成-->
<!-- <bean name = "/firstController" class = "com.springmvc.firstmvc.FirstController"/> -->
<!-- 配置映射处理器(handlerMapping) 将处理器(Handle)的name作为url进行查找(Spirng4.0以后无需配置) -->
<!-- 配置适配处理器(HandlerAdapter) 适配处理器会调用处理器(Handle)即FirstController类(Spirng4.0以后无需配置) -->
<!-- 处理器会返回一个ModelAndView,适配处理器将返回的ModelAndView交给前端控制器去处理了 -->
<!-- 前端控制器根据ModelAndView中的View选择一个视图解析器(ViewReslover) -->
<!-- 前端控制器将Model(msg "hello SpringMVC")填充进视图解析器返回的视图,用户看到最后页面 -->
<!-- 设置视图处理器及其前缀后缀 -->
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value = "/WEB-INF/jsp/"></property>
<property name="suffix" value = ".jsp"></property>
</bean>
<!-- 视图处理器解析后会将视图传递给前端控制器,前端控制对View进行渲染(将模型数据填入视图) -->
<!-- 渲染结果会返回客户端浏览器显示 -->
</beans>
POJO类
public class Person {
public String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Controller类
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import com.spring.pojo.Person; @Controller
@RequestMapping("/dataBinder")
public class DataBinder {
@RequestMapping("/getData")//登录页面提交表单后调用,该方法获取数据,最后返回success页面。
public String TestDataBinder(Person per, Model model) {
String _name = per.getName();
int _age = per.getAge();
model.addAttribute("name", _name);
model.addAttribute("age", _age);
System.out.println("_name:" + _name );
System.out.println("_age:" + _age );
return "success";
} @RequestMapping("/login")//接收登录请求,返回登录页面。
public String toLogin() {
return "login";
}
}
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "${pageContext.request.contextPath}/dataBinder/getData" method = "post">
用户名:<input type = "text" name = "name"/><br/>
密 码:<input type = "text" name = "age"/><br/>
<input type = "submit" value = "登录"/>
</form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
login success <br/>
welcome: ${name } ${age }
</body>
</html>

首先输入localhost:8080/SpringMVC/dataBinder/login.执行控制类中的toLogin方法,跳转到loging.jsp页面。
在login.jsp页面输入用户名和密码,由于<input >中name属性的值和对象中的属性名相同,故进行自动绑定。
数据被封装成一个Person,然后提交到控制类中的TestDataBinder方法,从per中取出数据,并用model对象
设置数据,最后返回success页面。
2.3绑定包装POJO
有时一个类中的某一个属性是另外一个类的对象,也就是说一个类中包含另外一个类。
这个就需要将其包装起来再绑定。
Room.java(Room类中包含Person 和一个面积(area)属性)
public class Room {
public Person person;
public int area;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public int getArea() {
return area;
}
public void setArea(int area) {
this.area = area;
}
}
接下来只需要对login.jsp、控制类中的TestDataBinder方法、success.jsp进行一定的修改即可。
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "${pageContext.request.contextPath}/dataBinder/getData" method = "post">
姓 名:<input type = "text" name = "person.name"/><br/>
年 龄:<input type = "text" name = "person.age"/><br/>
面 积:<input type = "text" name = "area" /><br/>
<input type = "submit" value = "登录"/>
</form>
</body>
</html>
此时传递的对象为room,如果请求参数是包装类(Room)直接的基本属性(如area),<input>中name的和参数名保持一致即可。
如果请求参数是包装类中其他类的属性,需要将<input>的name设置为对象属性名.属性(如person.name,其中person为Room类中Person类的属性名)
控制类
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import com.spring.pojo.*; @Controller
@RequestMapping("/dataBinder")
public class DataBinder {
@RequestMapping("/getData")//登录页面提交表单后调用,该方法获取数据,最后返回success页面。
public String TestDataBinder(Room room, Model model) {//参数为Room类型
String _name = room.getPerson().getName();
int _age =room.getPerson().getAge();
int _area = room.getArea(); model.addAttribute("name", _name);
model.addAttribute("age", _age);
model.addAttribute("area", _area); System.out.println("_name:" + _name );
System.out.println("_age:" + _age );
System.out.println("area" + _area );
return "success";
} @RequestMapping("/login")//接收登录请求,返回登录页面。
public String toLogin() {
return "login";
}
}
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
login success <br/>
welcome: ${name } ${age } ${area }
</body>
</html>

2.4自定义数据绑定
例如有时要将字符串日期转换为Date对象,这时就需要将其转换,然后再绑定。
2.4.1实现Convert接口进行转换
自定义转换类需要实现org.springframework.core.convert.converter.Converter接口
pubilic interface Convert<S,T>{
T convert(S source){...}
}
其中S是源类型,T是目标类型。S->T。
DataConvert.java(日期转换类)
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.core.convert.converter.Converter; public class DataConvert implements Converter<String, Date> { @Override
public Date convert(String dataStr) {
// TODO Auto-generated method stub
String pattern = "yyyy-MM-dd hh:mm:ss";
DateFormat format = new SimpleDateFormat(pattern);
Date date = null;
try {
date = format.parse(dataStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new IllegalArgumentException("无效的日期格式,请使用:" + pattern + "格式");
}
return date;
} }
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启扫描 -->
<context:component-scan base-package = "com.springmvc.*"></context:component-scan>
<!-- 配置处理器(Handle),映射/firstController请求 (Controller类),已由注解完成-->
<!-- <bean name = "/firstController" class = "com.springmvc.firstmvc.FirstController"/> -->
<!-- 配置映射处理器(handlerMapping) 将处理器(Handle)的name作为url进行查找(Spirng4.0以后无需配置) -->
<!-- 配置适配处理器(HandlerAdapter) 适配处理器会调用处理器(Handle)即FirstController类(Spirng4.0以后无需配置) -->
<!-- 处理器会返回一个ModelAndView,适配处理器将返回的ModelAndView交给前端控制器去处理了 -->
<!-- 前端控制器根据ModelAndView中的View选择一个视图解析器(ViewReslover) -->
<!-- 前端控制器将Model(msg "hello SpringMVC")填充进视图解析器返回的视图,用户看到最后页面 -->
<!-- 设置视图处理器及其前缀后缀 -->
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value = "/WEB-INF/jsp/"></property>
<property name="suffix" value = ".jsp"></property>
</bean> <!-- 视图处理器解析后会将视图传递给前端控制器,前端控制对View进行渲染(将模型数据填入视图) -->
<!-- 渲染结果会返回客户端浏览器显示 --> <!-- 配置自定义转换器 -->
<mvc:annotation-driven conversion-service="conversionService"/> <!-- 自定义转换器 -->
<bean id = "conversionService" class = "org.springframework.context.support.ConversionServiceFactoryBean">
<!-- converters属性用于指定所有自定义的Convert -->
<property name="converters">
<set>
<bean class = "com.springmvc.convert.DataConvert"></bean>
</set>
</property>
</bean> </beans>
Controller类
import java.util.Date; import org.springframework.web.bind.annotation.RequestMapping; @org.springframework.stereotype.Controller
public class Controller {
@RequestMapping("/dateConvert")
public String dataConvert(Date date) {//请求参数中date会被转换去解析,然后绑定到形参date上
System.out.println(date);
return "success";
}
}
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
success <br/> </body>
</html>
输入的字符串要符合指定的格式
http://localhost:8080/SpringMVC/dateConvert?date=2019-2-20%208:36:40


其中URL的%20代表空格。
无效的格式:
http://localhost:8080/SpringMVC/dateConvert?date=111


2.4.2实现Formatter接口进行转换
org.springframework.format.Formatter
public interface Formatter<T> extends Printer<T>,Parser<T>{}
实现Formatter接口后,需要实现print和parse两个方法。
其中T是目标对象,使用Formatter进行转换源目标必须是String类型。
使用和Convert大致相同。
DateFormatter.java(转换类)
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale; import org.springframework.format.Formatter; public class DataFormatter implements Formatter<Date>{
private String pattern = "yyyy-MM-dd hh:mm:ss";
private DateFormat foram = new SimpleDateFormat(pattern); @Override
public String print(Date date, Locale local) {
// TODO Auto-generated method stub
return foram.format(date);
} @Override
public Date parse(String dateStr, Locale local) throws ParseException {
// TODO Auto-generated method stub
return foram.parse(dateStr);//返回日期对象
} }
控制类:
import java.util.Date; import org.springframework.web.bind.annotation.RequestMapping; @org.springframework.stereotype.Controller
public class ControllerDateFormat {
@RequestMapping("/dateConvert")
public String dataConvert(Date date) {
System.out.println(date);
return "success";
}
}
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启扫描 -->
<context:component-scan base-package = "com.springmvc.*"></context:component-scan>
<!-- 配置处理器(Handle),映射/firstController请求 (Controller类),已由注解完成-->
<!-- <bean name = "/firstController" class = "com.springmvc.firstmvc.FirstController"/> -->
<!-- 配置映射处理器(handlerMapping) 将处理器(Handle)的name作为url进行查找(Spirng4.0以后无需配置) -->
<!-- 配置适配处理器(HandlerAdapter) 适配处理器会调用处理器(Handle)即FirstController类(Spirng4.0以后无需配置) -->
<!-- 处理器会返回一个ModelAndView,适配处理器将返回的ModelAndView交给前端控制器去处理了 -->
<!-- 前端控制器根据ModelAndView中的View选择一个视图解析器(ViewReslover) -->
<!-- 前端控制器将Model(msg "hello SpringMVC")填充进视图解析器返回的视图,用户看到最后页面 --> <!-- 设置视图处理器及其前缀后缀 -->
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value = "/WEB-INF/jsp/"></property>
<property name="suffix" value = ".jsp"></property>
</bean> <!-- 视图处理器解析后会将视图传递给前端控制器,前端控制对View进行渲染(将模型数据填入视图) -->
<!-- 渲染结果会返回客户端浏览器显示 --> <!-- 配置自定义转换器 -->
<mvc:annotation-driven conversion-service="formatService"/> <!-- 自定义转换器(Convert) -->
<!-- <bean id = "conversionService" class = "org.springframework.context.support.ConversionServiceFactoryBean">
converters属性用于指定所有自定义的Convert
<property name="converters">
<set>
<bean class = "com.springmvc.convert.DataConvert"></bean>
</set>
</property>
</bean> --> <!-- 自定义转换器(Format) -->
<bean id = "formatService" class = "org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class = "com.springmvc.formatter.DataFormatter"></bean>
</set>
</property>
</bean> </beans>


2.2绑定复杂数据类型
2.2.1绑定数组,绑定数组与前面直接绑定参数类型,
但要求数组名和<input>中name属性的值相同。
如果名称不同可通过@RequestParam注解绑定。
控制类
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class TestArrayBinderControl {
@RequestMapping("/success")
public String bingderArray(String[] ids , HttpServletRequest request) {
request.setAttribute("ids", ids);
System.out.println("into bingderArray");
return "success";
} @RequestMapping("/toSelect")
public String toSelect() {
return "select";
}
}
select.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "${pageContext.request.contextPath}/success" method = "post">
篮球:<input type = "checkBox" name = "ids" value = "basketball"/>
足球:<input type = "checkBox" name = "ids" value = "football"/>
网球:<input type = "checkBox" name = "ids" value = "tennis"/>
<input type = "submit" value = "提交"/>
</form>
</body>
</html>
success.jsp(用于展示成功页面,并输出选择数据)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%! %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
success <br/>
<%
String[] ids = (String[])request.getAttribute("ids");
if(ids !=null){
for(String temp: ids){
%>
<%=temp%>
<%
}
}else{
response.getWriter().println("null");
};
%>
</body>
</html>

2.2.2绑定集合
集合不能绑定,需要将集合作为POJO类的一个参数,通过传递POJO类进行间接绑定。
类似前面的POJO绑定,只不过将POJO中的属性变成了集合。
POJO类
import java.util.List;
public class POJO<T> {
public List<T> list;
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
控制类
@Controller
public class TestListBinderControl {
@RequestMapping("/success")
public String bingderArray(POJO<String> p , HttpServletRequest request) {
request.setAttribute("ids", p);
return "success";
} @RequestMapping("/toSelect")
public String toSelect() {
return "select";
}
}
select.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "${pageContext.request.contextPath}/success" method = "post">
篮球:<input type = "checkBox" name = "list[0]" value = "basketball"/>
足球:<input type = "checkBox" name = "list[1]" value = "football"/>
网球:<input type = "checkBox" name = "list[2]" value = "tennis"/>
<input type = "submit" value = "提交"/>
</form>
</body>
</html>
由于控制类中方法的形参是POJO类型,只需name与POJO中属性名称一致即可完成POJO绑定。
绑定后通过POJO获取集合。
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.springmvc.binderList.*" %> <!--使用的类要导入-->
<!DOCTYPE html>
<%! %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
success <br/>
<%
POJO<String> p = (POJO<String>)request.getAttribute("ids");
if(p !=null){
for(String temp: p.getList()){
%>
<%=temp%>
<%
}
}else{
response.getWriter().println("null");
};
%>
</body>
</html>
效果与之前绑定数组效果一致。
如果POJO中的集合是不基本类型而是自定义的类。
例如User中两个属性id和name。POJO中是 List<User> list.
则<input>中name属性的值对应即可。
例如以上述假设为例:
<input name = list[0].id> 即可,list[0]看做一个User对象,直接指定对象中属性即可。
多个类包含以此类推。
1.3(Spring MVC学习笔记)数据绑定的更多相关文章
- Spring MVC 学习笔记一 HelloWorld
Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息
Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...
- Spring MVC 学习笔记8 —— 实现简单的用户管理(4)用户登录
Spring MVC 学习笔记8 -- 实现简单的用户管理(4)用户登录 增删改查,login 1. login.jsp,写在外面,及跟WEB-INF同一级目录,如:ls Webcontent; &g ...
- Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目
Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目 Spring Tool Suite 是一个带有全套的Spring相关支持功能的Eclipse插件包. ...
- Spring MVC 学习笔记1 - First Helloworld by Eclipse【& - java web 开发Tips集锦】
Spring MVC 学习笔记1 - First Helloworld by Eclipse reference:http://www.gontu.org 1. 下载 Spring freamwork ...
- Spring MVC 学习笔记(二)
6. 视图和视图解析器 ❤ Spring MVC如何解析视图 • 请求处理方法执行完成后,最终返回一个ModelAndView对象 ...
- Spring MVC 学习笔记(整理)
SpringMVC学习 1.概述 Spring MVC是一种基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行解耦,基于请求-响应模型帮助我们 ...
随机推荐
- bzoj 1110 [POI2007]砝码Odw 贪心+进制转化
[POI2007]砝码Odw Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 661 Solved: 366[Submit][Status][Disc ...
- Terminals Project
https://github.com/Terminals-Origin Terminals Project Terminals is a secure, multi tab terminal serv ...
- barba 页面渲染
a.css html, body { padding:; margin: 0 } ol.menu { width: 100%; text-align: left; padding: 0 !import ...
- [BZOJ1441&BZOJ2257&BZOJ2299]裴蜀定理
裴蜀定理 对于整系数方程ax+by=m,设d =(a,b) 方程有整数解当且仅当d|m 这个定理实际上在之前学习拓展欧几里得解不定方程的时候就已经运用到 拓展到多元的方程一样适用 BZOJ1441 给 ...
- linux基础——文件的压缩解压缩以及vim编辑
一.将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/{passwd,group} > /1.txt 查看:cat /1.txt 二. ...
- Cpython解释器支持的进程与线程
一.理论部分 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的 ...
- shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份
有时我们需要将一个文件夹覆盖到我们的工作目录,但需要自动备份已经存在的文件,一个一个去备份太麻烦了,全部备份又没有必要.shell脚本可以很好滴完成这个任务.原文链接http://back.zhizh ...
- arm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依据什么来分类的【转】
转自:http://blog.csdn.net/maochengtao/article/details/9951131ARM处理器发展这么多年,有很多架构,很多不同的内核 架构有armv1 v2 v3 ...
- 关于测试url传值的问题
url1:http://localhost:8080/fms/finan/isRiskCustomer.action?customername="xxxxxxxx"; 如上这样写, ...
- selenium 消息框元素定位处理
以下内容来自于“风少”的博客 <元素定位:selenium消息框处理 (alert.confirm.prompt)> 基础普及 alert对话框 .细分三种,Alert,prompt,co ...