请求处理方法的参数类型和返回类型
在控制器类中,每一个请求处理方法都可以有多个不同类型的参数,以及一个多种类型的返回结果。例如在入门案例中,handleRequest()方法的参数就是对应请求的HttpServletRequest和HttpServletResponse两种参数类型。除此之外,还可以使用其他的参数类型,例如在请求处理方法中需要访问HttpSession对象,则可以添加HttpSession作为参数,Spring会将对象正确的传递给方法,其使用示例如下:
@RequestMapping(value="/firstController")
public ModelAndView (**HttpSession session**){
...
return mav;
}
在请求处理方法中,可以出现的参数类型如下:
● javax.servlet.ServletRequest / javax.servlet.http.HttpServletRequest
● javax.servlet.ServletResponse / javax.servlet.http.HttpServletResponse
● javax.servlet.http.HttpSession
● org.springframework.web.context.request.WebRequest或
org.springframework.web.context.request.NativeWebRequest
● java.util.Locale
● java.util.TimeZone (Java 6+) / java.time.ZoneId (on Java 8)
● java.io.InputStream / java.io.Reader
● java.io.OutputStream / java.io.Writer
● org.springframework.http.HttpMethod
● java.security.Principal
● @PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、@RequestPart、@SessionAttribute、@RequestAttribute注解
● HttpEntity<?>
● java.util.Map / org.springframework.ui.Model /org.springframework.ui.ModelMap
● org.springframework.web.servlet.mvc.support.RedirectAttributes
● org.springframework.validation.Errors /org.springframework.validation.BindingResult
● org.springframework.web.bind.support.SessionStatus
● org.springframework.web.util.UriComponentsBuilder
需要注意的是,org.springframework.ui.Model类型不是一个Servlet API类型,而是一个包含了Map对象的Spring MVC类型。如果方法中添加了Model参数,则每次调用该请求处理方法时,Spring MVC都会创建Model对象,并将其作为参数传递给方法。
在入门案例中,请求处理方法返回的是一个ModelAndView类型的数据。除了此种类型外,请求处理方法还可以返回其他类型的数据。Spring MVC所支持的常见方法返回类型如下:
● ModelAndView
● Model
● Map
● View
● String
● void
● HttpEntity<?>或ResponseEntity<?>
● Callable<?>
● DeferredResult<?>
在上述所列举的返回类型中,常见的返回类型是ModelAndView、String和void。其中ModelAndView类型中可以添加Model数据,并指定视图;String类型的返回值可以跳转视图,但不能携带数据;而void类型主要在异步请求时使用,它只返回数据,而不会跳转视图。
由于ModelAndView类型未能实现数据与视图之间的解耦,所以在企业开发时,方法的返回类型通常都会使用String。既然String类型的返回值不能携带数据,那么在方法中是如何将数据带入视图页面的呢?这就用到了上面所讲解的Model参数类型,通过该参数类型,即可添加需要在视图中显示的属性。
返回String类型方法的示例代码如下:
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) {
// 向模型对象中添加数据
model.addAttribute("msg", "这是我的第一个Spring MVC程序");
// 返回视图页面
return "/WEB-INF/jsp/first.jsp";
}
在上述方法代码中,增加了一个Model类型的参数,通过该参数实例的addAttribute()方法即可添加所需数据。
String类型除了可以返回上述代码中的视图页面外,还可以进行重定向与请求转发,具体方式如下。
1. redirect重定向
例如,在修改用户信息操作后,将请求重定向到用户查询方法的实现代码如下:
@RequestMapping(value="/update")
public String update(HttpServletRequest request,
HttpServletResponse response, Model model){
...
// 重定向请求路径
return "redirect:queryUser";
}
2. forward请求转发
例如,用户执行修改操作时,转发到用户修改页面的实现代码如下:
@RequestMapping(value="/toEdit")
public **String** update(HttpServletRequest request,
HttpServletResponse response, Model model){
...
// 请求转发
return "forward:editUser";
}
关于重定向和转发的具体使用,后面章节中会有具体的应用案例,由于篇幅有限,这里就不再过多介绍。