[toc]

SpringMVC处理响应数据

几种途径输出模型数据:

  1. Map
  2. Model
  3. ModelMap
  4. MadelAndView

1. Map 和 Model 以及 ModelMap

SpringMVC除过在方法上传入原生的request和session外还能怎么样把数据带给页面呢?

可以在方法处传入Map、或者Model或者ModelMap

给这些参数里面保存的所有数据都会放在请求域中。这样就可以在页面获取了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* Map,Model,ModelMap:最终都是BindingAwareModelMap在工作;
* 相当于给BindingAwareModelMap中保存的东西都会被放在请求域中;
*
* Map(interface(jdk)) Model(interface(spring))
* || //
* || //
* \/ //
* ModelMap(class) //
* \\ //
* \\ //
* ExtendedModelMap
* ||
* \/
* BindingAwareModelMap
*/
Map

success.jsp页面能拿到username的值 taoge

1
2
3
4
5
6
7
@RequestMapping("/testMap")
public String testMap(Map map){

map.put( "username","taoge" );

return "success";
}
Model

success.jsp页面能拿到username的值 huige

addAttribute

1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping("/testModel")
public String testModel(Model model){
/**
* model = class org.springframework.validation.support.BindingAwareModelMap
* model = org.springframework.validation.support.BindingAwareModelMap
* */
System.out.println( "model = " + model.getClass() );
System.out.println( "model = " + model.getClass().getName() );

model.addAttribute( "username","huige" );

return "success";
}
ModelMap

addAttribute

1
2
3
4
5
6
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("msg", "你好棒!");
System.out.println("modelmap的类型:"+modelMap.getClass());
return "success";
}

2. ModelAndView对象

控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息,而且数据是放在请求域中

  1. 两个重要的成员变量:

    • private Object view; 视图信息
    • private ModelMap model; 模型数据
  2. 添加模型数据:

    • MoelAndView addObject(String attributeName, Object attributeValue) 设置模型数据
    • ModelAndView addAllObject(Map<String, ?> modelMap)
  3. 设置视图:

    • void **setView(**View view) 设置视图对象
    • void setViewName(String viewName) 设置视图名字
  4. 获取模型数据

    • protected Map<String, Object> getModelInternal() 获取模型数据
    • public ModelMap getModelMap()
    • public Map<String, Object> getModel()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  
/*
* ModelAndView对象一共就两个属性需要研究
* //View instance or view name String
* private Object view ;
*
* //Model Map
* private ModelMap model;
*
* ModelAndView中的方法:
* */

@RequestMapping("/user")
public ModelAndView testModelAndView(){

//创建一个模型视图对象
ModelAndView mv = new ModelAndView();

//设置模型
mv.addObject( "username","taoge" ); //实质上存放到request域中

//设置视图名称
mv.setViewName( "success" );

return mv;
}

3. SpringMVC中的重定向和转发

关于重定向和转发

  • 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,即经过视图解析器处理。

  • 如果返回的字符串中带 forward: redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理

    • redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
    • forward:success.jsp:会完成一个到 success.jsp 的转发操作
1
2
3
4
5
6
7
8
9
10
@RequestMapping("/testRedirect")
public String testRedirect(Model model){

model.addAttribute( "username","weige" );
//转发 request
return "forward:/WEB-INF/views/ok.jsp";

//重定向
//return "redirect:/index.jsp";
}