SpringMVC-Controller控制器
精典讲解文章
http://elim.iteye.com/blog/1753271
@RequestMapping对应的方法支持哪些入参类型
1.HttpServlet 对象(含HttpServletRequest 、HttpServletResponse、HttpSession)这些参数Spring 在调用处理器方法的时候会自动给它们赋值。
2.WebRequest 对象,该对象是Spring针对HttpServletRequest自己封装的,使用该对象可以访问到存放在HttpServletRequest 和HttpSession 中的属性值。
3.HttpServletRequest衍生出来的对象(InputStream、Reader),HttpServletResponse衍生出来的对象(OutputStream、Writer)。
4.使用@PathVariable 、@RequestParam 、@CookieValue 和@RequestHeader 标记的参数。
5.使用@ModelAttribute 标记的参数。
6.Map、ModelMap、Model对象,这些都可以用来封装数据,然后展示给视图。
7.实体类,用来接收页面上提交的参数。
8.MultipartFile对象,Spring自己封装的文件上传对象。
9.Errors、BindingResult 对象,这两个参数必须紧接在需要验证的实体对象参数之后,它里面包含了实体对象的验证结果。
@RequestMapping对应的方法支持哪些返回值类型
1.ModelAndView对象,包含视图名称及数据模型
2.Map、Model、ModelMap对象,视图名称将由RequestToViewNameTranslator 来决定。
3.void类型,这种情况一般是我们直接把返回结果写到HttpServletResponse 中了,如果没有写的话,那么Spring 将会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果视图中需要模型的话,处理方法与返回字符串的情况相同。
4.String类型,往往代表一个视图名称,如果需要向页面传递数据的话,可以加一个模型参数,然后在方法体中向模型添加数据即可。
5.任意类型,但方法上面有@ResponseBody注解,则返回值都会通过HttpMessageConverters 转换之后写到HttpServletResponse 中,而不会像上面的那些情况一样当做视图或者模型来处理。
6.任意类型,但方法上面有@ModelAttribute注解,则返回值会被当作模型处理进行处理,至少模型的属性名如果没有指定,则会根据返回类型的类名称的首字母小写形式来表示。
ModelAndView没有指定View或Model处理
如果没有指定Model属性名规则
1.如果方法的返回值类型为对象(com.xxx.User),则model的属性名为类型首字母小写,即"user"
2.如果方法的返回值类型为数组(com.xxx.User[]),则model的属性名为类型首字母小写+list,即"userList"
3.如果方法的返回值类型为集合(List<com.xxx.User>或Set<com.xxx.User>),则model的属性名为类型首字母小写+list,即"userList",如果集合中的数据类型不一致,则取第一个添加的元素的类型为准。
如果没有指定View规则
当Controller处理器方法没有返回一个View对象或逻辑视图名称,并且在该方法中没有直接往response的输出流里面写数据的时候,Spring就会采用约定好的方式提供一个逻辑视图名称。这个逻辑视图名称是通过Spring定义的org.springframework.web.servlet.RequestToViewNameTranslator接口的getViewName方法来实现的,Spring已经给我们提供了一个它自己的实现,那就是org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator,一般情况下,默认的视图名称与请求的路径是一样的。
@RequestMapping(value="/get/{id}", method = RequestMethod.GET) public Model get(@PathVariable int id, Model model){ String username = userService.getUsernameById(id); model.addAttribute("username", username); return model; }
将log4j中的spring相关日志级别调整为DUBG级别,当请求路径为http://127.0.0.1:8080/flashAttribute/get/2.html时,可以看到输出
2016-12-27 21:49:55,424 [http-8080-1] DEBUG [org.springframework.web.servlet.view.JstlView] - Forwarding to resource [/WEB-INF/jsp/get/2.jsp] in InternalResourceView 'get/2'
也就意味着默认的视图名称为"get/2"