二、SpringMVC之控制器的数据响应和页面跳转使用

二、SpringMVC之控制器的数据响应和页面跳转使用

一、SpringMVC的控制器方法的返回值

1、概述
SpringMVC的控制器方法提供了有三种返回值类型

  • String :该返回值可以借助配置的视图解析器完成成页面跳转,数据响应需要借助形参的model或者request完成
  • void:没有返回值,所以需要程序员自己使用servletAPI完成数据响应和页面跳转
  • ModelAndVIew:该返回值可以完成数据响应和页面跳转。

逻辑视图:控制器方法默认返回值路径,需要通过视图解析器解析获取真实视图;
真实视图:视图页面所在的真实路径。

视图解析器的配置:用来解析控制器返回的逻辑视图,定位到真实视图。

    <!-- 视图解析器 -->       
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 
            prefix:前缀
            suffix:后缀
            视图解析器,通过在控制器返回的逻辑视图添加前缀和后缀来定位到真实视图
         -->
        <property name="prefix" value="/WEB-INF/jsps/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

2.String返回值的控制器方法(常用)

        i:响应数据:
            1).可以通过request对象响应数据
            2).可以通过Model对象响应数据(DispatcherServlet内部会解析Model对象中的数据,
                并封装到本次请求的request对象中,请求转发时就可以将数据携带到对应视图)
        ii:页面跳转:只需要在返回值中明确指定页面跳转方式
                1)redirect:页面的完整路径
                2)forward:页面的完整路径
                3)默认跳转方式为请求转发,可以直接写页面的逻辑视图,DispatcherServlet(springMVC核心控制器)
                内部通过配置好的视图解析器获取真实视图,完成跳转。

控制器方法

    @RequestMapping("/find")
    public String testfind(String username, HttpServletRequest request, HttpServletResponse response, Model model) {
        User user = findUser(username);
        /**
          * 1.1通过request对象完成数据封装,request对象需要写到方法形参上,由核心控制器为我们传入
          * request.getSession().setAttribute("user", user);
          * 1.2通过Model对象完成数据封装,Model对象需要写到方法形参上,由核心控制器为我们传入
          * model.addAttribute("user", user);
         */
        request.getSession().setAttribute("user", user);
        // model.addAttribute("user", user);

        /**
         *     2.1重定向方式跳转页面
         *     return "redirect:login.jsp";
         *     2.2请求转发方式跳转页面
         *     return "forward:/WEB-INF/jsps/success.jsp";
         *     2.3默认方式跳转页面
         *     return "success.jsp";
         */
        return "success.jsp";
    }

3.ModelAndVIew返回值的控制器方法(常用)

ModelAndVIew提供了两个方法分别来封装跳转方式和数据响应

  • setViewName:用来封装跳转路径,可以指定跳转方式,也可以使用默认的请求转发,路径的写法和String类型相似

  • addObject: 用来封装数据响应(key-value形式)

    /**
     * ModelAndView:
     *    1页面跳转
     * setViewName方法 :设定跳转视图
     *    1.1. 默认为请求转发,可以直接写逻辑视图     
     *    1.2指定页面跳转方式 
     *        1)重定向        redirect:/redirect.jsp
     *        2)请求转发    forworad:/WEB-INF/jsps/success.jsp
     *    注意:指定条转发方式后必须写真实视图(即视图所在的全路径)
     *         默认方式可以写逻辑视图      
     *    2数据封装
     *    2.1一般通过:
     *        addObject方法 : 用来响应数据的(key—value)
     *        内部处理:也是将对象中的数据,存入到request域中    
     *    2.2也可以直接存入request对象中,但这样就失去ModelAndView返回值的意义,
     *        形参还是需要传入request对象
     *             
     *             
     *             
     */ 
    @RequestMapping("/get")
    public ModelAndView testget(String username, HttpServletRequest request, HttpServletResponse response,
            Model model) throws MyException {
        System.out.println(username);
        ModelAndView mv = new ModelAndView();
        User user = findUser(username);
        mv.addObject("user",user);
        mv.setViewName("redirect:/login.jsp");


        return mv;
    }

3.void返回值的控制器方法(不建议使用)

