1. 概述

Spring MVC 允许以多种方式将客户端的数据传送到控制器的处理方法中:

  • 查询参数(Query Parameter)
  • 表单参数(Form Parameter)
  • 路径变量(Path Variable)

2. 详解

2.1 处理查询参数

查询参数都是String类型的,但当绑定到方法参数时会转换为相应的类型

在方法中使用 @RequestParam注解,同时可通过defaultValue属性设置当参数不存在时的默认值,如

public List<Spittle> spittles( @RequestParam(value="max",defaultValue=MAX_LONG_AS_STRING) long max,@RequestParam(value="count",defaultValue="20") int count )
// 不设置默认值时
public List<Spittle> spittles( @RequestParam("max") long max,@RequestParam("count") int count )

2.2 处理路径参数接受输入

  1. @RequestMapping中添加占位符(用{}括起来)表示变量部分,如 @RequestMapping(value="/{spittleId}"),这样就能够处理针对“/spittles/123454”的请求。
  2. 在方法参数上添加@PathVariable("spittleId") 注解,如public String spittle(@PathVariable("spittleId") long spittleId, Model model)
  3. 若方法参数名与占位符名称相同(都是spittleId),则可去掉@PathVariable的 value 属性:public String spittle(@PathVariable long spittleId, Model model)

此时若修改参数名,需要同步修改占位符名称

2.3 处理表单

使用HTML的<form>标签。

如果form所在视图是通过return 视图名的形式渲染的,那么,form中可以没有action属性。此时,其将提交到与展现是相同的URL路径上。如,访问“/register”得到带form的“/registerForm”视图,则提交form时会提交到“/register”

处理表单提交时,相应的方法参数可以使用包含与请求参数同名属性的对象(即对象属性与form中的input的name同名。若Spitter对象有属性username,则某个表单域中的name需要为username)

若需要对参数进行校验时,可使用Spring对Java Validation API的支持。即对参数使用@Valid注解,并紧跟Errors参数,以便对错误进行处理。

具体的校验规则在参数对象中设置,如

public class Spitter{
@NotNull //所有的注解位于 javax.validation.constraints 包中
@Size(min=5,max=16)
private String username;//非空,5-16个字符
}

则:

public String processRegistration(@Valid Spitter spitter, Errors errs)
{
if(errs.hasErrors){
return "registerForm";//如果校验失败,重新返回表单,避免重复提交
}
}

3. 补充内容

此部分非《Spring 实战》内容

3.1 Ajax/JSON 输入

http://blog.csdn.net/oTengYue/article/details/51598277

请求的Content-Typeapplication/json,请求数据在request的body中

  • 不能使用String xxx形式
  • 不能使用@RequestParam

@RequestBody注释进行参数传递

@RequestMapping(value = "buAuth/save1")
@ResponseBody
public String save1(@RequestBody BuAuth buAuth){
return "SUCCESS";
}

  采用@RequestBody标注的参数,SpringMVC 框架底层能够自动完成JSON字符串转对应的Bean并注入到方法参数中,主要是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。此时Ajax发送的data值必须为Json字符串,如果Controller中需要映射到自定义Bean对象上上,则必须设置Ajax的contentType为application/json(或application/xml)。这种方式完整举例如下:

$.ajax({
type: "POST",
url: "$!{_index}/buAuth/save1",
data:JSON.stringify(dataObj) ,//传递参数必须是Json字符串
contentType: "application/json; charset=utf-8",//必须声明contentType为application/json,否则后台使用@RequestBody标注的话无法解析参数
dataType: "json",
success: function (response, info) {}
});
@RequestMapping(value = "buAuth/save1")
@ResponseBody
public String save1(@RequestBody BuAuth buAuth){
return "SUCCESS";
}

注:(1)此时前端直接用$.post()直接请求会有问题,ContentType默认是application/x-www-form-urlencoded。需要使用$.ajaxSetup()标示下ContentType为application/json(或application/xml)。

$.ajaxSetup({ContentType:" application/json"});

$.post("$!{_index}/buAuth/save",{buAuth:JSON.stringify(dataObj),menuIds:menu_ids},function(result){});

(2)可以使用@ResponseBody传递数组,如下举例(做为整理直接引用其他博客例子)


var saveDataAry=[];
var data1={"userName":"test","address":"gz"};
var data2={"userName":"ququ","address":"gr"};
saveDataAry.push(data1);
saveDataAry.push(data2);
$.ajax({
type:"POST",
url:"user/saveUser",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(saveData),
success:function(data){ }
});
@RequestMapping(value = "saveUser", method = {RequestMethod.POST }})
@ResponseBody
public void saveUser(@RequestBody List<User> users) {
userService.batchSave(users);
}

(3)Controller中的同一个方法只能使用@ResponseBody标记一个参数。也即是说无法直接通过该方法同时传递多个对象,不过可以间接通过设置一个中间pojo对象(设置不同的属性)来达到传递多个对象的效果。举例如下:

