Table of Contents
1:可以在方法处传入Map、或者Model或者ModelMap。
1:@SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
2:解决方法:希望有个方法可以直接先从数据库中查出来这个值;然后放在更新方法上
一:如何将数据带回到前端
1:可以在方法处传入Map、或者Model或者ModelMap。
给这些参数里面保存的所有数据都会放在请求域中。可以在页面获取* 关系:* Map,Model,ModelMap:最终都是BindingAwareModelMap在工作;* 相当于给BindingAwareModelMap中保存的东西都会被放在请求域中;
代码:
@RequestMapping("/res01")
public String res01(Map map){
map.put("msg","hello1");
return "success";
}
@RequestMapping("/res02")
public String res02(Model model){
model.addAttribute("msg","hello2");
return "success";
}
@RequestMapping("/res03")
public String res03(ModelMap modelMap){
modelMap.addAttribute("msg","hello3");
return "success";
}
前端页面展示:
<h1>成功!</h1>
<h1>pageScope:${pageScope.msg}</h1>
<h1>requestScope:${requestScope.msg}</h1>
<h1>sessionScope:${sessionScope.msg}</h1>
<h1>applicationScope:${applicationScope.msg}</h1>
2:方法的返回值可以变为ModelAndView类型;
/**
* 返回值是ModelAndView;可以为页面携带数据,也可以指定视图名
* @return
*/
@RequestMapping("/res04")
public ModelAndView res03(){
之前的返回值我们就叫视图名;视图名视图解析器是会帮我们最终拼串得到页面的真实地址;
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
mv.addObject("msg","hello4");
return mv;
}
结果与上述相同;ModelAndView也是将数据放在请求域中
二:向Session中保存数据
1:@SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。
@SessionAttributes(value = "msg")
当给map中保存的数据,或者给ModelAndView中保存的数据,同同时,都给Serssion中保存一份;
@SessionAttributes(value = {"msg","haha"})
可以向session中存储多个值
- @SessionAttributes(types={String.class})
可以按照字段类型向session中存储值
2:利用原生Api(Http)
导包:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
代码:
@RequestMapping("/res05")
public ModelAndView res05(){
javax.servlet.http.HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
session.setAttribute("msg","123");
//之前的返回值我们就叫视图名;视图名视图解析器是会帮我们最终拼串得到页面的真实地址;
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
mv.addObject("msg","hello4");
return mv;
}
或者:
@RequestMapping("/res06")
public ModelAndView res06(HttpServletRequest httpServletRequest){
httpServletRequest.getSession().setAttribute("msg","456");
//之前的返回值我们就叫视图名;视图名视图解析器是会帮我们最终拼串得到页面的真实地址;
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
mv.addObject("msg","hello4");
return mv;
}
三:利用@ModelAttribute隐含模型
1:当前台传送一个对象时,没传的值就为空
2:解决方法:希望有个方法可以直接先从数据库中查出来这个值;然后放在更新方法上
3:@ModelAttribute注解实例代码;
1:可以定义在参数上:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。
2:可以定义在方法上:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
实例代码:
@Controller
public class ModelAttributeController {
@RequestMapping(value = "/moda01",method = RequestMethod.POST)
public String mod01(@ModelAttribute("book") Book book,Model model){
System.out.println("book:"+book);
return "success";
}
@ModelAttribute
public void modelAttribute(String name, Model model){
System.out.println("name:"+name);
Book book = new Book(name,1,"aaa");
System.out.println("book:"+book);
model.addAttribute("book",book);
}
}