主要通过servlet的API完成数据响应和页面跳转,servlet相关对象需要写到控制器方法的形参上来获取

    /**
     *控制器方法:返回值 void
     *主要通过servlet的API完成数据响应和页面跳转
     *请求转发
     */
    @RequestMapping(value="/testResponse")
    public void testResponse(HttpServletRequest request,HttpServletResponse response) throws ServletException, Exception {
        User user = new User();
        user.setUsername("李四");
        request.setAttribute("user", user);
        //页面跳转
        //请求转发
        request.getRequestDispatcher("/WEB-INF/jsps/success.jsp").forward(request, response);
    }

    /**
     * 重定向 
     */
    @RequestMapping(value="/testRedirect")
    public void testRedirect(HttpServletRequest request,HttpServletResponse response) throws ServletException, Exception {
        /**
         * 相对路径
         */
        response.sendRedirect("../redirect.jsp");
    }

4.ajax请求的控制器方法

由于ajax请求不存在页面跳转,这里只涉及数据封装和数据响应
1)参数封装:
i.当通过发送请求为普通参数时,可以直接通过形参接受
ii.当请求参数声明为json字符串时,可以通过@RequestBody注解,将json字符串解析为形参对象
2)数据响应:数据响应可以直接通过控制器方法的返回值完成,对于对象类型返回值,可以通过注解@ResponseBody注解完成json字符串转换。

普通参数控制器方法

@RequestMapping("/find")
    /**
     * 1)数据封装:
     * ajax发送请求,携带的为普通参数时,
     * 可以通过控制器方法的形参直接接受,或者通过相应对象接受并封装
     *  如本例中的User
     * 2)数据响应:
     *    数据响应可以直接作为方法的返回值进行返回,
     *    如果是对象,可以通过@ResponseBody转换为json字符串返回
     * @ResponseBody:将控制器方法的返回值,转换成json字符串返回给ajax请求 
     *  
     */
    public @ResponseBody User testAjax(User user) {
        System.out.println(user);
        User DBUser = findUser(user.getUsername());     
        return DBUser;
    }

普通参数jsp页面

<body>
    <h1>ajax请求</h1>
    <input type="button" value="post提交" onclick="func()">
    <!--数据展示的div-->
    <div id="show"></div>
    <br>
    <script type="text/javascript">
        function func() {
            var URL = "${pageContext.request.contextPath }/find";
            var params = {
                "username" : "cgx",
                "age" : "40"
            };
            //ajax发送带参数的请求
            $.post(URL, params, function(data) {
                //响应数据展示
                $("#show").html(data.username + "--" + data.birthday + "---"+ data.age);
            }, "json");
        }
    </script>

</body>

请求为json字符串的控制器方法

/**
     * 1)数据封装:
     *  请求参数为json字符串,可以通过在形参上添加@RequestBody注解,
     *  完成对json字符串的解析和封装
     *  如本例中的User
     * @RequestBody:将请求参数的json字符串解析为对象,并封装到形参中 
     * 2)数据响应:
     *    数据响应可以直接作为方法的返回值进行返回,
     *    如果是对象,可以通过@ResponseBody转换为json字符串返回
     * @ResponseBody:将控制器方法的返回值,转换成json字符串返回给ajax请求 
     *  
     */

    @RequestMapping("/findUser")
    public @ResponseBody User findUser(@RequestBody User user) {
        System.out.println("-->ajax请求的参数 user = " + user);

        User DBUser = findUser(user.getUsername());
        return DBUser;
    }

请求为json字符串的jsp页面

<body>
<input type="button" value="提交" onclick="getUser()" />
<br /> 无刷新请求后的数据
<!--响应展示的div-->
<div id="result"></div>

<script type="text/javascript">

    function getUser() {
        var URL = "${pageContext.request.contextPath }/findUser";
        //ajax发送,请求参数为json字符串
        $.ajax({
            type : "POST",
            url : URL,
            data : '{"username":"cgx","age":"40"}',
            dataType : 'json',
            contentType : 'application/json;charset=utf-8', //请求头信息(json字符串)
            success : function(data) {
                $("#result").html(data.username + "--" + data.birthday + "---"+ data.age);
            }
        })
    }
</script>
</body>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值