/**
* 目标方法的返回值可以是ModelAndView类型 其中可以包含视图和模型信息
* SpringMVC会把ModelAndView的model中数据放入到request域对象中。
*
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
ModelAndView modelAndView = new ModelAndView(SUCCESS);
// 将模型数据添加到ModelAndView中
modelAndView.addObject("time", new Date());
return modelAndView;
}
1.SpringMVC的Handler方法可以支持ServletAPI的哪些原生的参数类型
/**
* 可以使用Servlet原生的API作为目标方法的参数,具体支持以下类型
* HttpServletRequest
* HttpServletResponse
* HttpSession
* java.security.Principal
* Locale
* InputStream
* OutputStream
* Reader
* Writer
*
*
*/
@RequestMapping("testServletAPI")
public void testServletAPI(HttpServletRequest request,HttpServletResponse response,Writer out) throws IOException{
System.out.println("test testServletAPI: "+request+" ----"+response);
out.write("testServletAPI finished!");
// return SUCCESS;
}
2.处理模型数据
2.1ModelAndView
/**
* 目标方法的返回值可以是ModelAndView类型 其中可以包含视图和模型信息
* SpringMVC会把ModelAndView的model中数据放入到request域对象中。
*
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
ModelAndView modelAndView = new ModelAndView(SUCCESS);
// 将模型数据添加到ModelAndView中
modelAndView.addObject("time", new Date());
return modelAndView;
}
2.2Map及Model
/**
* 目标方法可以添加Map类型(实际上也可以是Model类型或ModelMap类型)的参数
* 开发的时候比较常用
* @param map
* @return
*/
@RequestMapping("testMap")
public String testMap(Map<String, Object> map){
map.put("names", Arrays.asList("tom","lily","james"));
return SUCCESS;
}
2.3 SessionAttributes
<span style="white-space:pre"> </span>/**
* 在@Controller上加上@SessionAttributes(value={"user"},types={String.class}), 只能放到类上,不能放在方法上
* 其中,value对应的键(user)会被既放到RequestScope中,也会被放到SessionScope中
* types则表示对应的对象(String)类型会被既放到RequestScope中,也会被放到SessionScope中
*/
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String, Object> map) {
map.put("user", new User("zhangsan", "123456", "zhangsan@qq.com", 18));
map.put("school", "yuduzhongxue");
return SUCCESS;
}
2.4ModelAttribute
/**
* 有@ModelAttribute注解修饰的方法会在每个目标方法执行之前被SpringMVC调用
* @param id
* @param map
*/
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false)Integer id,Map<String, Object> map) {
if(id!=null){
// 模拟从数据库中获取user对象
User user = new User(1, "Tom", "123456", "tom@qq.com", 88);
System.out.println("从数据库中模拟获取一个User对象 : "+user);
map.put("user", user);
}
}
<span style="white-space:pre"> </span>/**
* 产生500异常的话,将类上的SessionAttributes去掉即可--〉org.springframework.web.
* HttpSessionRequiredException: Session attribute 'user' required - not
* found in session
* 执行流程:
* 1.执行@ModelAttribute注解修饰的方法:从数据库中取出对象,把对象放入到了Map中,键为user
* 2.SpringMVC从Map中取出user对象,把表单获取的参数赋值给对应的user对象属性,
* 3.SpringMVC把上述对象传入目标方法的参数。
*
* 注意:在@ModelAttribute修饰的方法中,放入到Map时的健需要与目标方法入参类型的第一个字母小写的字符串一致。(user)
*/
@RequestMapping("/testModelAttributes")
public String testModelAttributes(User user) {
System.out.println("test testModelAttributes: " + user);
return SUCCESS;
}
HTML代码
<!--
模拟修改操作
1.原始数据为:1,tom,123456,tom@qq.com,12
2.密码不能修改
3.表单回显,模拟操作直接在表单填写对应的属性值
-->
<form action="/first/testModelAttributes" method="post">
<input name="id" value="1" type="hidden" /><br>
userName:<input name="username" value="tom" type="text" /><br>
<!-- password:<input name="password" value="123456" type="password" /><br>
email:<input name="email" value="tom@qq.com" type="text" /><br> -->
age:<input name="age" value="18" type="text" /><br>
<input value="Submit" type="submit" /><br>
</form>
<br>
入参全过程
源码分析