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
* orgsprntextrequestWebRequest or orgsprntextrequestNativeWebRequest 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不相上下
*javautilLocale
用于获得当前的请求区域
*javaioInputStream / javaioReader for access to the requests content This value is the raw InputStream/Reader as exposed by the Servlet API
值为原始的InputStream/Reader被Servlet API 可以借此访问 request 的内容
*javaioOutputStream / javaioWriter for generating the responses content This value is the raw OutputStream/Writer as exposed by the Servlet API
用于产生响应的内容以此操作 response 的内容
*javasecurityPrincipal containing the currently authenticated user
包含当前认证的用户
Spring 增加了一个@ PathVariable注解来支持可变的请求路径
*@PathVariable annotated parameters for access to URI template variables
用于注解参数对应到地址栏的变量参数
例如
Java代码
@RequestMapping(value=/owners/{ownerId} method=RequestMethodGET)
public String findOwner(@PathVariable(ownerId) String ownerId Model model) {
// implementation omitted
}
访问地址/owners/{ownerId} 指定了访问变量名称为ownerId当控制器处理这个请求的时候ownerId的值被设置到请求的地址栏
例如当请求来自/owners/fred值fred被绑定到访问方法的参数String ownerId
*@RequestParam
用于注解参数到Servlet 请求的参数参数值对应到控制器方法中声明的参数
Java代码
@RequestMapping(method = RequestMethodGET)
public String setupForm(@RequestParam(id) int petId ModelMap model) {
Pet pet = thisclinicloadPet(petId)
modeladdAttribute(pet pet)
return petForm;
}
例如请求的参数id对应到方法中的petId
*@RequestHeader
注解参数用于具体的Servlet请求的http头部参数值被转换到生命的方法参数类型
请求头部信息例如ConnectionAcceptLanguageAcceptCharset等
Java代码
public void displayHeaderInfo(@RequestHeader(Connection) String connection@RequestHeader(AcceptEncoding) String encoding) {
Systemoutprintln(connection: + connection)
Systemoutprintln(AcceptEncoding: + encoding)
}
*@RequestBody
*HttpEntity<?>
*javautilMap / orgspringframeworkuiModel / orgspringframeworkuiModelMap
它绑定 Spring MVC 框架中每个请求所创建的潜在的模型对象它们可以被 Web 视图对象访问(如 JSP)用于增强传递到web视图页面的model也就是说他们作为方法的参数后页面视图就可以直接根据key来取得相应的值
springframeworkvalidationErrors / orgspringframeworkvalidationBindingResult
BindingResult继承于Errors为属性列表中的命令/表单对象的校验结果返回错误信息到页面设置为方法参数后在视图页面上可以直接获取
BindingResult result必须和@ModelAttribute同时使用并且参数要紧挨着否则会报错Errors/BindingResult argument declared without preceding model attribute异常
如下例报错 正常
//test:
Java代码
@RequestMapping(params=method=result)
public String processSubmit(User user
Model model BindingResult result) {
return /demo/listBoard;
}
//test:
Java代码
@RequestMapping(params=method=result)
public String processSubmit(@ModelAttribute(user) User user
Model model BindingResult result) {
return /demo/listBoard;
}
//test:
Java代码
@RequestMapping(params=method=result)
public String processSubmit(@ModelAttribute(user) User user
BindingResult resultModel model) {
return /demo/listBoard;
}
* orgspringframeworkwebbindsupportSessionStatus 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 级别的模型属性
Java代码
@RequestMapping(method = RequestMethodPOST)
public String processSubmit(@ModelAttribute Owner owner
BindingResult result SessionStatus status) {//<①
new OwnerValidator()validate(owner result)
if (resulthasErrors()) {
return ownerForm;
}
else {
thisclinicstoreOwner(owner)
statussetComplete()//<②
return redirect:/ownerdo?ownerId= + ownergetId()
}
}
processSubmit() 方法中的 owner 表单对象将绑定到 ModelMap 的owner属性中result 参数用于存放检验 owner 结果的对象
而 status 用于控制表单处理的状态在 ② 处我们通过调用 statussetComplete() 方法
该 Controller 所有放在 session 级别的模型属性数据将从 session 中清空