SpringMVC模型数据解析
SpringMVC模型数据解析
jsp四大作用域对应的内置对象:pageContext,request,session,application.
模型数据的绑定是由ViewResolver来完成的,实际开发过程中,我们需要先添加模型数据,再交给·ViewResolver来绑定。
Spring MVC提供了以下几种方式添加模型数据:
- Map
- Model
- ModelAndView
- @SessionAttribute
- @ModelAttribute
map的使用
控制类
package com.soutwind.controller;
import com.soutwind.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller
@RequestMapping("/view")
public class ViewHandler {
@RequestMapping("/map")
public String map(Map<String,User> map){//map中key值类型是string,value值类型是User
User user = new User();
user.setId(1L);
user.setName("张三");
//通过map把user对象传给view视图,并且把user放到request里面。map的key作为request的key,map的
//map的value作为request的value。页面的request里面会存在一个KEY值为user,value值为user对象的数据。
map.put("user",user);
//如果只是单纯的返回视图没啥意义,需要把user对象的内容传给视图。
return "view";
}
}
jsp:
<%--
Created by IntelliJ IDEA.
User: DELL
Date: 2023/2/12
Time: 10:15
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>
<%--el表达式输出user对象--%>
${requestScope.user}
</body>
</html>
2.model
@RequestMapping("/model")
public String model(Model model){
//导入包 import org.springframework.ui.Model;ui就是用户接口。
User user = new User();
user.setId(1L);
user.setName("李四");
//model原理同map。
//业务方法里会向model里面存一个对象,来到视图,他会把model里面的值
//以键值对的形式存储到request里面,再通过jsp的标签取出。
model.addAttribute("user",user);
return "view";
}
3.modelAndView
@RequestMapping("/modelAndView")
public ModelAndView modelAndView(){
User user = new User();
user.setId(1L);
user.setName("王五");
//modelandview相当于model和view的整合
// model.addAttribute("user",user);
// return "view";把这两行代码的操作整合到ModelandView里面。
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相当于model和view的整合
// model.addAttribute("user",user);
// return "view";把这两行代码的操作整合到ModelandView里面。
ModelAndView modelAndView2= new ModelAndView();
modelAndView2.addObject("user",user);
//View是一个接口,请求地址是物理地址
View view = new InternalResourceView("/view.jsp");
//modelandView应用非常灵活。
modelAndView2.setView(view);//这里传过去的是一个view对象。
return modelAndView2;
}
//modelandView的优化。
@RequestMapping("/modelAndView3")
public ModelAndView modelAndView3(){
User user = new User();
user.setId(1L);
user.setName("周七");
//modelandview相当于model和view的整合
// model.addAttribute("user",user);
// return "view";把这两行代码的操作整合到ModelandView里面。
ModelAndView modelAndView = new ModelAndView("view");
modelAndView.addObject("user",user);
// modelAndView.setViewName("view");在创建modelAndView里面就可以给View的名字它赋值。
return modelAndView;
}
@RequestMapping("/modelAndView4")
public ModelAndView modelAndView4(){
User user = new User();
user.setId(1L);
user.setName("吕八");
//modelandview相当于model和view的整合
// model.addAttribute("user",user);
// return "view";把这两行代码的操作整合到ModelandView里面。
View view = new InternalResourceView("/view.jsp");
ModelAndView modelAndView= new ModelAndView("view");
modelAndView.addObject("user",user);
//View是一个接口,请求地址是物理地址
//modelandView应用非常灵活。
// modelAndView.setView(view);//这里传过去的是一个view对象。
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);
// View view = new InternalResourceView("/view.jsp");
ModelAndView modelAndView= new ModelAndView("view",map);
modelAndView.addObject("user",user);
//View是一个接口,请求地址是物理地址
// modelAndView.setView(view);//这里传过去的是一个view对象。
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);
// modelAndView.addObject("user",user);
//View是一个接口,请求地址是物理地址
// modelAndView.setView(view);//这里传过去的是一个view对象。
return modelAndView;
}
@RequestMapping("/modelAndView7")
public ModelAndView modelAndView7(){
User user = new User();
user.setId(1L);
user.setName("哈十一");
ModelAndView modelAndView= new ModelAndView("view","user",user);
// modelAndView.addObject("user",user);
//View是一个接口,请求地址是物理地址
// modelAndView.setView(view);//这里传过去的是一个view对象。
return modelAndView;
}
上述方法的添加是先放到model里面,再添加到request里面。也可以直接向request里面添加。
4.也可以直接向request里面添加。
@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修饰的方法要先于@RequestMapping修饰的方法执行。
@ModelAttribute
public User getUser(){
User user = new User();
user.setId(1L);
user.setName("张十三");
return user;
}
@RequestMapping("/modelAttribute")
public String modelAttribute(){
return "view";
}