3.2.2 请求处理方法中可出现的参数类型

3.2.2 请求处理方法中可出现的参数类型

每个请求处理方法可以有多个不同类型的参数。
如果需要访问HttpServletRequest对象,则可以添加HttpServletRequest作为参数, Spring会将对象正确地传递给方法:

1
2
3
4
@RequestMapping(value="/login")
public String login(httpServletRequest request){
return "login";
}

如果需要访问HttpSession对象,则可以添加HttpSession作为参数, Spring会将对象正确地传递给方法:

1
2
3
4
@RequestMapping(value="/login")
public String login(HttpSession session){
return "login";
}

可以在请求处理方法中出现的参数类型

下面是可以在请求处理方法中出现的参数类型:

java类型

java.io包

  • java.io.InputStreamjava.io.Reader- java.io.OutputStreamjava.io.Writer

java.util包

  • java.util.Locale
  • java.util.Map

java.security包

  • java.security.PrincipalHttpEntity<?>

javax.servlet包

  • javax.servlet.ServletRequestjavax.servlet.http.HttpServletRequest
  • javax.servlet.ServletResponsejavax.servlet.http.HttpServletResponse
  • javax.servlet.http.HttpSession

Spring类型

validation包

  • org.springframework.validation.Errors,
  • org.springframework.validation.BindingResult

web包

  • org.springframework.web.context.request.WebRequestorg.springframework.web.context.request.NativeWebRequest
  • org.springframework.web.bind.support.SessionStatus
  • org.springframework.web.util.UriComponentsBuilder
  • org.springframework.web.servlet.mvc.support.RedirectAttributes

ui包

  • org.springframework.ui.Model
  • org.springframework.ui.ModelMap

validation包

  • org.springframework.validation.Errors
  • org.springframework.validation.BindingResult

重要类型

WebRequest类

这里重点说明一下org.springframework.web.context.request.WebRequest这个对象。 WebRequestSpring MVC提供的统一请求访问接口,

  1. WebRequest可以访问请求相关数据,如参数数据、
  2. WebRequest可以访问请求头数据,
  3. WebRequest 可以访问请求作用域的数据
  4. WebRequest可以访问会话作用域中的数据

但是WebRequest无法访问Cookie区数据,

NativeWebRequest继承了WebRequest,并提供访问本地Servlet API的方法。

WebRequest重点方法

WebRequest中有如下这些重点方法:

方法 描述
getParameter(String name) 根据请求参数名获取请求参数值。等同于Servlet APIrequest.getParameter(String name)
getHeader(String name) 根据请求头参数名获取请求头参数值,等同于ServletAPIrequest.getHeader(String name)
setAttribute(String name,Object value,int scope) 保存数据到指定的作用域
getAttribute(String name,int scope) 从指定的作用域中提取数据
setAttribute方法

setAttribute方法等同于Servlet APIscope(request,session).setAttribute(String name,Object value)方法。参数中的int scopeWebRequest对象中定义的两个常量SCOPE_REQUEST(请求作用域)、SCOPE_SESSION(会话作用域)

1
2
3
4
// 保存名称为username的值到request作用域
webRequest.setAttribute("username","张三",WebRequest.SCOPE_REQUEST);
// 保存名称为bookname的值到session作用域
webRequest.setAttribute("bookname","高等数学",WebRequest.SCOPE_SESSION);
getAttribute方法

getAttribute方法等同于Servlet APIscope(request,session).getAttribute(String name)方法。

1
2
3
4
// 从request作用域中取出名称为username的值
webRequest.getAttribute("username",WebRequest.SCOPE_REQUEST);
// 从session作用域中取出名称为bookname的值
webRequest.getAttribute("bookname",WebRequest.SCOPE_SESSION);

从框架的无侵入性来说,建议使用WebRequest对象替代Servlet APIHttpServletRequest对象和HttpSession对象。

Model类型

org.springframework.ui.Model是其中最重要的类型。这不是一个Servlet API类型,而是一个Spring MVC类型,其中包含了Map对象用来存储数据。
如果方法中添加了Model参数,则每次调用请求处理方法时, Spring MVC都会创建Model对象,并将其作为参数传递给方法。

可以出现在请求处理方法参数列表中的注解

  • @PathVariable注解、
  • @MatrixVariable注解、
  • @RequestParam注解、
  • @RequestHeader注解、
  • @RequestBody注解、
  • @RequestPart注解