第一部分:Action输入参数
Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法。Spring MVC方法可以接受的参数包含:
  1.1)基本数据类型,如int,String,double...
  1.2)自定义数据类型,如自定义的pojo对象
  1.3)Servlet API中的Request和Response。如:ServletRequest或HttpServletRequest。
  1.4)Session对象。如:HttpSession。注意此对象不是线程安全的,可设置RequestMappingHandlerAdapter的 “synchronizeOnSession”属性为true来同步。
  1.5)org.springframework.web.context.request.WebRequest或org.springframework.web.context.request.NativeWebRequest。
  1.6)java.util.Locale对象。需要在Servlet环境中配置 LocaleResolver。
  1.7)java.io.InputStream / java.io.Reader用于访问请求输入流。
  1.8)java.io.OutputStream / java.io.Writer用于生成的输出流。
  1.9)java.security.Principal用于保存当前的认证用户。
  1.10)@PathVariable注解的参数。
  1.11)@MatrixVariable注解的参数。
  1.12)@RequestParam注解的请求参数。
  1.13)@RequestHeader注解的请求头参数。
  1.14)@RequestBody注解的请求体参数。
  1.15)@RequestPart注解的上传文件请求体参数。请求类型为”multipart/form-data”。
  1.16)HttpEntity<?>:请求实体对象,可以访问头信息和内容体。
  1.17)java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap:用于响应模型类,存储响应数据。
  1.18)org.springframework.web.servlet.mvc.support.RedirectAttributes:用于在redirect的重定向中传递数据。
  1.19)命令或 表单对象。
  1.20)org.springframework.validation.Errors / org.springframework.validation.BindingResult对象。
  1.21)org.springframework.web.bind.support.SessionStatus可以用来控制Session的清理。
  1.22)org.springframework.web.util.UriComponentsBuilder可以用来查询当前请求的主机名、端口号、Schema、Context Path、Servlet Mapping信息。

1、基本数据类型
方法的参数可以是任意基本数据类型,如果方法参数名与http中请求的参数名称相同时会进行自动映射。
  public String index(Model model, int id, String name) {

  }

2、自定义数据类型
Spring MVC会通过反射把请求中的参数设置到自定义类型的对象中。
  public String index(Model model, Member member) {

  }

3、集合类型
Spring MVC中不能直接在方法的参数中使用集合类型(List 和 Map),必须使用集合类型的包装类。
  //人员集合
  public class MemberList {
    private List<Member> items;

    public List<Member> getItems() {
      return items;
    }

    public void setItems(List<Member> items) {
      this.items = items;
    }
  }
然后使用
  public String index(Model model, MemberList members) {

  }

4、使用@RequestParam注解的请求参数。
    @RequestMapping(value="/index.do")
    public String index(@RequestParam(value="code", required=true) String code,@RequestParam(value="pwd", required=true) String pwd, ModelMap model) {
      Member member = authService.validate(code,pwd);
      model.addAttribute("member", member);
      return "index";
    }
使用 @RequestParam 可以处理一些细节逻辑,如默认值、是否必须、别名等。

5、使用@RequestBody注解的请求体参数。
  @RequestMapping(value="/index.do", method = RequestMethod.PUT)
  public void index(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
  }

  由HttpMessageConverter来转换body至对象。它可以被转换成支持的任意类型。 RequestMappingHandlerAdapter 默认的支持有:
    5.1)ByteArrayHttpMessageConverter :byte[]转换。
    5.2)StringHttpMessageConverter :转换成String。
    5.3)FormHttpMessageConverter :转换成MultiValueMap<String, String>。
    5.4)SourceHttpMessageConverter :转换成javax.xml.transform.Source。
  转换的参数还可以加上@Valid注解,以进行转换校验,如果校验失败将抛出MethodArgumentNotValidException,此异常默认情况由 DefaultHandlerExceptionResolver进行管理,将会向客户端发送400错误码。

6、使用HttpEntity<?>
  @RequestMapping(value="/index.do")
  public ResponseEntity<String> index(HttpEntity<byte[]> requestEntity) throws Exception {
    String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader");
    byte[] requestBody = requestEntity.getBody();
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyResponseHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
  }

7、使用@ModelAttribute

  @ModelAttribute使用在方法上,就相当于一个公共model池一样(前提是在同一个Controller中),在同一个Controller中,所有@RequestMapping注解的方法执行前,都要先执行这些由@ModelAtrribute注解的方法,将数据存入到当前请求的Model中。它可以单个添加属性,也可以批量地添加。
  @ModelAttribute
  public void bindModel(@RequestParam String code,@RequestParam String pwd, Model model){
    model.addAttribute(authService.validate(code,pwd));
  }

  @ModelAttribute使用在方法参数上,被注解的参数会先从请求的Model中查找,如果未找到,则会实例化一个新对象,放入请求的Model中。
  查找路径:
    存在于@SessionAttributes中。
    存在于同一个Controller中的注解于方法级别上的@ModelAttribute中。
    Url的模式匹配和转换中。
  @RequestMapping(value="/member/{member}", method = RequestMethod.PUT)
  public void bind(@ModelAttribute("member") Member member){

  }

8、使用@SessionAttributes
在Controller类上使用此注解,会从请求的model中查找@SessionAttributes指定的属性名或属性类型,将它们保存到Session中。
  /**
  * @功能 权限控制器
  * @作者 Davee.Yuan
  * @日期 2017-01-16
  * @说明 http://localhost:8080/auth/index
  */
  @Controller
  @RequestMapping("/sso")
  @SessionAttributes("member")
  public class SsoController{

  }

9、使用@RedirectAttributes
  方法的签名中指定一个RedirectAttributes 类型的参数,用于在请求返回 RedirectView时传递数据。
  @RequestMapping(value="/redirect.do")
  public String redirect(RedirectAttributes attr){
    attr.addAttribute("status",9999);
    return "redirect:/toLogin";
  }

10、使用@CookieValue
  @RequestMapping(value="/display.do")
  public String display(@CookieValue("JSESSIONID") String cookie){
    //---------------------
    return "";
  }

第二部分:类型转换
  Spring MVC控制器接收到的原始请求数据都是文本类型,而先前使用的@RequestParam、@CookieValue等注解的参数可以为String类型,也可以是其它,Spring默认支持一些简单的数据类型如int、long、Date等类型的自动转换,如果需要对自定义的类型或复杂类型进行转换的话,需要自定义转换器绑定。绑定的方式有两种:局部绑定、全局绑定(它还有两种实现形式):

  局部绑定:在@Controller中使用@InitBinder注解方法进行转换器的绑定,用它绑定的方法返回类型应设置成void,方法参数WebDataBinder集合了WebRequest和java.util.Locale,它可以将转换器绑定至Context中:
  @InitBinder
  public void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
  }
全局绑定:一种方式是实现一个WebBindingInitializer 接口类,将它绑定至全局配置中,如实现类ClinicBindingInitializer:
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="cacheSeconds" value="0" />
    <property name="webBindingInitializer">
      <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />
    </property>
  </bean>

全局绑定:另一种方式是使用@InitBinder注解于@ControllerAdvice注解的类中,来实现全局绑定

内容主要来自于:https://blog.zenfery.cc/archives/131.html?replytocom=14

Spring MVC之Action输入参数的更多相关文章

  1. Spring MVC 接受的请求参数

    目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...

  2. Spring MVC 接收Json格式参数

    今天做了一个关于表格排序的功能,可以通过右边的箭头做排序操作,每次操作需要通过Ajax将每条记录的Id数组作为参数去发送请求, 后台Spring MVC接到参数后作更改序号操作. 前端页面发送请求的代 ...

  3. Spring MVC之Action返回类型

    Spring MVC支持的方法返回类型 1)ModelAndView 对象.包含Model和View对象,可以通过它访问@ModelAttribute注解的对象. 2)Model 对象.仅包含数据访问 ...

  4. SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数

    在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...

  5. Spring MVC 中的输入验证 Vlidator

    在 Spring MVC 中有两种方式可以验证输入:1. Spring 自带的验证框架:2. 利用 JSR 303 实现,即 Java Specification Requests Converter ...

  6. Spring MVC 不能正常获取参数的值

    最近在开发时遇到一个非常奇怪的问题,在tomcat8中使用Spring MVC框架,在Controller中的方法参数无法正常获取到相应的值,将tomcat版本换成7.0就解决了. 记录以下解决过程, ...

  7. spring mvc 如何传递集合参数(list,数组)

    spring mvc 可以自动的帮你封装参数成为对象,不用自己手动的通过request一个一个的获取参数,但是这样自动的参数封装碰碰到了集合参数可能就需要点小技巧才可以了. 一.基础类型和引用类型有什 ...

  8. Spring MVC(七)--传递JSON参数

    有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...

  9. spring mvc 编写处理带参数的Controller

    在上一随笔记录的基础上,现记录编写处理带有参数的Controller. @Controller //这个注解会告知<context:component:scan> 将HomeControl ...

随机推荐

  1. scull_p_read()函数分析

    /* * Data management: read and write */ static ssize_t scull_p_read (struct file *filp, char __user ...

  2. HDU 1686 Oulipo(KMP+计算匹配成功次数)

    一开始总是超时,后来发现还是方法没找对,这个跟普通KMP不太一样的就是,KMP匹配成功的时候会完全跳过已经匹配成功的匹配段,至少我掌握的是.那么如何避免这样的问题呢,举个栗子啊 原串为ABABA,模式 ...

  3. js 基础对象二

    大的分类 JavaScript 对象 JS Array JS Boolean JS Date JS Math JS Number JS String JS RegExp JS Functions JS ...

  4. android activity四种启动模式

    1.standard <activity android:name=".MainActivity" android:launchMode="standard&quo ...

  5. Java程序员的10道XML面试题 (转)

    包括web开发人员的Java面试在内的各种面试中,XML面试题在各种编程工作的面试中很常见.XML是一种成熟的技术,经常作为从一个平台到其他平台传输数据的标准.XML面试问题包括用于转换XML文件的X ...

  6. [转]Linux下CodeBlocks的交叉编译

    原文链接:http://blog.sina.com.cn/s/blog_602f87700100kujh.html Sam一直是Makefile流,这些天需要移植一些游戏引擎模块.这些模块在其它嵌入式 ...

  7. bat脚本:自动压缩n天前的文件【转载】

    原文如下: bat脚本:自动压缩n天前的文件-中原小伙-ChinaUnix博客http://blog.chinaunix.net/uid-24946452-id-1651762.html     磁盘 ...

  8. Linux SCP命令复制传输文件的用法

    SCP命令是用户通过网络将一台Linux服务器的文件复制到另一台Linux服务器,方法如下: 一:从本地复制到远程 复制文件: 命令格式: scp local_file remote_username ...

  9. CASpringAnimation

    iOS9新出现的 /** Subclass for mass-spring animations. */ @interface CASpringAnimation : CABasicAnimation ...

  10. USACO Section 1.2 Name That Number 解题报告

    题目 题目描述 在一个农场里面,每一头牛都有一个数字编号,但是现在这些牛不喜欢这种编号,它们想把这些数字编号转化成为可以接受的字母的形式.数字与字母的转换表如下: 2: A,B,C 5: J,K,L ...