简介

从之前的介绍,已经可以使用springMVC完成完整的请求、返回数据的功能。

待解决的问题:如何将数据传入springMVC的控制器进行后续的处理,完成在原生servlet/jsp开发中HttpServletRequet的功能。

解决方案:springMVC参数绑定,即将客户端请求的数据绑定到处理器方法的形参上(也有特例,如Model、ModelMap、HttpServletResponse是返回)

默认的参数绑定

springMVC默认支持一下类型的参数绑定:

HttpServletRequest

HttpServletResponse

HttpSession

Model/ModelMap(本质一样,Model是接口、ModelMap是实现)

//此注解使得注解扫描器将此Controller加载进spring IOC容器进行管理
@Controller
public class UserController {
//此注解建立URL与此处理方法的映射关系
@RequestMapping("/queryUser")
public String queryUser(HttpServletRequest request, HttpServletResponse response
, HttpSession session, ModelMap model) {
String username = request.getParameter("username");
String email = request.getParameter("email");
//模拟后台数据
User user = new User();
user.setUsername(username);
user.setEmail(email);
//返回数据与视图
model.put("user", user);
return "/WEB-INF/jsp/user.jsp";
}
}
结果:

至此也引出了Controller方法返回值并不一定要是ModelAndView

Controller方法的返回值类型可为:

1、ModelAndView

2、String(可通过HttpServletRequest、Model/ModelMap返回数据)

3、void(可通过HttpServletResponse返回json数据)

简单数据类型的参数绑定

简单数据类型参数绑定成功的前提:jsp标签name属性名,与Controller方法的形参名一致

//此注解使得注解扫描器将此Controller加载进spring IOC容器进行管理
@Controller
public class UserController {
//此注解建立URL与此处理方法的映射关系
@RequestMapping("/queryUser")
public String queryUser(int id, String username, Model model) {
//模拟后台数据
User user = new User();
user.setUsername(username);
//返回数据与视图
model.addAttribute("user", user);
model.addAttribute("id", id);
return "/WEB-INF/jsp/user.jsp";
}
}

jsp页面增加id输出

<h2>Hello World!</h2>
${user.username}<br/>
${user.email}
${id}

结果:

POJO参数绑定

POJO数据类型参数绑定成功的前提:客户端请求的key/value数据,key的值与POJO字段名一致

//此注解使得注解扫描器将此Controller加载进spring IOC容器进行管理
@Controller
public class UserController {
//此注解建立URL与此处理方法的映射关系
@RequestMapping("/queryUser")
public ModelAndView queryUser(User user) {
//模拟后台数据
//返回数据与视图
return new ModelAndView("/WEB-INF/jsp/user.jsp").addObject("user", user);
}
}

结果:

包装POJO的参数绑定

包装POJO数据类型参数绑定前提:jsp标签name属性名要按照javabean的层级结构命名

    @RequestMapping("/addAuthority")
public ModelAndView addAuthority(User user) {
//模拟后台数据
//返回数据与视图
user.getAuthority().setId(user.getAuthority().getId() + 10);
user.getAuthority().setDescription(user.getAuthority().getDescription() + "abcd");
return new ModelAndView("/index.jsp").addObject("user", user);
}
public class User {
private String username;
private String email;
private UserAuthority authority; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public UserAuthority getAuthority() {
return authority;
} public void setAuthority(UserAuthority authority) {
this.authority = authority;
}
}
public class UserAuthority {
private String id;
private String description;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

JSP页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>Hello World!</h2>
</body>
<form action="${request.getServletContext().getServletPath()}/springMVC/addAuthority.action" method="post">
<!-- 注意name名称 -->
权限编码:<input name="authority.id" type="text" value="${user.authority.id}"/><br/>
权限描述:<input name="authority.description" type="text" value="${user.authority.description}"/><br/>
<input type="submit" value = "提交"/>
</form>
</ht>

结果:

数组的参数绑定

数据参数绑定成功前提:jsp标签name属性值与Controller形参名一致

 @RequestMapping("/addArray")
public ModelAndView addArray(String[] names) {
//模拟后台数据
//返回数据与视图
if(null != names) {
for(int i = 0 ; i < names.length ; i++) {
names[i] = names[i] + " 2B";
}
}
return new ModelAndView("/index.jsp").addObject("names", names);
}

JSP页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>Hello World!</h2>
</body>
<form action="${request.getServletContext().getServletPath()}/springMVC/addArray.action" method="post">
<input type="text" name="names" /><br/>
<input type="text" name="names" />
<input type="submit" value="提 交"/>
</form>
用户:
<c:forEach items="${names}" var="name">
${name}<br/>
</c:forEach>
</html>

结果:

List类型的参数绑定

List类型绑定成功的前提:必须通过POJO包装类接收List类型

