SpringMVC框架学习 day02 响应数据和结果视图

1.返回值分类

1.1 返回值为 String

    /**
     * 返回值为 String
     * @param model
     * @return
     */
    @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testResponse方法执行了");
        //模拟从数据库取出数据
        User user = new User();
        user.setAge(12);
        user.setPassword("123123");
        user.setName("zhangsan");
        model.addAttribute("user",user);
        // 跳转到XX页面
        return "success";
    }

1.2 返回值为 void

1、使用 request 转向页面,如下:

    /**
     * 返回值为 void 跳转页面
     */
    @RequestMapping("testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("testVoid方法执行了");
        //1.转发请求 (一次请求)
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        return;
    }

2、也可以通过 response 页面重定向,如下:

    /**
     * 返回值为 void 跳转页面
     */
    @RequestMapping("testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("testVoid方法执行了");
        //2.重定向(两次请求)(不能访问web-inf路径下的页面)
        response.sendRedirect(request.getContextPath() + "/index.jsp");
        return;
    }

3、也可以通过 response 指定响应结果,例如响应 json 数据:

    @RequestMapping("testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("testVoid方法执行了");
        
        //设置响应字符集
        response.setCharacterEncoding("utf-8");
        response.setContentType("test/html;charset=utf-8");
        //直接在当前请求页面输出
        response.getWriter().print("sb");

        return;
    }

1.3 返回值为 ModelAndView

示例代码:

	//返回值为ModelAndView
    @RequestMapping("testModelAndView")
    public ModelAndView testModelAndView(){
        ModelAndView mv = new ModelAndView();
        User user = new User();
        user.setName("zhangsan");
        user.setAge(22);
        user.setPassword("123123");
        mv.addObject("user",user);
        mv.setViewName("success");
        return mv;
    }

2 转发和重定向

2.1 forward 转发

controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:

    /**
     *  forward 和 redirect 关键字
     * @return
     */
    @RequestMapping("testForwardAndRedirect")
    public String testForwardAndRedirect(){
        System.out.println("testForwardOrRedirect执行了");
        //请求转发
        return "forward:/WEB-INF/pages/success.jsp";
    }

需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。 它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。 )

2.2 Redirect 重定向

contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:

    /**
     *  forward 和 redirect 关键字
     * @return
     */
    @RequestMapping("testForwardAndRedirect")
    public String testForwardAndRedirect(){
        System.out.println("testForwardOrRedirect执行了");
        //重定向(springMVC框架底层已经加上了项目名所以不用写)
        return "redirect:/index.jsp";
    }

3 ResponseBody 响应 json 数据

3.1 使用说明

作用: 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端

3.2使用示例

需求:
使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端

前置知识点:
Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包的坐标:

<dependencies>
    <!-- jackson-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
 </dependencies>

jsp 中的代码:

    <script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                $.ajax({
                    url:"user/testAjax",
                    contentType:"application/json;charset=utf-8",
                    data:'{"name":"zhangsan","age":"12","password":"123123"}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
                        alert(data);
                        alert(data.name);
                        alert(data.password);
                        alert(data.age);
                    }
                })
            });
        });

    </script>
<!-- 测试异步请求 --> 
<body>
    <button id="btn">发送ajax请求</button>
</body>

控制器中的代码:

    /**
     * 模拟异步请求响应
     * @param user
     * @return
     */
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法执行了");
        //客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        //做响应,模拟查询数据库
        user.setAge(33);
        user.setPassword("23234");
        //做响应
        return user;
    }
发布了17 篇原创文章 · 获赞 0 · 访问量 134

猜你喜欢

转载自blog.csdn.net/weixin_46539792/article/details/105423506
今日推荐