模型数据解析
我们通过JSP表单在客户端页面提交了一个对象信息,再将该对象信息显示在客户端页面上,这就是模型数据解析。
JSP的四大作用域对应的内置对象
pageContext、request、session、application
模型数据能够绑定到requeat、seesion、application三个对象中,下面代码会一一实现。在绑定模型数据之前,我们先写一个view.jsp,用来提交我们的模型数据。
模型数据的绑定是由ViewResolver来完成的,在实际开发中,我们需要先添加模型数据,再交给ViewResolver来绑定。
SpringMVC提供了以下几种方式添加模型数据
- Map
- Model
- ModelAndView
- @SessionAttribute
- @ModelAttribute
(1)将模型数据绑定到request对象
1、Map
业务方法
@RequestMapping("/map")
public String map(Map<String,User> map){
User user = new User();
user.setId(1L);
user.setName("张三");
map.put("user",user);
return "view"; //将逻辑视图,通过ModelAndView解析成物理视图
}
JSP
<%--
Created by IntelliJ IDEA.
User: ASUS
Date: 2020/2/29
Time: 22:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--不要忽略EL表达式,不加这个,可能无法解析$el表达式-->
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.user}
</body>
</html>
2、Model
业务方法
@RequestMapping("/model")
public String model(Model model){
User user = new User();
user.setId(1L);
user.setName("张三");
model.addAttribute("user",user);
return "view";
}
3、ModelAndView
业务方法(由于ModelAndView的含参数构造有很多,所以可以写出很多中功能一样的业务方法,他们的本质是一样的)
@RequestMapping("modelAndView")
public ModelAndView modelAndView(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",user);
modelAndView.setViewName("view");
return modelAndView;
}
@RequestMapping("modelAndView2")
public ModelAndView modelAndView2(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",user);
View view = new InternalResourceView("/view.jsp");
modelAndView.setView(view);
return modelAndView;
}
@RequestMapping("modelAndView3")
public ModelAndView modelAndView3(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView("view");
modelAndView.addObject("user",user);
return modelAndView;
}
@RequestMapping("modelAndView4")
public ModelAndView modelAndView4(){
User user = new User();
user.setId(1L);
user.setName("张三");
View view = new InternalResourceView("/view.jsp")
ModelAndView modelAndView = new ModelAndView(view);
modelAndView.addObject("user",user);
return modelAndView;
}
@RequestMapping("modelAndView5")
public ModelAndView modelAndView5(){
User user = new User();
user.setId(1L);
user.setName("张三");
Map<String,User> map = new HashMap<>();
map.put("user",user);
ModelAndView modelAndView = new ModelAndView("view", map);
return modelAndView;
}
@RequestMapping("modelAndView6")
public ModelAndView modelAndView6(){
User user = new User();
user.setId(1L);
user.setName("张三");
Map<String,User> map = new HashMap<>();
map.put("user",user);
View view = new InternalResourceView("/view.jsp");
ModelAndView modelAndView = new ModelAndView(view,map);
return modelAndView;
}
@RequestMapping("modelAndView7")
public ModelAndView modelAndView7(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView("view","user",user);
return modelAndView;
}
@RequestMapping("modelAndView8")
public ModelAndView modelAndView8(){
User user = new User();
user.setId(1L);
user.setName("张三");
View view = new InternalResourceView("/view.jsp");
ModelAndView modelAndView = new ModelAndView(view,"user",user);
return modelAndView;
}
4、HttpServletRequest
业务方法
@RequestMapping("/request")
public String request(HttpServletRequest request){
User user = new User();
user.setId(1L);
user.setName("张三");
request.setAttribute("user",user);
return "view";
}
5、@ModelAttribute
定义一个方法,该方法专门用来返回要填充到模型数据的对象
@ModelAttribute注解的方法总是在业务方法执行之前执行
/**
* 该方法用来返回模型数据的对象
* @ModelAttribute 该注解注解的方法总是在返回视图的业务方法之前执行
*/
@ModelAttribute
public User getUser(){
User user = new User();
user.setId(1L);
user.setName("张三");
return user;
}
@ModelAttribute
public void getUser(Map<String,User> map){
User user = new User();
user.setId(1L);
user.setName("张三");
map.put("user",user);
}
@ModelAttribute
public void getUser(Model model){
User user = new User();
user.setId(1L);
user.setName("张三");
model.addAttribute("user",user);
}
业务方法
/**
* 业务方法无需处理模型数据,只需要返回视图即可
* @return
*/
@RequestMapping("/modelAttribute")
public String modelAttribute(){
return "view";
}
(2)将模型数据绑定到session对象
1、直接使用原生的ServletAPI
@RequestMapping("/session")
public String session(HttpServletRequest request){
HttpSession session = request.getSession();
User user = new User();
user.setId(1L);
user.setName("张三");
session.setAttribute("user",user);
return "view";
}
@RequestMapping("/session2")
public String session2(HttpSession session){
User user = new User();
user.setId(1L);
user.setName("张三");
session.setAttribute("user",user);
return "view";
}
2、@SessionAttribute
对于ViewHandler中的所有业务方法,只要向request中添加了key=“user”、key="address"的对象时,SpringMVC会自动将该数据添加到session中,保持key不变。
/**
* 对于 ViewHandler 中的所有业务⽅法,只要向 request 中添加了
* key = "user"、key = "address" 的对象时,Spring MVC 会⾃动将该数据添加到 session 中,保存 key 不变。
*/
@SessionAttributes(value = {"user","address"})
public class ViewHandler(){
}
对于 ViewHandler 中的所有业务⽅法,只要向 request 中添加了数据类型是 User 、Address 的对象
时,Spring MVC 会⾃动将该数据添加到 session 中,保存 key 不变。
/**
* 对于 ViewHandler 中的所有业务⽅法,只要向 request 中添加了
* 数据类型是 User 、Address 的对象时,Spring MVC 会⾃动将该数据添加到 session 中,保存 key 不变。
*/
@SessionAttributes(types = {User.class,Address.class})
public class ViewHandler1 {
}
(3)将模型数据绑定到 application 对象
@RequestMapping("/application")
public String application(HttpServletRequest request){
ServletContext application = request.getServletContext();
User user = new User();
user.setId(1L);
user.setName("张三");
application.setAttribute("user",user);
return "view"; }
来源:CSDN
作者:Startbing
链接:https://blog.csdn.net/qq_39813000/article/details/104584128