一、Servlet API
1.Spring MVC可以使用Servlet API作为请求方法的参数。
- HttpServletRequest
- HttpServletResponse
- HttpSession
- Local
- InputStream
- OutputStream
- Read
- Write
示例:将ServletAPI作为方法的参数,方法中就可以使用api所对应的方法。
@RequestMapping("/test")
public String test(HttpServletRequest request,HttpServletResponse response,
HttpSession session) {
// 向request中存放数据。
request.setAttribute("key", "value");
return "test"; // 返回视图名称
}
处理模型数据
Spring MVC提供一下几种途径返回模型数据:
1.ModeAndView:将处理方法的返回类型设置为ModeAndView,方法体即可通过该模型对象添加模型数据。
2.Map及Model形参:当形参为Map,Model,ModelMap时,处理方法返回时,Map中的数据会自动添加到模型中。
3.@SessionAttributes:将模型中的某个属性存储到Session中,以便多个请求之间共享这个属性。
4.@ModelAttribute:方法形参标记该注解后,形参对象就会放到模型中。
一、ModelAndView
1)控制器处理方法如果返回ModelAndView,即包含视图信息,也包含模型信息。
2)构造方法
提供了多种构造方法的重载
3)添加模型数据:
ModelAndView addObject(String attributeName, Object attributeValue);
ModelAndView addAllObjects(Map<String, ?> modelMap) ;
4)添加视图
void setView(View view);
void setViewName(String viewName);
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//set方法添加视图
/*ModelAndView mav = new ModelAndView();
mav.setViewName("test");*/
// 构造方法添加视图
ModelAndView modelAndView = new ModelAndView("hello");
//添加单个值
modelAndView.addObject("h","Hello Spring MVC");
return modelAndView;
}
Map形式
1)Spring MVC在内部使用了一个Model接口存储模型数据。
2)Spring MVC在调用方法前会创建一个隐含的模型对象作为数据模型的存储容器。如果传入的参数为Map或者Model类型,SpringMVC会自动将对象保存到模型数据中。
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){
map.put("key", "value");
return "test";
}
@SessionAttributes(将数据存入session)
1)如果希望在多个请求之间共享某个模型的数据,则可以在控制器类上标注一个@SessionAttributes,SpringMVC会将对应的属性存储到Session中。
2)@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些类型放到Session中。
@SessionAttributes(types=User.class) :将隐含模型中所有类型为User性添加到Session中。
@SessionAttributes(value={“user1”,“user2”}):将user1对象和user2放入Session中。
@SessionAttributes(types={User.class,Dept.class})
@SessionAttributes(value={“user1”,“user2”},types={Dept.class}):
@SessionAttributes只能用来修饰类。
示例:
1)保存用户到Session中
// 会将类中所有的String类型的变量存入session
// @SessionAttributes(types= {String.class})
// 会将该类中变量名为user的变量都存入session
@SessionAttributes("user")
@Controller
@RequestMapping("world")
public class HelloWorld {
@RequestMapping("/testSession")
public String testSession(Map<String,Object> map){
User user = new User();
user.setUsername("zhangsan");
user.setUserpass("123");
user.setAge(20);
map.put("user", user);
return "hello";
}
}
@SessionAttributes注解只能放在类的前面,而不能放在方法前。
@ModelAttribute
1.在方法定义上定义@ModelAttribute注解:
1)SpringMVC调用方法前,会逐个调用方法上标注了@ModelAttributes的方法。
2)将@ModelAttributes中的属性保存到map中,可以在执行表单提交生成对象之前,替换执行方法同名的形参。
2.在方法的形参上定义@ModelAttribute注解:
1)可以从隐含对象中获取隐含的模型中获取对象,再将请求参数绑定到对象中,再传入形参。
2)将方法形参对象添加到模型中。
@ModelAttribute
public User getUser(){
User user = new User();
System.out.println("调用 getUser 方法");
//默认保存名字为类名首字母小写的user对象到Request中
return user;
}
@ModelAttribute
public void getUserById(Integer id,Map<String,Object> map){
User myuser = new User();
map.put("myuser", myuser);
//手动指定user对象的名称,到Request中
System.out.println("调用 getUser 方法");
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("user")User user){
System.out.println(user);
return "hello";
}
由@SessionAttributes引发的异常
1.当类使用@SessionAttributes修饰,而方法中使用了和SessionAttributes修饰同名的映射参数,确没有添加@ModelAttribute修饰时,则会报错。
2.解决方案
1)参数前使用@ModelAttribute修改映射的名称。
2)和@SessionAttributes中的名称不同。