Spring MVC 模型数据解析
JSP 四大作用域对应的内置对象:pageContext、request、session、application。
模型数据的绑定是由 ViewResolver 来完成的,实际开发中,我们需要先添加模型数据,再交给 ViewResolver 来绑定。
Spring MVC 提供了以下几种方式添加模型数据:
-
Map
-
Model
-
ModelAndView
-
@ModelAttribute
-
@SessionAttribute
将模式数据绑定到 request 对象
其实以下方法的目的都是将模式数据绑定到 request 对象。有的直接存入request ,有的间接而已。
1,Map
map会自动封装进去view视图???
@RequestMapping("/map")
public String map(Map<String,User> map){
User user = new User();
user.setId(1L);
user.setName("张三");
map.put("user",user);
return "view";
}
JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %> 表示忽略el表达式
<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
@RequestMapping("/test")
public ModelAndView test(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",user);
modelAndView.setViewName("view");
return modelAndView;
}
@RequestMapping("/test2")
public ModelAndView test2(){
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("/test3")
public ModelAndView test3(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView("view");
modelAndView.addObject("user",user);
return modelAndView;
}
@RequestMapping("/test4")
public ModelAndView test4(){
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("/test5")
public ModelAndView test5(){
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("/test6")
public ModelAndView test6(){
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("/test7")
public ModelAndView test7(){
User user = new User();
user.setId(1L);
user.setName("张三");
ModelAndView modelAndView = new ModelAndView("view","user",user);
return modelAndView;
}
@RequestMapping("/test8")
public ModelAndView test8(){
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表示在业务方法return之前会被调用,专门用来返回要填充到模型数据中的对象。将对象放入request对象中
@ModelAttribute
public User getUser(){ // 得到pojo对象
User user = new User();
user.setId(1L);
user.setName("张三");
return user;
}
@ModelAttribute
public void getUser(Map<String,User> map){ // 得到Map对象
User user = new User();
user.setId(1L);
user.setName("张三");
map.put("user",user);
}
@ModelAttribute
public void getUser(Model model){ // 得到Model对象
User user = new User();
user.setId(1L);
user.setName("张三");
model.addAttribute("user",user);
}
- 业务方法中无需再处理模型数据,只需返回视图即可。
@RequestMapping("/test")
public String test(){
return "view";
}
将模型数据绑定到 session 对象
1、直接使用原生的 Servlet API。
@RequestMapping("/testSession") //从request中取session
public String testSession(HttpServletRequest request){
HttpSession session = request.getSession();
User user = new User();
user.setId(1L);
user.setName("张三");
session.setAttribute("user",user);
return "view";
}
@RequestMapping("/testSession2") //直接获取session
public String testSession2(HttpSession session){
User user = new User();
user.setId(1L);
user.setName("张三");
session.setAttribute("user",user);
return "view";
}
2、@SessionAttribute
@SessionAttributes(value = {"user","address"})
public class ViewHandler { //注意这里是给类加注解
}
对于 ViewHandler 中的所有业务方法,只要向 request 中添加了 key = “user”、key = “address” 的对象时,Spring MVC 会自动将该数据添加到 session 中,保存 key 不变。
@SessionAttributes(types = {User.class,Address.class})
public class ViewHandler {
}
对于 ViewHandler 中的所有业务方法,只要向 request 中添加了数据类型是 User 、Address 的对象时,Spring MVC 会自动将该数据添加到 session 中,保存 key 不变。
将模型数据绑定到 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";
}
乱码
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/</url-pattern> 这里写成/*
</filter-mapping>