SpringMVC-Controller控制器

精典讲解文章

http://elim.iteye.com/blog/1753271

 

@RequestMapping对应的方法支持哪些入参类型

1.HttpServlet 对象(含HttpServletRequestHttpServletResponseHttpSession)这些参数Spring 在调用处理器方法的时候会自动给它们赋值。

2.WebRequest 对象,该对象是Spring针对HttpServletRequest自己封装的,使用该对象可以访问到存放在HttpServletRequest 和HttpSession 中的属性值。

3.HttpServletRequest衍生出来的对象(InputStreamReader),HttpServletResponse衍生出来的对象(OutputStreamWriter)。

4.使用@PathVariable @RequestParam@CookieValue@RequestHeader 标记的参数。

5.使用@ModelAttribute 标记的参数。

6.MapModelMapModel对象,这些都可以用来封装数据,然后展示给视图。

7.实体类,用来接收页面上提交的参数。

8.MultipartFile对象,Spring自己封装的文件上传对象。

9.ErrorsBindingResult 对象,这两个参数必须紧接在需要验证的实体对象参数之后,它里面包含了实体对象的验证结果。

 

@RequestMapping对应的方法支持哪些返回值类型

1.ModelAndView对象,包含视图名称及数据模型

2.MapModelModelMap对象,视图名称将由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"

posted @ 2017-05-07 17:28  天上云朵  Views(453)  Comments(0)    收藏  举报