SpringMVC 响应数据与结果视图

响应数据与结果视图

文章目录

  • 响应数据与结果视图
    • 1 String 类型返回值的控制器方法
    • 2 void 类型返回值的控制器方法
    • 3 ModelAndView 类型返回值的控制器方法
    • 4 使用关键字进行转发和重定向
    • 5 POJO 类型返回值的控制器方法


本篇博文介绍 springMVC 不同类型返回值的控制器方法处理响应数据。

代码详情已上传至 GitHub,地址:https://github.com/Jacks5320/springMvcStudy


1 String 类型返回值的控制器方法

  • 如果控制器方法的返回值是一个 String 类型,springmvc 会根据配置的视图解析器的路径去匹配资源。
  • 如果需要返还给前端作数据渲染,可以使用 Model 的实现类来存储。因为 Model 的实现类都直接或间接继承了 Map 集合。
  • Model 存储的属性,最终会存入 request 域中,jsp 页面可以使用 el 表达式获取。

应用示例:

@Controller
@RequestMapping("/demo6")
public class Demo6Controller {
     

    @GetMapping("/testString")
    public String testString(Model model) {
     
        System.out.println("<== testString 方法执行了 ==>");
        //  返还 pojo 类
        Book book = new Book();
        book.setName("SpringMVC从入门到转行");
        book.setAuthor("劝退大师");
        book.setVersion(1);
        //  model 对象,将返回属性存入到 model 对象中,
        //  进而存到 request 域转发给页面,
        //  页面可以使用返回值渲染页面。
        model.addAttribute("book", book);
        return "success";
    }
}

请求与结果


<%--设置 isELIgnored="false" 可以使用 EL 表达式获取 request 域属性。--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>操作成功页面title>
head>
<body>
    <h3>操作成功跳转的页面h3>

    <p>方法返回值为 String 类型,使用 Model 存储对象,转发给页面p>
    <p>书名:${book.name}p>
    <p>作者:${book.author}p>
    <p>版本:${book.version}p>
    
body>
html>

SpringMVC 响应数据与结果视图_第1张图片


2 void 类型返回值的控制器方法

默认情况会根据配置的视图解析器去访问对应的资源,如果我作如下配置:

视图解析器:


<bean id="internalResourceViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    
    <property name="prefix" value="/WEB-INF/pages/"/>
    
    <property name="suffix" value=".jsp"/>
bean>
@Controller
@RequestMapping("/demo6")
public class Demo6Controller {
     
    @GetMapping("/testVoid")
    public void testVoid(){
     

    }
}
  • 当我们访问 http://localhost:8080/demo/demo6/testVoid 时( demo 是我的项目路径)
  • 默认情况 springMVC 会映射到 /demo/WEB-INF/pages/demo6/testVoid.jsp 这个资源。
  • 资源路径的拼接方式:项目路径/视图解析器路径/请求路径.jsp,也就是我这里的 /demo + /WEB-INF/pages/ + /demo6/testVoid.jsp
  • 如果这个资源不存在,页面会报 404 错误。
  • 如果希望处理页面不报 404,有两种方式解决:1 在项目中创建这个资源;2 使用 servlet 的原生接口进行 请求转发、重定向,又或者是使用字符流直接响应到界面。
  • 下面演示使用 servlet 原生接口作响应处理。

1 请求转发

@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    System.out.println("<== testVoid 方法执行了 ==>");
    //  请求转发,请求转发一次请求,不需要编写项目的名称
    //  手动转发,springmvc 就不会再提供视图解析器了,需要手动补全资源路径
     request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
}

2 重定向

@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    System.out.println("<== testVoid 方法执行了 ==>");
    //  请求重定向,重定向是重新发送一个请求。
    //  前端发送的请求不能直接访问 WEB-INF 文件夹下的资源,所以这里直接重定向到 index.jsp 页面
    response.sendRedirect("/demo/index.jsp");
    //  也可以使用 request.getContextPath() 来获取项目路径
    response.sendRedirect(request.getContextPath() + "/index.jsp");
}

3 直接使用字符流响应

@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    System.out.println("<== testVoid 方法执行了 ==>");
    //  直接响应页面,使用输出流响应页面
    //  设置响应类型
    response.setContentType("text/html;charset=utf-8");  
    //  在页面输出一句话,如果是中文,需要设置编码  
    response.getWriter().println("操作成功了");
}

3 ModelAndView 类型返回值的控制器方法

  • ModelAndView 对象是 Spring 提供的一个对象,可以用调整具体的 JSP 视图。
  • ModelAndView 对象可以存储数据,进而存入到 request 域对象中。
@GetMapping("/testModelAndView")
public ModelAndView testModelAndView(){
     
    //  创建 ModelAndView 对象
    ModelAndView modelAndView = new ModelAndView();
    //  创建 pojo 对象
    Book book = new Book();
    book.setName("MySQL从删库到跑路");
    book.setAuthor("跑路大师");
    book.setVersion(1);
    //  使用 ModelAndView 对象以 key-value 的方式存储 pojo 对象
    modelAndView.addObject("book",book);
    //  跳转页面,可以使用 视图解析器 进行解析,然后跳转
    //  String 类型返回值的方法底层也会使用 ModelAndView 对象来调用视图解析器
    modelAndView.setViewName("success");
    return modelAndView;
}

SpringMVC 响应数据与结果视图_第2张图片


4 使用关键字进行转发和重定向

  • 使用关键字进行转发和重定向不能使用视图解析器,需要手动补全资源路径。
  • 重定向依赖不能访问 WEB-INF 中的资源。
  • 相比于使用原生 servlet 接口方式的重定向,使用关键字进行重定向可以不加项目路径,直接使用资源路径即可。
  • 请求转发关键字:forward
  • 重定向关键字:redirect
//  请求转发
@GetMapping("/testKeyWord")
public String testKeyWord(){
     
    //  不能使用 视图解析器,所以需要补全资源路径
    return "forward:/WEB-INF/pages/success.jsp";
}
//  重定向:不能直接访问 WEB-INF 中的资源
@GetMapping("/testKeyWord")
public String testKeyWord(){
     
    //  不需要再加项目路径,直接映射资源路径
    return "redirect:/index.jsp";
}

5 POJO 类型返回值的控制器方法

  • 在 [SpringMVC 注解] 一文中已经介绍过注解的使用方式了。
  • 使用 @RequestBody 接收 ajax 发送的 json 格式请求体。
  • 使用 @Response 注解返回 json 格式响应体给 ajax 解析处理。
  • 下面依然使用 ajax 发送请求和处理请求。

导入 json 相关依赖

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.9.9version>
dependency>
<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-coreartifactId>
    <version>2.9.9version>
dependency>
<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-annotationsartifactId>
    <version>2.9.9version>
dependency>

控制器方法

@PostMapping("/testJson")
@ResponseBody
public Book testJson(@RequestBody Book book){
     
    book.setVersion(2);
    return book;
}
  • 这里将请求体中的 version 从 1 修改成 2,然后返回。

ajax 请求

<button id="btn">发送 ajax 请求button>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js">script>
<script>
    //  页面加载,绑定点击事件。
    $(function () {
      
        $("#btn").click(function () {
      
            // alert("hello btn");
            $.ajax({
      
                // 编写 json 格式,设置属性和值。
                url: "demo6/testJson",
                contentType: "application/json;charset=UTF-8",
                data: '{"name":"Linux从入门到入土","author":"秃头大师","version":"1"}',
                dataType: "json",
                type: "post",
                success: function (data) {
      
                    //data 是服务器端响应的 json 数据,进行解析
                    console.log(data);
                    console.log(data.name);
                    console.log(data.author);
                    console.log(data.version);
                }
            })
        });
    });
script>

SpringMVC 响应数据与结果视图_第3张图片

  • 关于响应处理方式就到这里了,可能还有其他方法,仅作参考。

你可能感兴趣的:(SpringMVC,springmvc,处理数据,响应数据)