SpringMVC第二篇【响应数据和结果视图,@ResponseBody注解】

1.响应数据和结果视图

1.1 返回值分类

1.1.1 字符串

controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp 

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: zhang
  Date: 2020/1/1
  Time: 22:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>执行成功</h1>
${user.username},${user.password},${user.age}
</body>
</html>

@RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testString执行了...");
        //模拟出数据库中查询user对象
        User user  = new User();
        user.setUsername("泰思特");
        user.setPassword("123");
        user.setAge(30);
        model.addAttribute("user",user);
        return "success";
    }

在这里插入图片描述
在这里插入图片描述

1.1.2 void

@RequestMapping("/testVoid")
    public void testVoid(){
        System.out.println("testVoid执行了...");
    }

在这里插入图片描述
如果返回值为void,springmvc默认会去查找@RequestMapping("/testVoid")中的testVoid加上.jsp后缀testVoid.jsp文件。

而我不想让这种情况出现,该怎么做呢?

在昨天的学习中,我们知道 Servlet 原始 API 可以作为控制器中方法的参数:

    @RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

在controller 方法形参上可以定义 request和 response,使用 request 或 response 指定响应结果:
1.使用 request 转向页面,如下:

System.out.println("testVoid执行了...");
        //编写请求转发的程序(转发是一次请求,不用编写项目的名称)
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        return;
    }

在这里插入图片描述
2.也可以通过 response 页面重定向:

response.sendRedirect(request.getContextPath()+"/index.jsp");

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

response.setCharacterEncoding("utf-8"); 
response.setContentType("application/json;charset=utf-8"); 
response.getWriter().write("json 串"); 

1.1.3 ModelAndView

ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

该对象中有两个方法:
在这里插入图片描述
控制器代码:

/**
     * ModelAndView
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        //创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        //模拟出数据库中查询user对象
        User user  = new User();
        user.setUsername("泰思特");
        user.setPassword("123");
        user.setAge(30);
        //把user对象存储到mv对象中,也会把user对象存储到request对象中
        mv.addObject("user",user);
        //跳转到哪个页面
        mv.setViewName("success");
        return mv;
    }

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: zhang
  Date: 2020/1/1
  Time: 22:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>执行成功</h1>
${user.username},${user.password},${user.age}
</body>
</html>

在这里插入图片描述

1.2 转发和重定向

1.2.1 forward 转发

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

/**
     * 转发
     * @return
     */
    @RequestMapping("/testForward")
    public String testForward(){
        System.out.println("testForward方法执行了");
        return "forward:/WEB-INF/pages/success.jsp";
    }

需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图(视图解析器不起作用)。

它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法

1.2.2 Redirect 重定向

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

/**
     * 重定向
     * @return
     */
    @RequestMapping("/testRedirect")
    public String testRedirect(){
        System.out.println("testRedirect");
        return "redirect:/index.jsp";
    }

它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不 能写在 WEB-INF 目录中,否则无法找到。

1.3 ResponseBody 响应 json 数据

1.3.1 过滤静态资源

response.jsp

<button id="btn">发送弄ajax请求</button>
<script src="js/jquery-3.4.0.js"></script>
<script>
    $(function(){
        $('#btn').click(function(){
            alert('hello ajax');
        })
    })
</script>

当我们点击按钮时:
在这里插入图片描述
无响应

因为<script src="js/jquery-3.4.0.js"></script>也会向服务器发送请求
而我们的web.xml中拦截了所有请求
在这里插入图片描述
所以我们得在spring.mvc中配置:

<!--配置过滤器不过滤静态资源-->
    <!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

1.3.2 客户端发送Ajax请求,服务端响应json数据

1.3.2.1 使用说明

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

1.3.2.2 使用示例

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

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

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.5</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.5</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.5</version>
    </dependency>

jsp代码:

<button id="btn">发送ajax请求</button>
<script src="js/jquery-3.4.0.js"></script>
<script>
    $(function(){
        $('#btn').click(function(){
            //发送ajax请求
            $.ajax({
                //编写json格式,设置属性和值
                url:"/user/testAjax",
                contentType:"application/json;charset=UTF-8",
                data:"{username:泰思特,password:1234,age:22}",
                dataType:"json",
                type:"POST",
                success:function(data){
                    //data服务器响应的json数据,进行解析
                    alert(data.username);
                    alert(data.password);
                    alert(data.age);
                }
            });
        })
    })
</script>

控制器代码:

/**
     * 模拟异步请求响应
     * @return
     */
    @ResponseBody
    @RequestMapping("/testAjax")
    public User testAjax(User user){
        System.out.println("testAjax执行了...");
        //客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        //做响应
        user.setUsername("张泽民");
        user.setPassword("1234");
        user.setAge(21);
        return user;
    }

运行结果:
在这里插入图片描述

发布了88 篇原创文章 · 获赞 3 · 访问量 4225

猜你喜欢

转载自blog.csdn.net/weixin_43691098/article/details/103797184