 @RequestMapping("/addUser")
public ModelAndView addUser(User user) {
System.out.println(JsonUtils.objectToJsonString(user));
return new ModelAndView("/index.jsp");
}
public class User {
private String username;
private String email;
private List<UserAuthority> authorities; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public List<UserAuthority> getAuthorities() {
return authorities;
} public void setAuthorities(List<UserAuthority> authorities) {
this.authorities = authorities;
}
}

JSP页面:

<html>
<body>
<h2>Hello World!</h2>
</body>
<form action="${request.getServletContext().getServletPath()}/springMVC/addUser.action" method="post">
<table frame="border">
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
<th>email</th>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<td colspan="2">权限编码</td>
<td colspan="2">权限描述</td>
</tr>
<tr>
<td colspan="2"><input type="text" name="authorities[0].id"/></td>
<td colspan="2"><input type="text" name="authorities[0].description"/></td>
</tr>
<tr>
<td colspan="2"><input type="text" name="authorities[1].id"/></td>
<td colspan="2"><input type="text" name="authorities[1].description"/></td>
</tr>
</table>
<input type="submit" value = "提交"/>
</form>
</html>

结果:

Map类型的参数绑定

Map类型绑定成功的前提:必须通过POJO包装类接收Map类型

@RequestMapping("/addUser")
public ModelAndView addUser(User user) {
System.out.println(JsonUtils.objectToJsonString(user));
return new ModelAndView("/index.jsp");
}
public class User {
private String username;
private String email;
private Map<String, String> authorities; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Map<String, String> getAuthorities() {
return authorities;
} public void setAuthorities(Map<String, String> authorities) {
this.authorities = authorities;
}
}

结果:

JSP页面

<html>
<body>
<h2>Hello World!</h2>
</body>
<form action="${request.getServletContext().getServletPath()}/springMVC/addUser.action" method="post">
<table frame="border">
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
<th>email</th>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<td>权限编码</td>
<td><input type="text" name="authorities[id]"/></td>
<td>权限描述</td>
<td><input type="text" name="authorities[description]"/></td>
</tr>
</table>
<input type="submit" value = "提交"/>
</form>
</html>

其它知识点

1、springMVC使用Converter(老版本中使用PropertyEditor)进行请求数据到参数绑定数据之间的类型转换

springmvc提供了很多Converter,特殊情况下需要使用自定义Converter(比如对日期数据的绑定)

此时需自定义转换类,并实现Convert<S,T>接口,并在配置文件中进行注册

2、有时界面标签name值与形参字段名不一致时,可以通过@RequestParam注解建立映射关系

通过required属性可指定参数是否必须传入

通过defaultValue属性可指定默认值

springMVC入门(四)------参数绑定与返回值类型的更多相关文章

  1. <SpringMvc>入门三 参数绑定

    1.get请求 <%--请求参数的绑定--%> <%--get请求参数--%> <a href="/param/testParam1?username=tom& ...

  2. C# 通过反射获取MVC Controller里的类名,方法名,参数列表,返回值类型,Description描述,自定义Attribute

    需要反射的DLL里的一个类: namespace ElegantWM.WebUI.Areas.Admin.Controllers { [Description("功能模块管理")] ...

  3. SpringMVC异步处理 可使用的返回值类型

    CallableMethodReturnValueHandler Callable.class.isAssignableFrom(returnType.getParameterType()); Def ...

  4. 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器

    springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...

  5. SpringMVC介绍及参数绑定

    本节内容: SpringMVC介绍 入门程序 SpringMVC架构 SpringMVC整合MyBatis 参数绑定 SpringMVC和Struts2的区别 一.SpringMVC介绍 1. 什么是 ...

  6. springMVC学习(5)-参数绑定

    接着上一集,记录参数绑定的过程: springmvc中,接收页面提交的数据是通过方法形参来接收: 一.默认支持的类型: 在controller形参中添加如下类型的参数处理适配器会默认识别并进行赋值: ...

  7. SpringMVC中的参数绑定总结

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...

  8. 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...

  9. SSM框架之SpringMVC(4)返回值类型及响应数据类型

    SpringMVC(4)返回值类型及响应数据类型 1. 返回值分类 1.1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestM ...

随机推荐

  1. 第四课 OOP封装继承多态解析,接口抽象类选择 2019-04-21

    父类 xx = new 子类(); xx.method(); 1 普通方法由编译时决定(左边) --- 提高效率 2 虚方法(virtual)  由运行时决定-- -多态,灵活 3 抽象方法由运行时决 ...

  2. Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|

    内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...

  3. Entry基本用法

    1.BooleanVar() 布尔类型 2.IntVar() 整数类型 3.DoubleVar() 浮点数类型 4.StringVar() 字符串类型 5.self.entry1 = Entry(se ...

  4. 架构师写的BUG,非比寻常

    部门新来了个架构师,BAT背景,住在三环,开宝马上班,有车位. 小伙话不多,但一旦说话斩钉截铁,带着无法撼动的自信.原因就是,有他着数亿高并发经验,每一秒钟的请求,都是其他企业运行一年也无法企及的.这 ...

  5. PHP array_diff_uassoc() 函数

    实例 比较两个数组的键名和键值(使用用户自定义函数比较键名),并返回差集: <?phpfunction myfunction($a,$b){if ($a===$b){return 0;}retu ...

  6. Python File tell() 方法

    概述 tell() 方法返回文件的当前位置,即文件指针当前位置.高佣联盟 www.cgewang.com 语法 tell() 方法语法如下: fileObject.tell() 参数 无 返回值 返回 ...

  7. luogu 6046 纯粹容器 期望dp

    LINK:纯粹容器 一道比较不错的期望题目. 关键找到计算答案的方法. 容易发现对于每个点单独计算答案会好处理一点. 暴力枚举在第k轮结束统计情况 然后最后除以总方案数即可. 考虑在第k轮的时候结束 ...

  8. day23:单继承&多继承&菱形继承&__init__魔术方法

    1.单继承 1.1 关于继承的一些基本概念 1.2 子类可以调用父类的公有成员 1.3 子类无法调用父类的私有成员 1.4 子类可以改写父类的方法 2.多继承 2.1 多继承的基本语法 2.2 sup ...

  9. Python监控你的女朋友/男朋友每天都在看哪些网站

    需求: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提 ...

  10. Python实现各类验证码识别

    项目地址: https://github.com/kerlomz/captcha_trainer 编译版下载地址: https://github.com/kerlomz/captcha_trainer ...