SpringMVC Controller传递数据到Jsp视图
SpringMVC中 Controller传递数据到Jsp视图有三种常用的方法
- 使用request传递参数 2. 使用Model传递参数 3. 使用ModelAndView传递参数
测试: 1、控制器SendParameterController:
package com.gx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.List;
/** * SpringMVC Controller传递数据到视图 */
@Controller @RequestMapping("/sendParameter")
public class SendParameterController {
@RequestMapping("/index")
public String index(){
return “/sendParameter/index”;
}
//使用request传递参数
@RequestMapping("/byRequest")
public String byRequest(HttpServletRequest request) {
request.setAttribute(“msg”, “byRequest传递”);
List listData=new ArrayList<>(); for (int i=1;i<=10;i++){ listData.add(“String值_”+i);
}
request.setAttribute(“listData”,listData);
return “/sendParameter/result”; }
//使用Model传递参数 @RequestMapping("/byModel")
public String byModel(Model model) {
model.addAttribute(“msg”, “byModel传递”);
List listData=new ArrayList<>(); for (int i=1;i<=10;i++){ listData.add(“String值_”+i);
}
model.addAttribute(“listData”,listData);
return “/sendParameter/result”; }
//使用ModelAndView传递参数 @RequestMapping("/byModelAndView")
public ModelAndView byModelAndView() {
ModelAndView mv =new ModelAndView("/sendParameter/result");
mv.addObject(“msg”, “byModelAndView传递”);
List listData=new ArrayList<>(); for (int i=1;i<=10;i++){ listData.add(“String值_”+i); } mv.addObject(“listData”,listData);
return mv; } }
2、web/WEB-INF/jsp/sendParameter/index.jsp:
3、web/WEB-INF/jsp/sendParameter/result.jsp:
4、测试:
@ModelAttribute、@SessionAttributes与 @SessionAttribute
1、@ModelAttribute @ModelAttribute主要有两种用法:
第一种用法:标注在非功能方法上,每次执行方法时都会先执行@ModelAttribute注解的方法 @ModelAttribute注解的方法可以: ①在参数中获取使用Model,HttpServletRequest,HttpServletResponse等 ②也可以正常获取请求的数据 ③可以向Model、HttpServletRequest中添加数据 若该方法有返回值时:自动把返回的数据添加到Modal中,对于此时的Key值有两种情况 ①如果@ModelAttribute没有指定value值,那么添加的key就是类型名称首字母小写 ②如果指定了value值会在①的基础上额外添加一个,key就是指定的值
第二种用法:用在方法的参数上,将注解的参数添加到Model中,Key值有两种情况 ①若@ModelAttribute未指定value值,那么Key值就是类型名称首字母小写 ②若@ModelAttribute指定value值,那么key值就是指定的值
测试: 1、AtModelAttributeController:
package com.gx.controller; import com.gx.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller @RequestMapping("/atModelAttribute")
public class AtModelAttributeController {
/** * 使用@ModelAttribute注解的方法,返回void
- 在@ModelAttribute注解的方法中也可以
- 1在参数中获取使用Model,HttpServletRequest,HttpServletResponse等
- 2也可以正常获取请求的数据
- 3可以向Model、HttpServletRequest中添加数据 /
@ModelAttribute
public void before1(Model model, HttpServletRequest request,User user){
System.out.println(“before1_执行,user=”+user);
model.addAttribute(“before1KeyM”,“before1到此一游_model”);
request.setAttribute(“before1KeyR”,“before1到此一游_request”); }
/* * 使用@ModelAttribute注解的方法,有返回值时和返回void是基本一致, - 多了一个功能:* 自动把返回的数据添加到Modal中,
- ①如果@ModelAttribute没有指定value值,那么添加的key就是类型名称首字母小写
②如果指定了value值会在①的基础上额外添加一个,key就是指定的值 / @ModelAttribute(“modelAttributeUser”)
//@ModelAttribute
public User before2(Model model, HttpServletRequest request,User user1){
System.out.println(“before2_执行,user=”+user1);
model.addAttribute(“before2KeyM”,“before2到此一游_model”);
request.setAttribute(“before2KeyR”,“before2到此一游_request”);
user1.setUserName(user1.getUserName()+"_before2"); return user1; }
/ * 测试页面 /
@RequestMapping("/index")
public String index(){
return “/atModelAttribute/index”;}
/* * 结果显示页面 - 如果@ModelAttribute注解在参数上的使用,作用如下:
- 将注解的参数添加到Model中,Key值有两种情况
- ①若@ModelAttribute未指定value值,那么Key值就是类型名称首字母小写
*②若@ModelAttribute指定value值,那么key值就是指定的值 */
@RequestMapping("/result")
public ModelAndView result(@ModelAttribute(“myUser”) User myUser){
System.out.println(“result执行__myUser=”+myUser);
ModelAndView mv=new ModelAndView("/atModelAttribute/result"); return mv; } }
2、web/WEB-INF/jsp/atModelAttribute/index.jsp:
3、web/WEB-INF/jsp/sendParameter/result.jsp:
4、测试结果:
2、@SessionAttributes与@SessionAttribute的使用
spring MVC中有两个长得非常像的注解:@SessionAttributes 和 @SessionAttribute。
@SessionAttributes用于在请求之间的HTTP Servlet会话中存储model属性。 它是类型级别的注解,用 于声明特定控制器使用的会话属性。会筛选该控制器下的所有添加到Model中的数据,将符合筛选条件 的数据自动添加到Session中。
@SessionAttribute 用在方法的形参上,从session中获取指定名称的的数据,并把数据给形参参数。 演示案例: 1、AtSessionAttributeOneController:
package com.gx.controller;
import com.gx.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
@RequestMapping("/atSessionAttribute1")
@SessionAttributes(value = {“loginUser”,“login_user”},types = {User.class})
public class AtSessionAttributeOneController {
/** * 登录页面 / @RequestMapping("/login")
public String login(){ return “/atSessionAttribute/login”; }
/* * 模拟登录方法 /
@RequestMapping(value = “/doLogin”,produces = “application/json;charset=utf 8”)
@ResponseBody
public User doLogin(Model model,User user){
System.out.println(“doLogin,user=”+user);
if (user.getUserName()!=null && user.getPassword()!=null){
//模拟用户登录 用户名和密码相同就OK
if (user.getUserName().equals(user.getPassword())){
//配置@SessionAttributes(value = {“loginUser”,“login_user”},types = {User.class})注解
//对应添加到Model中,匹配的数据会直接保存到Session中
model.addAttribute(“loginUser”,user);
model.addAttribute(“login_user”,user);
return user; } }
return null; } }
2、AtSessionAttributeTwoController:
package com.gx.controller;
import com.gx.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttribute;
import javax.servlet.http.HttpSession;
@Controller @RequestMapping("/atSessionAttribute2")
public class AtSessionAttributeTwoController {
/* * 页面 * -@SessionAttribute从session中获取指定名称的的数据,并把数据给形参参数
- required属性默认为true,如果获取的数据不存在——400错误 */
@RequestMapping("/index")
public String index(@SessionAttribute(“loginUser”)User loginUser, @SessionAttribute(“login_user”) User login_user, HttpSession session){
System.out.println(“index;loginUser=”+loginUser);
System.out.println(“index;login_user=”+login_user);
User session_loginUser= (User) session.getAttribute(“loginUser”);
User session_login_user= (User) session.getAttribute(“login_user”);
System.out.println(“index;session_loginUser=”+session_loginUser);
System.out.println(“index;session_loginUser=”+session_loginUser);
return “/atSessionAttribute/index”; } }
3、web/WEB-INF/jsp/atSessionAttribute/login.jsp:
4、web/WEB-INF/jsp/atSessionAttribute/index.jsp: