Spring MVC 接受的请求参数

[TOC]

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")

时间: 2024-08-04 10:42:33

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

spring mvc 接受多对象的处置

spring mvc 接受多对象的处理 spring mvc感觉非常好用,尤其是对接收对象參数的自己主动绑定非常简便,但对于同一时候传多个对象时有些困扰. 同一时候项目并没有直接使用spring的formtag. 从网上学来的多对象传值.自己优化了下,原文找不到出处了这里记录下. 首先声明一个注解类,用于对传值对象的声明 /** * 处理spring mvc 对象绑定注解 * */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy

Spring源码阅读:Spring MVC 如何处理HTTP请求

Spring MVC 对HTTP请求的处理流程 通过之前的源码阅读,知道了ApplicationContext初始的过程,也知道了Spring MVC环境的初始化过程,今天就来了解一下SpringMVC是如何处理HTTP请求的. HTTP请求根据请求方式可以分为GET.POST.PUT.DELETE.OPTIONS.TRACE,最常用的还是GET和POST. Spring对于这几种HTTP请求的处理都是使用了processRequest(req,rep); @Override protected

spring mvc 编写处理带参数的Controller

在上一随笔记录的基础上,现记录编写处理带有参数的Controller. @Controller //这个注解会告知<context:component:scan> 将HomeController自动检测为一个Bean@RequestMapping("/home")  //这是根Urlpublic class HomeController {        private UserService userService;        @Autowired    public

Spring MVC(二) HTTP请求数据的绑定

HTTP请求数据的绑定 通过注解绑定 @RequestParam-->绑定请求参.@RequestHeader-->绑定请求头参数.@CookieValue-->绑定Cookie的值.@PathVariable-->绑定URL中的 示例: @RequestMapping(value="/handle2")public String handle2(@CookieValue("JSESSIONID") String sessionId,@Req

spring mvc对异步请求的处理

在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001

Spring MVC 处理HTTP请求的整体流程

DispatcherServlet是一个前端控制器,是整个Spring MVC框架的核心组件.它在接收HTTP请求之后,根据请求调用Spring MVC中的各个组件. 常用接口及其含义: 1. Controller:被@Controller修饰的类是控制器类. 2. HandlerMapping:将用户请求映射到控制器. 3. HandlerInterceptor:拦截指定格式的URL请求. 4. ModelAndView:控制器处理完请求后,将视图的逻辑名称和模型数据封装成ModelAndVi

Spring MVC(三)--控制器接受普通请求参数

Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数名称和pojo属性一致即可: 注解方式:当前端参数名和控制器名称不一致时可以使用注解方式,比如前端是param_id,而控制器中是paramId的情况: URL方式:当前端以restful格式传递参数时,后台使用这种方式接受: JSON方式:前后端如果用json方式交互时,可以使用这种方式,这是常用

五、Spring MVC实用POJO进行参数传值

前面已经说了,spring mvc可以通过@PathVariable可以把url中的值映射到目标方法的参数上,也可以使用@RequestParam进行单个参数的传递,如果一次需要传递多个参数的话,就需要写多个相应的注解,那有没有什么更简单方便的方法呢?答案是有的,spring mvc有自动装箱的功能,可以通过参数的name属性,给后台绑定的对象的对应的属性完成赋值操作,而且还支持级联操作,即支持嵌套. 1.使用POJO(Plain Old Java Object)进行参数传值 下面来看一下具体例

spring mvc处理ios 请求头不全时空参 无法解析的问题处理

ios前端比较懒~囧~~,还有已安装的app用户 ,不愿意更新等问题 导致 请求头无法补全给服务端springmvc发送过来.....悲剧了 只能服务端自己处理这个不全的http请求空参无法解析的问题 尝试处理方法 1     增加springmvc过滤器对请求进行过滤(失败) 测试发现在访问控制层匹配请求地址之前就已经报错,应该是dispatcher那里出了问题 虽然失败, 把代码配置贴出来~~ applicationContext.xml <mvc:interceptors>