zoukankan      html  css  js  c++  java
  • SpringMVC中Controller返回页面的几种姿势

    要实现Controller返回数据给页面,Spring MVC 提供了以下几种途径:

    • ModelAndView:将视图和数据封装成ModelAndView对象,作为方法的返回值,数据最终会存到HttpServletRequest对象中!
    • Model对象:通过给方法添加引用Model对象入参,直接往Model对象添加属性值。那么哪些类型的入参才能够引用Model对象,有三种类型,分别是  org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map。只要是这些类型的入参,都是指向Model对象的,而且不管定义多少个这些类型的入参都是指向同一个Model对象!
    • @SessionAttributes:通过给Controller类添加@SessionAttributes注解,该注解的name和value属性值都是Model的key值,意思是指Model中这些key对应的数据也会存到HttpSession,不仅仅存到HttpServletRequest对象中!这样页面可以共享HttpSession中存的数据了!
    • @ModelAttribute:使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行,指定@ModelAttribute的name或value都是一样的功能,都是作为key,将注解的方法返回的对象作为value存放到Model中,不指定name和value的话,则以注解的方法返回的类型名称首字母小写作为key。

    当然,除了上述的途径,也可以使用传统的方式,那就是直接使用HttpServletRequest或HttpSession对象来存数据,页面上再去取。

    注意:Model中存的数据,最终都会存放到HttpServletRequest对象中,页面上可以通过HttpServletRequest对象获取数据。

    接下来,我们就看看demo,通过demo来理解如何通过这几种方式实现将数据返回给页面。

    demo场景:通过ResetFul风格的URL路径传递用户ID给Controller,Controller查询出对应的用户信息返回给页面。

    Spring MVC配置的视图解析器:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    ReturnModelDataController1.java:

    package edu.mvcdemo.controller;
     
    import java.util.Map;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    import edu.mvcdemo.model.User;
    import edu.mvcdemo.service.IUserService;
     
    /**
     * @编写人: 47
     * @编写时间:2020-7-10 下午9:16:54
     * @文件描述: Controller中如何将model数据返回给页面的demo1
     */
    @Controller
    @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
    @RequestMapping("users")
    public class ReturnModelDataController1 {
        
        @Autowired
        @Qualifier("userService")
        private IUserService userService;
     
        
        /**
         * 方式一,通过ModelAndView返回用户信息数据到页面
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/ModelAndView", method=RequestMethod.GET)
        private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){
            User user = userService.getUserById(userId);
            return new ModelAndView("userinfo", "user", user);
        }
        
        /**
         * 方式二,通过Model返回用户信息数据到页面
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/Model", method=RequestMethod.GET)
        private String getUserInfo(@PathVariable("userId") Integer userId, Model model){
            User user = userService.getUserById(userId);
            model.addAttribute("user", user);
            return "userinfo";
        }
        
        
        /**
         * 方式三,通过ModelMap返回用户信息数据到页面
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/ModelMap", method=RequestMethod.GET)
        private String getUserInfo(@PathVariable("userId") Integer userId, ModelMap model){
            User user = userService.getUserById(userId);
            model.addAttribute("user", user);
            return "userinfo";
        }
        
        /**
         * 方式四,通过Map返回用户信息数据到页面
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/Map", method=RequestMethod.GET)
        private String getUserInfo(@PathVariable("userId") Integer userId, Map<String,Object> model){
            User user = userService.getUserById(userId);
            model.put("user", user);
            return "userinfo";
        }
     
    }

    RetunnModelDataController2.java:

    package edu.mvcdemo.controller;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.SessionAttributes;
    import org.springframework.web.servlet.ModelAndView;
    import edu.mvcdemo.model.User;
    import edu.mvcdemo.service.IUserService;
     
    /**
     * @编写人: 47
     * @编写时间:2020-7-11 下午9:09:03
     * @文件描述: Controller中如何将model数据返回给页面的demo2
     */
    @Controller
    @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
    @RequestMapping("users")
    @SessionAttributes({"user"}) //Model中key=user的数据也会存到HttpSession
    public class RetunnModelDataController2 {
        
        @Autowired
        @Qualifier("userService")
        private IUserService userService;
        
        /**
         * 方式五,通过@SessionAttributes将指定key的模型数据存到HttpSession,让页面可以获取
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/SessionAttributes", method=RequestMethod.GET)
        private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){
            User user = userService.getUserById(userId);
            return new ModelAndView("userinfo", "user", user);
        }
     
    }

    RetunnModelDataController3.java:

    package edu.mvcdemo.controller;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import edu.mvcdemo.model.User;
    import edu.mvcdemo.service.IUserService;
     
    /**
     * @编写人: 47
     * @编写时间:2020-7-11 下午9:09:03
     * @文件描述: Controller中如何将model数据返回给页面的demo3
     */
    @Controller
    @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
    @RequestMapping("users")
    public class RetunnModelDataController3 {
        
        @Autowired
        @Qualifier("userService")
        private IUserService userService;
        
        /**
         * 注解@ModelAttribute用法一:
         * 使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行,
         * 指定@ModelAttribute的name或value都是一样的功能,都是作为key,将注解的方法返回的对象作为value存放到Model中,
         * 不指定name和value的话,则以注解的方法返回的类型名称首字母小写作为key。
         * @param userId  ResetFul路径的请求参数
         * @return
         */
        @ModelAttribute(name="user") 
        public User addAccount(@PathVariable("userId") Integer userId) {  
           return userService.getUserById(userId);  
        }  
     
        /**
         * 注解@ModelAttribute用法二:
         * 使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行
         * @param userId    ResetFul路径的请求参数
         * @param model     模型对象,可以使用org.springframework.ui.Model、org.springframework.ui.ModelMap 
         *                       或 java.uti.Map 作为入参类型,以引用模型对象
         */
      /*@ModelAttribute
        public void addAccount(@PathVariable("userId") Integer userId, Model model) {  
           User user =  userService.getUserById(userId); 
           model.addAttribute("user", user);
        }*/
        
        /**
         * 方式六,通过@SessionAttributes将指定key的模型数据存到HttpSession,让页面可以获取
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/ModelAttribute", method=RequestMethod.GET)
        private String getUserInfo(@PathVariable("userId") Integer userId){
            return "userinfo";
        }
     
    }

    RetunnModelDataController4.java:

    package edu.mvcdemo.controller;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import edu.mvcdemo.model.User;
    import edu.mvcdemo.service.IUserService;
     
    /**
     * @编写人: 47
     * @编写时间:2020-7-11 下午9:09:03
     * @文件描述: Controller中如何将model数据返回给页面的demo2
     */
    @Controller
    @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
    @RequestMapping("users")
    public class RetunnModelDataController4 {
        
        @Autowired
        @Qualifier("userService")
        private IUserService userService;
        
        /**
         * 方式七,直接将数据存到HttpSession,让页面可以获取
         * @param userId
         * @param session
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/HttpSession", method=RequestMethod.GET)
        private String getUserInfo(@PathVariable("userId") Integer userId, HttpSession session){
            User user = userService.getUserById(userId);
            session.setAttribute("user", user);
            return "userinfo";
        }
        
        /**
         * 方式八,直接将数据存到HttpServletRequest,让页面可以获取
         * @param userId
         * @param session
         * @return
         */
        @RequestMapping(value="/view/{userId}/use/HttpServletRequest", method=RequestMethod.GET)
        private String getUserInfo(@PathVariable("userId") Integer userId, HttpServletRequest request){
            User user = userService.getUserById(userId);
            request.setAttribute("user", user);
            return "userinfo";
        }
     
    }

    用户信息页面userinfo.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!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>userinfo.jsp</title>
    </head>
    <body>
            <c:if test="${sessionScope.user != null}">
                <h3>HttpSession对象中也存了用户信息!用户信息如下:</h3> 
                            用户编号:${sessionScope.user.no}
                <br>
                            用户名:${sessionScope.user.userName}
                <br>
                            年龄:${sessionScope.user.age}
            </c:if>
            <c:if test="${requestScope.user != null}">
                <h3>HttpServletRequest对象中存的用户信息如下:</h3> 
                            用户编号:${requestScope.user.no}
                <br>
                            用户名:${requestScope.user.userName}
                <br>
                            年龄:${requestScope.user.age}
            </c:if>
    </body>
    </html>
  • 相关阅读:
    Java的几种常用设计模式
    面向切面编程AOP
    面向过程编程、面向对象编程
    Java基础之集合与泛型
    Spring mvc中自定义拦截器
    Hibernate框架hibernate.cfg.xml配置文件,配置自动生成表结构策略。
    Notepad++打开xml文件显示crlf的问题
    java框架
    潜龙博客地址
    联通
  • 原文地址:https://www.cnblogs.com/47Gamer/p/14281441.html
Copyright © 2011-2022 走看看