p6 处理模型数据,及ModelAttribute等注解的使用
1.处理模型数据
如果跳转时需要带数据:V、M,则可以使用以下方式:
ModelAndView、ModelMap 、Map、Model -数据放在了request作用域
@SessionAttributes、@ModelAttribute
示例:
public String testModel(Model model| Map<String,Object> m) {
m.put(x,".."); 就会将x对象 放入request域中
如何将上述数据放入session中?@SessionAttributes(..)
@ModelAttribute
i.经常在 更新时使用
ii.在不改变原有代码的基础之上,插入一个新方法。
通过@ModelAttribute修饰的方法 ,会在每次请求前先执行;
并且该方法的参数map.put()可以将 对象 放入 即将查询的参数中;
必须满足的约定:
map.put(k,v) 其中的k 必须是即将查询的方法参数 的首字母小写
testModelAttribute(Student xxx) ,即student;
如果不一致,需要通过@ModelAttribute声明。如下:
@ModelAttribute//在任何一次请求前,都会先执行@ModelAttribute修饰的方法
public void queryStudentById(Map<String,Object> map) {
//StuentService stuService = new StudentServiceImpl();
//Student student = stuService.queryStudentById(31);
//模拟调用三层查询数据库的操作
Student student = new Student();
student.setId(31);
student.setName("zs");
student.setAge(23);
map.put("stu", student) ;//约定:map的key 就是方法参数 类型的首字母小写
}
//修改:Zs-ls
@RequestMapping(value="testModelAttribute")
public String testModelAttribute(@ModelAttribute("stu")Student student) {
student.setName(student.getName());//将名字修改为ls
System.out.println(student.getId()+","+student.getName()+","+student.getAge());
return "success";
}
一个Servlet 对应一个功能:
增删改查 对应于 4个Servlet
更新: Servlet - SpringMVC的Controller
查询
@ModelAttribute
public void query()
{
}
修改
public String update()
{
}
@ModelAttribute会在 该类的每个方法执行前 均被执行一次,因为使用时需要注意。
springMVCHandler.java 修改部分
@RequestMapping(value="testModelAndView")
public ModelAndView testModelAndView() {//ModelAndView:既有数据,又有视图
//ModelAndView:Model -M View-V
ModelAndView mv = new ModelAndView("success");//view: views/success.jsp
Student student = new Student() ;
student.setId(2);
student.setName("zs");
mv.addObject("student", student);//相当于request.setAttribute("student", student);
return mv;
}
@RequestMapping(value="testModelMap")
public String testModelMap(ModelMap mm) {//success
Student student = new Student() ;
student.setId(2);
student.setName("zs");
mm.put("student2", student);//request域
return "success"; //view
}
@RequestMapping(value="testMap")
public String testMap(Map<String,Object> m) {
Student student = new Student() ;
student.setId(2);
student.setName("zs");
m.put("student3", student);//request域
return "success";
}
@RequestMapping(value="testModel")
public String testModel(Model model) {
Student student = new Student() ;
student.setId(2);
student.setName("zs");
model.addAttribute("student4",student);//request域
return "success";
}
@ModelAttribute//在任何一次请求前,都会先执行@ModelAttribute修饰的方法
//@ModelAttribute 在请求 该类的各个方法前 均被执行的设计是基于一个思想:一个控制器 只做一个功能
public void queryStudentById(Map<String,Object> map) {
//StuentService stuService = new StudentServiceImpl();
//Student student = stuService.queryStudentById(31);
//模拟调用三层查询数据库的操作
Student student = new Student();
student.setId(31);
student.setName("zs");
student.setAge(23);
// map.put("student", student) ;//约定:map的key 就是方法参数 类型的首字母小写
map.put("stu", student) ;//约定:map的key 就是方法参数 类型的首字母小写
}
//修改:Zs-ls
@RequestMapping(value="testModelAttribute")
public String testModelAttribute(@ModelAttribute("stu")Student student) {
student.setName(student.getName());//将名字修改为ls
System.out.println(student.getId()+","+student.getName()+","+student.getAge());
return "success";
}
index.jsp修改部分
<br/>
<a href="handler/testModelAndView">testModelAndView</a>
<br/>
<br/>
<a href="handler/testModelMap">testModelMap</a>
<br/>
<br/>
<a href="handler/testMap">testMap</a>
<br/>
<br/>
<a href="handler/testModel">testModel</a>
<br/>
<br/>
<a href="handler/testI18n">testI18n</a>
<br/>
<form action="handler/testModelAttribute" method="post">
编号:<input name="id" type="hidden" value="31" />
姓名:<input name="name" type="text" />
<input type="submit" value="修改">
</form>