var buAuthPage = {
buAuth : data,
menuInfo : {code:"100"}
}; $.ajax({
type: "POST",
url: "$!{_index}/buAuth/save5",
data: JSON.stringify(buAuthPage),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){
}
});
public class BuAuthPage {
BuAuth buAuth;
public BuAuth getBuAuth() {
return buAuth;
}
public void setBuAuth(BuAuth buAuth) {
this.buAuth = buAuth;
}
public MenuInfo getMenuInfo() {
return menuInfo;
}
public void setMenuInfo(MenuInfo menuInfo) {
this.menuInfo = menuInfo;
}
} @RequestMapping(value = "buAuth/save5")
@ResponseBody
public String save5(@RequestBody BuAuthPage buAuthPage){
return "SUCCESS";
}

(4)Axios默认的请求数据类型就是application/json

3.2 multipart参数

3.3 接收 header 数据

http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-mvc-request-header/

有时候,需要接收并处理请求头中的数据,此时使用@RequestHeader注解(Controller方法参数)

几种形式:

  • @RequestHeader("User-Agent") String userAgent@RequestHeader("If-Modified-Since") Date date
  • @RequestHeader(value="User-Agent", defaultValue="foo") String userAgent
  • @RequestHeader HttpHeaders headers
  • @RequestHeader Map<String, String> header

也可以使用HttpServletRequestrequest.getHeader("code")

Spring MVC 接受的请求参数的更多相关文章

  1. Spring MVC的Post请求参数中文乱码的原因&处理

    一.项目配置: Spring 4.4.1-RELEASE Jetty 9.3.5 JDK 1.8 Servlet 3.1.0 web.xml文件中没有配置编解码Filter 二.实际遇到的问题:客户端 ...

  2. Spring MVC的映射请求

    一.SpringMVC常用注解 @Controller 声明Action组件 @Service    声明Service组件    @Service("myMovieLister" ...

  3. Spring MVC中forward请求转发2种方式(带参数)

    Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html  

  4. spring mvc 接受多对象的处置

    spring mvc 接受多对象的处理 spring mvc感觉非常好用,尤其是对接收对象參数的自己主动绑定非常简便,但对于同一时候传多个对象时有些困扰. 同一时候项目并没有直接使用spring的fo ...

  5. Spring MVC 异步处理请求,提高程序性能

    原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能? 一个普通 Servle ...

  6. Spring MVC 处理一个请求的流程分析

    Spring MVC是Spring系列框架中使用频率最高的部分.不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分.因此程序员一定要熟练掌握MV ...

  7. 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题

    解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...

  8. spring mvc 文件下载 get请求解决中文乱码问题

    方案简写,自己或有些基础的可以看懂,因为没时间写的那么详细 方案1 spring mvc解决get请求中文乱码问题, 在tamcat中server.xml文件 URIEncoding="UT ...

  9. Spring mvc 启动 和 请求分发

    Spring mvc 启动 和 请求分发 启动加载: abstract class HttpServletBean extends HttpServlet void init() initServle ...

随机推荐

  1. linux日志分析

    转一位大神的笔记. 日志管理: 1.基于服务的 2.基于时间的 /var/log/wtmp,/var/run/utmp,/var/log/lastlog(lastlog),/var/log/btmp( ...

  2. POJ1742Coins

    题目:http://poj.org/problem?id=1742 可以正常地多重背包.但是看了<算法竞赛入门经典>,收获了贪心的好方法. 因为这里只需知道是否可行,不需更新出最优值之类的 ...

  3. JS 响应式布局

    1.media 效果为屏幕宽度变化时,背景颜色也变化 <!DOCTYPE html> <html lang="en"> <head> <m ...

  4. 【jemter】HTTP请求参数化

    HTTP请求参数化:就是把URL的参数项做参数化处理 我们现在要对子猴博客来进行一番压力测试,压力测试对象为随机的几个网页链接,这几个链接是写在一个文本文件中的,在压力测试的时候会随机读取. 1.  ...

  5. Android 对话框(Dialog)大全

    转自: http://www.cnblogs.com/salam/archive/2010/11/15/1877512.html Activities提供了一种方便管理的创建.保存.回复的对话框机制, ...

  6. bzoj3157 3516 国王奇遇记

    Description Input 共一行包括两个正整数N和M. Output 共一行为所求表达式的值对10^9+7取模的值. 特判m=1 m≠1时: 设S[u]=sigma(i^u*m^i) m*S ...

  7. 小峰mybatis(3)mybatis分页和缓存

    一.mybatis分页-逻辑分页和物理分页: 逻辑分页: mybatis内置的分页是逻辑分页:数据库里有100条数据,要每页显示10条,mybatis先把100条数据取出来,放到内存里,从内存里取10 ...

  8. java web程序 html标签中<th>和<td>的用法区别:

    <th>是用于表头式的 <td>是列 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional ...

  9. zufe oj 引水工程( 巧妙地把在i建水设为e[0][i])

    引水工程 时间限制: 3 Sec  内存限制: 128 MB提交: 11  解决: 6[提交][状态][讨论版] 题目描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来 ...

  10. 小甲鱼-013元组tuple:上了枷锁的列表

    1.创建和访问一个元组 1.1创建元组 元组的标志性符号是 , tuple1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) #定义单个元素的元组,要加 , tuple2 = (1 ...