JavaEE >> Spring MVC(2)

接上文 本文介绍如何使用 Spring Boot/MVC 项目将程序执行业务逻辑之后的结果返回给用户,以及一些相关内容进行分析解释。

返回静态页面

要返回一个静态页面,首先需要在 resource 中的 static 目录下面创建一个静态页面,下面将创建一个静态页面:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <h1>我是一个静态页面</h1>
</body>
</html>

然后在项目中实现对静态的返回,代码如下:

java 复制代码
@Repository
@ResponseBody
@RequestMapping("/s")
public class StaticRepository {
    @RequestMapping("/static")
    public String t1(){
        return "/test.html";
    }
}

在浏览器中运行:

此时,会发现返回的不是一个 html 页面,而是一个 String 类型的数据。这显然不是我们想要的结果。

原因:@ResponseBody 注解的锅。在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过 response 对象输出指定格式的数据。

修改代码,将 @ResponseBody 注解注释掉,可得到一个 html 页面:

这也就验证了上述原因。

注意:

若使用的 @RestController 注解,可以将该注解注释掉,直接使用 @Controller 注解,因为观察 @RestController 注解的源码就会发现它里面就包含了 @ResponseBody 注解。

  • 补充:
  • 在Spring Boot/MVC 项目里面不管使用那几个五大类注解效果都是相同的,不必纠结使用 @Controller 还是 @Repository 等注解,它们只是为了区分业务逻辑而使用不同名字。就是为了让程序员看到注解之后,就能直接了解当前类的⽤途。

返回数据(@ResponseBody)

前面也经常使用这个注解,@ResponseBody 注解就是为了让数据直接输出,而不会走视图处理。

该注解可以注解类,也可以注解方法。

  • 修饰类:表示该类的所有方法返回的都是数据
  • 修饰方法:表示该方法返回的都是数据

首先来看不使用该注解的效果:

java 复制代码
@Repository
//@ResponseBody
@RequestMapping("/s")
public class StaticRepository {

    @RequestMapping("/rp")
    public String t2(){
        return "hello,zhangSan";
    }

}

输出结果如下:


当没有使用 @ResponseBody 注解时,程序就会将 "hello,zhangsan" 认为是一个页面进行寻找 ,此时肯定是找不到的,要想让这句话直接输出,就需要加上 @ResponseBody 注解(此处在类或方法上加都是可以的,根据需求):

输出结果:

对于五大类注解来说,它们默认返回的都是一个页面,若想返回数据,就需要使用 @ResponseBody 注解

返回 HTML 片段

还是使用 @ResponseBody 注解,代码实现如下:

java 复制代码
@Repository
//@ResponseBody
@RequestMapping("/s")
public class StaticRepository {

    @ResponseBody
    @RequestMapping("/t")
    public String h(){  // html 片段返回
        return "<h1>终是江边鸟不可望,心上人不可及</h1>";
    }

}

返回对象、集合

创建对象和集合:

java 复制代码
@Repository
//@ResponseBody
@RequestMapping("/s")
public class StaticRepository {

	@ResponseBody
    @RequestMapping("/t1")
    public Student getStudent(){  // 当为对象时,Spring MVC 项目的返回结果
        Student student = new Student();
        student.setName("花有重开日");
        student.setAge(999);
        return student;
    }

    @ResponseBody
    @RequestMapping("/t2")
    public Map<String,String> map(){ // 当为集合时,Spring MVC 项目的返回结果
        HashMap map = new HashMap<>();
        map.put("终是江边鸟不可望","心上人不可及");
        map.put("花有重开日","人无再少年");
        return map;
    }
}


当我们使用 Fiddler 进行抓包时,就会发现 @ResponseBody 注解会将它们转换成 application/json 格式(将 @ResponseBody 注解注释掉就会报错 ):

返回 JS、css

当要返回一个页面时,就不需要用 @ResponseBody 注解了。

java 复制代码
@Repository
//@ResponseBody
@RequestMapping("/s")
public class StaticRepository {

    @RequestMapping("/t3")
    public String js(){   // 返回 js
        return "/t1.js";
    }

    @RequestMapping("/t4")
    public String css(){  // 返回 css
        return "/t2.css";
    }
}


Spring 会将它们自动转为相应的格式对用户显示出来。

小结:

  1. @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
  2. @ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者 json,⽽不是视图。
相关推荐
郝学胜-神的一滴6 小时前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建
我命由我1234516 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
MX_935919 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子19 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
晚霞的不甘21 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
寄存器漫游者1 天前
Linux 软件编程 - IO 编程
linux·运维·spring
我真会写代码1 天前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design1 天前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
MSTcheng.1 天前
探索昇腾底层逻辑:从ops-nn视角解读aclnn两阶段设计理念
mvc
独断万古他化1 天前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密