zoukankan      html  css  js  c++  java
  • SpringMVC之数据传递二

    上一篇学习了从url或view中传数据到Controller中,今天学习下数据从Controller传到view中,主要有4种。

    一、ModelAndView

    处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据。

        @RequestMapping(value = "/testModelAndView",method = RequestMethod.GET)
        public ModelAndView testModelAndView(HttpServletRequest request, HttpServletResponse response){
            
            String viewName = "Hello";//视图名
            ModelAndView modelAndView = new ModelAndView(viewName);
            User user=new User();
            user.setName("cuiyw");
            user.setPwd("testModelAndView");
            user.setBirthday(new Date());
            modelAndView.addObject("name","cyw");
            modelAndView.addObject("user",user);
            return modelAndView;
        }

    二、Model/Map/ModelMap

    入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 Java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中

        @RequestMapping(value = "/testModel.do",method = RequestMethod.GET)
        public String testModel(Model model){
              User user=new User();
              user.setName("cuiyw");
              user.setPwd("testModel");
              user.setBirthday(new Date());
              model.addAttribute("name","cyw");
              model.addAttribute("user",user);
              return "Hello";
        }
    
        @RequestMapping(value = "/testMap.do",method = RequestMethod.GET)
        public String testMap(Map<String,Object> map){
              User user=new User();
              user.setName("cuiyw");
              user.setPwd("testMap");
              user.setBirthday(new Date());
              map.put("name","cyw");
              map.put("user",user);
              return "Hello";
        }

    上面两个我们都可以使用下面的html访问变量。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    姓名:${user.name}<br>
    密码:${user.pwd}<br>
    出生日期:${user.birthday}<br>
    名字:${name}<br>
    名字:${requestScope.name}<br>
    姓名:${requestScope.user.name}<br>
    </body>
    </html>

    三、@SessionAttributes

     将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性,比如我们登录之后可能会存登录信息,就可以使用它。@SessionAttributes这个注解只能放到类的上面。

    @SessionAttributes({"user"})
    @Controller
    @RequestMapping("/hello")
    public class HelloController {

    这里我们将上面的user存到HttpSession中,我们可以在jsp中验证一下。

    这里我们在html中加入SessionAttributes:${sessionScope.user.name}。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    姓名:${user.name}<br>
    密码:${user.pwd}<br>
    出生日期:${user.birthday}<br>
    名字:${name}<br>
    名字:${requestScope.name}<br>
    姓名:${requestScope.user.name}<br>
    SessionAttributes:${sessionScope.user.name}
    </body>
    </html>
    View Code

    当我们访问http://localhost:8080/WebMVC/hello/testModelAndView时,jsp输出结果如下.

    下面定义了一个testSessionAttributes,它里面什么都没有,只有返回Hello。当我们再访问它时http://localhost:8080/WebMVC/hello/testSessionAttributes.do,会有下图的结果。可以看到jsp中名字部分是没有值得,因为@SessionAttributes({"user"}),这只设置了user,对name没设置。

        @RequestMapping(value = "/testSessionAttributes.do",method = RequestMethod.GET)
        public String testSessionAttributes(HttpServletRequest request, HttpServletResponse response){
              return "Hello";
        }

     四、@ModelAttribute

    SpringMVC在每次调用请求处理方法时,都会创建Model类型的一个实例。如果准备使用此实例,则可以在方法中添加一个Model类型的参数,在上面的testModel方法就是这样使用的。它可以用@ModelAttribute来注释方法参数:带有@ModelAttribute注解的方法会将其输入或创建的参数对象添加到Model对象中(若方法中没有显式添加)。也可以用@ModelAttribute标注一个非请求的处理方法(有返回值,无返回值):被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。

    1.@ModelAttribute注释方法参数

        @RequestMapping(value = "/testModelAttribute.do",method = RequestMethod.GET)
        public String testModelAttribute(HttpServletRequest request, HttpServletResponse response,@ModelAttribute("user")User user,@ModelAttribute("name")String name,Model model){
              user.setName("cuiyw");
              user.setPwd("testModelAttribute");
              user.setBirthday(new Date());
              name="testModelAttribute";
              model.addAttribute("name", name);
              return "Hello";
        }

    这里有个奇怪的地方,假如不传name的话,model也可以不用写在参数中,在函数中设置user的值在页面就能获取到,但是如果传入String类型的参数,那它就需要加入model这个参数,并要显示的设置才能在jsp中获取,这个暂时还不知道为什么。

    2.@ModelAttribute标注一个非请求的处理方法

    由于被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。我们可以做个测试。

    1)、有返回值

    这里定义了一个map方法,并被标注为 @ModelAttribute(value = "mymap"),返回值是Map<String,Object>,在函数里面我们设置了user和name.

        @RequestMapping(value = "/testSessionAttributes.do",method = RequestMethod.GET)
        public String testSessionAttributes(HttpServletRequest request, HttpServletResponse response){
              return "Hello";
        }
        
        @ModelAttribute(value = "mymap")
        public Map<String,Object> map() {
          User user=new User();
          user.setName("cuiyw");
          user.setPwd("ModelAttribute");
          user.setBirthday(new Date());
          HashMap<String, Object> map=new HashMap<String, Object>();
          map.put("name","cyw");
          map.put("user",user);
          return map;
        }
        
        
        @RequestMapping(value = "/testMethodModelAttribute.do",method = RequestMethod.GET)
        public String testModelAttribute(HttpServletRequest request, HttpServletResponse response){
              return "Hello";
        }

    我们在页面获取值,这里要注意,其实在 map()方法中是省略了一句,model.addAttribute("mymap", map);它对应的是mymap,所以在jsp中不能直接访问user和name。需要通过mymap来访问,我们之前设置的@SessionAttributes({"user"})这里也就不会有值了。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    姓名:${mymap.user.name}<br>
    密码:${mymap.user.pwd}<br>
    出生日期:${mymap.user.birthday}<br>
    名字:${mymap.name}<br>
    名字:${requestScope.mymap.name}<br>
    姓名:${requestScope.mymap.user.name}<br>
    SessionAttributes:${sessionScope.user.name}
    </body>
    </html>

    如果我们想将里面的user设置为sessionAttribute,我们可以@SessionAttributes({"user","mymap"}),SessionAttributes:${sessionScope.mymap.user.name}来获取。

    2)、无返回值

     若方法返回一个void类型,则还必须自行将实例添加到Model中。

        @ModelAttribute
        public void voidmap(Model model) {
          User user=new User();
          user.setName("cuiyw3");
          user.setPwd("ModelAttribute3");
          user.setBirthday(new Date());
          HashMap<String, Object> map=new HashMap<String, Object>();
          map.put("name","cyw3");
          map.put("user",user);
          model.addAttribute("mymap",map);
        }

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/5ishare/p/8849429.html
Copyright © 2011-2022 走看看