`
flyer2010
  • 浏览: 358423 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring MVC学习之四:方法入参的介绍

阅读更多
  Spring MVC 框架中你可以按任意顺序定义请求处理方法的入参(除了 Errors 和 BindingResult 必须紧跟在命令对象/表单参数后面以外),Spring MVC 会根据反射机制自动将对应的对象通过入参传递给请求处理方法。这种机制让开发者完全可以不依赖 Servlet API 开发控制层的程序,当请求处理方法需要特定的对象时,仅仅需要在参数列表中声明入参即可,不需要考虑如何获取这些对象,下面列举下spring mvc支持的处理方法参数。

* Java 基本数据类型 和String
默认情况下将按名称匹配的方式绑定到 URL 参数上,可以通过 @RequestParam 注解改变默认的绑定规则

* Request or response objects (Servlet API).
Request或者response 对象 (Servlet API),选择任意的request或者response类型,例如:ServletRequest 、 HttpServletRequest.

* Session object (Servlet API).
session对象(Servlet API):构成类型有HttpSession,这个类型的参数增强了当前通信的session,因此,这个参数永远不会null.
注意:session通道不是线程安全的,特别是在Servlet环境下,如果允许多个请求访问session的情况下建议将AnnotationMethodHandlerAdapter的synchronizeOnSession属性设置为"true"

* org.springframework.web.context.request.WebRequest or org.springframework.web.context.request.NativeWebRequest. Allows for generic request parameter access as well as request/session attribute access, without ties to the native Servlet/Portlet API.
使用spring封装的WebRequest或者NativeWebRequest,与使用原生的Servlet/Portlet API不相上下。

*.java.util.Locale
用于获得当前的请求区域。

*.java.io.InputStream / java.io.Reader for access to the request's content. This value is the raw InputStream/Reader as exposed by the Servlet API.
值为原始的InputStream/Reader被Servlet API 可以借此访问 request 的内容

*.java.io.OutputStream / java.io.Writer for generating the response's content. This value is the raw OutputStream/Writer as exposed by the Servlet API.
用于产生响应的内容,以此操作 response 的内容

*.java.security.Principal containing the currently authenticated user.
包含当前认证的用户。

*.@PathVariable annotated parameters for access to URI template variables
用于注解参数对应到地址栏的变量参数
例如:
@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable("ownerId") String ownerId, Model model) {
  // implementation omitted
}

访问地址"/owners/{ownerId}" 指定了访问变量名称为ownerId,当控制器处理这个请求的时候,ownerId的值被设置到请求的地址栏,
例如:当请求来自/owners/fred,值fred被绑定到访问方法的参数String ownerId

*.@RequestParam
用于注解参数到Servlet 请求的参数,参数值对应到控制器方法中声明的参数。
@RequestMapping(method = RequestMethod.GET)
    public String setupForm(@RequestParam("id") int petId, ModelMap model) {
        Pet pet = this.clinic.loadPet(petId);
        model.addAttribute("pet", pet);
        return "petForm";
    }

例如:请求的参数id对应到方法中的petId.

*.@RequestHeader
注解参数用于具体的Servlet请求的http头部,参数值被转换到生命的方法参数类型。
请求头部信息例如:Connection,Accept-Language、Accept-Charset等
public void displayHeaderInfo(@RequestHeader("Connection") String connection,@RequestHeader("Accept-Encoding") String encoding) {
        System.out.println("connection:" + connection);
        System.out.println("Accept-Encoding:" + encoding);
}


*.@RequestBody

*.HttpEntity<?>

*.java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap
它绑定 Spring MVC 框架中每个请求所创建的潜在的模型对象,它们可以被 Web 视图对象访问(如 JSP).用于增强传递到web视图页面的model,也就是说他们作为方法的参数后,页面视图就可以直接根据key来取得相应的值。

*.org.springframework.validation.Errors / org.springframework.validation.BindingResult
BindingResult继承于Errors,为属性列表中的命令/表单对象的校验结果,返回错误信息到页面,设置为方法参数后,在视图页面上可以直接获取。
BindingResult result必须和@ModelAttribute同时使用,并且参数要紧挨着。否则会报错。Errors/BindingResult argument declared without preceding model attribute异常。
如下例:1、2报错; 3正常。
//test:1
@RequestMapping(params="method=result1")
public String processSubmit1(User user,
    Model model, BindingResult result) {
    return "/demo1/listBoard";
}

//test:2
@RequestMapping(params="method=result2")
public String processSubmit2(@ModelAttribute("user") User user,
        Model model, BindingResult result) {
    return "/demo1/listBoard";
}

//test:3
@RequestMapping(params="method=result3")
public String processSubmit3(@ModelAttribute("user") User user,
        BindingResult result,Model model) {
    return "/demo1/listBoard";
}


* org.springframework.web.bind.support.SessionStatus status handle for marking form processing as complete, which triggers the cleanup of session attributes that have been indicated by the @SessionAttributes annotation at the handler type level.

可以通过该类型 status 对象显式结束表单的处理,这相当于触发 session 清除其中的通过 @SessionAttributes 定义的属性
例子:使用 SessionStatus 控制 Session 级别的模型属性
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Owner owner,
BindingResult result, SessionStatus status) {//<——①
    new OwnerValidator().validate(owner, result);
    if (result.hasErrors()) {
        return "ownerForm";
    }
    else {
        this.clinic.storeOwner(owner);
        status.setComplete();//<——②
        return "redirect:/owner.do?ownerId=" + owner.getId();
    }
}

processSubmit() 方法中的 owner 表单对象将绑定到 ModelMap 的“owner”属性中,result 参数用于存放检验 owner 结果的对象,
而 status 用于控制表单处理的状态。在 ② 处,我们通过调用 status.setComplete() 方法,
该 Controller 所有放在 session 级别的模型属性数据将从 session 中清空。
分享到:
评论

相关推荐

    SpringMvc学习笔记

    本篇学习笔记将带你逐步了解Spring MVC的核心概念、工作流程以及如何配置开发环境。 1. **Spring MVC简介** Spring MVC与Struts2等同属表现层框架,它们的主要任务是协调控制器、模型和视图,处理用户请求并展示...

    Spring + SpringMVC + Mybatis总结,同步博客中的pdf文档

    IoC 是Spring 的核心机制之一,它改变了对象创建的方式。在传统的开发模式中,对象的创建由调用者负责,而在Spring 中,对象的创建工作交给了IoC容器,容器根据配置文件创建并管理对象,然后按需将对象传递给调用者...

    spring MVC中接口参数解析的过程详解

    在处理请求时,Spring MVC的`DispatcherServlet`负责分发请求,它通过`doDispatch`方法找到对应的Controller方法和参数。 在不添加`@RequestBody`的情况下,Spring MVC会尝试从请求中直接获取参数。对于没有注解的...

    spring源码合集spring源码合集

    6. **推断构造方法源码解析**:"09-Spring之推断构造方法源码解析-周瑜"讨论了Spring如何选择合适的构造函数来实例化Bean,这对于实现无参和有参构造函数的自动匹配至关重要。 7. **Bean生命周期源码解析**:"05-...

    spring中所需要的知识点及学习方向文档

    总的来说,学习Spring应从其核心概念、配置文件解析、IoC和AOP机制、MVC框架等方面入手,同时关注Spring与其他技术如JDBC、MyBatis、Hibernate的集成,以及Spring Boot和Spring Cloud等高级话题,以便全面掌握Spring...

    spring boot 1.2.3,spring framework4.1.6,mybatis,lombok,oracle的一个sample

    **Spring Boot 1.2.3** Spring Boot是Spring框架的一个扩展,旨在简化Spring应用程序的初始搭建以及开发过程。在1.2.3版本中,它提供了以下关键特性: 1. **自动配置**: Spring Boot通过`@EnableAutoConfiguration...

    JSP源码——jsp+servlet+javaBean实现MVC_jspmvc.zip

    JavaBean通常是属性私有、带有公共getter和setter方法、无参构造器以及符合JavaBeans规范的序列化和事件处理功能。 **4. MVC模式工作原理** - **Model**:模型层负责业务逻辑和数据处理,它不关心视图如何显示数据...

    spring-sample:春天的MVC样本

    总的来说,“spring-sample”项目提供了一个全面的学习平台,让开发者能够深入了解Spring MVC和Hibernate的协同工作方式,以及如何在电商环境中应用它们。通过对这个项目的分析和实践,可以提升开发者在Java Web开发...

    spring笔记

    - **Set方法注入**:最常用的方式之一,通过setter方法将属性值注入。 - **构造器注入**:在构造器中完成依赖注入。 - **接口注入**:通过实现特定接口进行注入,但在Spring中较少使用。 - **复杂类型属性注入**...

    Spring开发笔记

    Spring 是一个广泛使用的Java应用程序框架,它以依赖注入(Dependency Injection,DI)和面向切面编程...在实际开发中,还需要学习Spring的AOP、事务管理、数据访问集成、MVC框架、WebSocket支持以及其他高级特性。

    企业Spring(学Java都会用到的轻量框架)

    IOC,即Inversion of Control,是Spring的核心特性之一。它通过反转对象的创建和管理方式,将对象的创建权交给Spring容器,而不是由对象自身负责。这使得组件之间的依赖关系不再硬编码,而是通过配置文件或注解来...

    springBoot+mybatis.rar

    3. **入参校验**: - **JSR-303/JSR-349 Bean Validation**:Spring Boot支持使用JSR标准进行参数验证,通过`@Validated`注解和具体的验证注解(如`@NotNull`, `@Size`等)来校验输入参数。 - **自定义验证注解**...

    SpringMVC是Spring家族的一款专注于解决控制器层问题的框架技术,学习资料第一天

    SpringMVC中的收参机制可以通过控制器方法的入参形式收集请求参数,包括: * 八种基本数据类型和字符串类型 * 日期类型接收 * 自定义对象类型的接收 * List集合类型的接收 八、处理POST请求提交的中文乱码 处理...

    spring图书管理系统.zip

    1. **MVC设计模式**:Spring MVC是Spring框架的一部分,用于构建Web应用。模型(Model)负责业务逻辑,视图(View)负责展示数据,控制器(Controller)处理用户请求并协调Model和View。 2. **单例模式**:Spring...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_5_常用注解 共22页.pptx

    #### 四、SpringMVC_3_方法入参 - **基本类型参数**:直接通过方法参数接收前端传来的数据。 - **POJO对象参数**:将前端表单数据自动绑定到POJO对象中。 - **路径变量**:通过`@PathVariable`注解接收URL中的路径...

    spring学习笔记

    IOC,即控制反转,是Spring框架的核心概念之一。在传统的程序设计中,对象之间的依赖关系通常由对象自身来维护,而在使用IOC的情况下,这种控制权被反转,对象的创建和管理交由Spring容器来负责。这降低了对象间的...

    day01-SpringMVC入门.doc

    Spring MVC 前后端入参和出参 - **@RequestParam**:用于从请求参数中获取值。 - **@PathVariable**:用于获取URL模板变量的值。 - **@ModelAttribute**:用于绑定请求参数到模型对象,也可以用于返回视图模型。 ...

    HelloSpring:Spring学习笔记-2020年8月6日10点10分

    依赖注入是Spring的核心特性之一,它允许组件之间的关系在运行时被决定,而不是硬编码在组件内部。DI有两种方式:设值注入和构造器注入。设值注入通过setter方法注入依赖,而构造器注入则是在创建Bean实例时传入依赖...

    struts2 spring hibernate 课件

    - **JavaBeans规范**:JavaBean是Java类的一种特殊形式,具有公共的、具体的方法和无参构造器。通过getter和setter方法,JavaBean暴露其内部状态,以便于数据的读取和修改。 【Spring框架解析】 Spring是全面的...

Global site tag (gtag.js) - Google Analytics