Spring MVC 入门之 设置响应

news2024/9/21 11:05:22

一、返回数据或者页面

在 Spring 框架中,@Controller@RestController 注解是用来定义 Web 层的控制器的。虽然两者都用于映射 HTTP 请求到处理它们的方法,但是它们的用途和行为有一些重要的区别。了解这些差异可以帮助你更好地设计和实现你的 Web 应用。同时,这些概念都是基于 Spring MVC 框架的,该框架遵循模型-视图-控制器(MVC)设计模式。

1)MVC 设计模式

MVC 设计模式是一种将应用程序分为三个核心组件的方法:模型(Model)、视图(View)和控制器(Controller)。

  • 模型(Model):代表应用程序的数据逻辑,通常与数据库的数据交互操作相关。
  • 视图(View):用于展示数据,即用户界面。在 Web 应用中,视图通常是 HTML,CSS 和 JavaScript 文件。
  • 控制器(Controller):起到模型与视图之间的中介作用。它接收用户的输入并调用模型和视图去完成用户的请求。
2)@Controller

@Controller 注解标记一个类为 Spring 的控制器组件。这个注解通常用于需要返回视图的应用中,比如返回一个 JSP 页面。使用 @Controller 的方法通常返回视图的名称,Spring MVC 会解析这个名称并导向相应的页面。如果方法需要返回数据(如 JSON 或 XML),通常会在方法上添加 @ResponseBody 注解,这样 Spring 会处理返回的数据,将其自动转换为 JSON 或 XML 格式。

3)JSP 页面

JSP (Java Server Pages) 是一种用于生成动态网页的技术,主要由 Java 代码片段和 HTML 标记组成。它是 Java 的服务器端技术,使得开发者能够将页面逻辑与页面布局分离,类似于 PHP、ASP.NET 这类的技术。在 JSP 文件中,你可以插入 Java 代码到 HTML 文件中,Java 代码会在服务器上执行,执行结果会直接嵌入到 HTML 中,然后这个 HTML 会被发送到客户端浏览器。

@Controller
public class WebController {

    @GetMapping("/page")
    public String getPage(Model model) {
        model.addAttribute("message", "This is a regular controller");
        return "page";
    }

    @GetMapping("/data")
    @ResponseBody
    public Map<String, Object> getData() {
        return Collections.singletonMap("key", "value");
    }
}
4)@RestController

@RestController@Controller@ResponseBody 注解的结合体。它的主要用途是创建 RESTful Web 服务。方法在 @RestController 中默认都会使用 @ResponseBody,这意味着你不需要在每个方法上分别添加 @ResponseBody 注解。@RestController 主要用于返回数据,而不是视图。

@RestController
public class ApiController {

    @GetMapping("/api/data")
    public User getUser() {
        return new User("John", "Doe");
    }
}

在这个例子中,getUser() 方法返回一个 User 对象,Spring 将自动将 User 对象序列化为 JSON 格式,并发送给客户端。

5)比较 @Controller 和 @RestController
  • @Controller 通常用于传统的 Web 应用程序,主要负责返回视图(如 HTML 页面)。它处理请求并返回一个视图名称,Spring MVC 随后解析这个视图名称,并渲染相应的页面。如果需要返回数据(如 JSON 或 XML),则需要在方法上加上 @ResponseBody 注解。
  • @RestController 专为构建 RESTful Web 服务设计,通常用于只返回数据而非视图的服务。在这个注解下的所有控制器方法默认都会使用 @ResponseBody 注解,这意味着方法的返回值会自动转换为 JSON 或其他格式的响应体
6) RESTful Web 服务

RESTful Web 服务(也称为 RESTful APIs)是基于代表性状态转移(REST)架构风格的 Web 服务。REST 是由 Roy Fielding 在其 2000 年的博士论文中定义的,它是一个概念架构,用于指导网络系统的设计和开发,尤其是分布式超媒体系统如 World Wide Web。

RESTful Web 服务利用 HTTP 协议的标准方法来执行操作,这些操作通常包括:

  • GET:用于检索资源。
  • POST:用于创建资源。
  • PUT:用于更新资源。
  • DELETE:用于删除资源。

这些服务通过使用标准 HTTP 方法对资源(数据实体)执行操作,简化了客户端和服务器之间的通信。

RESTful API 的核心原则

REST 架构风格的核心原则包括:

  1. 无状态(Stateless):每个请求从客户端到服务器都必须包含理解和处理请求所需的所有信息,与之前的请求独立。
  2. 客户端-服务器(Client-Server):通过分离客户端和服务器的关注点来提升用户界面的可移植性,同时简化服务器组件的可扩展性。
  3. 统一接口(Uniform Interface):确保系统架构的简化和解耦。要实现统一接口,需遵循资源的标识、通过表示操作资源、自描述消息和超媒体作为应用程序状态的引擎(HATEOAS)等原则。
  4. 可缓存(Cacheable):数据在请求或响应中定义为可缓存或不可缓存。有效管理缓存可以减少客户端-服务器交互次数。
  5. 分层系统(Layered System):客户端通常无法直接与存储资源的服务器通信,而是通过一个或多个中间层进行通信,增加了网络的可扩展性并通过负载均衡和共享缓存提高了性能。
  6. 按需代码(Code on Demand,可选):服务器可以临时扩展或自定义客户端的功能,通过发送可执行代码给客户端。

RESTful Web 服务的一些主要优点包括:

  • 可扩展性:分离客户端和服务器以及无状态的操作使得 RESTful Web 服务易于扩展。
  • 简单性:使用已经广泛采用的 HTTP 协议简化了开发。
  • 通用性:标准的 HTTP 方法和 MIME 类型使用广泛,使得 RESTful 服务可以被不同语言和平台的客户端使用。
  • 灵活性:可以使用 XML、JSON、YAML 或任何其他机器可读的格式返回数据,根据需要灵活选择。

二、设置状态码与 Header

a) 设置状态码
1)直接使用 HttpServletResponse 设置响应的状态码。
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StatusCodeController {

    @GetMapping("/status-direct")
    public void directStatus(HttpServletResponse response) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // 400 状态码
    }
}
2)使用 @ResponseStatus

Spring MVC 允许你通过 @ResponseStatus 注解在方法上直接声明响应的状态码。这种方法简洁明了,适用于不需要动态改变状态码的情况。

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StatusCodeController {

    @GetMapping("/status-annotated")
    @ResponseStatus(HttpStatus.CREATED)
    public String annotatedStatus() {
        return "Resource created";
    }
}
b) 设置Header

在 Spring MVC 中,设置 HTTP 响应头是一个常见的需求,特别是在构建 RESTful APIs 或动态生成内容时。你可以使用 HttpServletResponse 直接操作响应,或者使用 Spring 的 ResponseEntity 来更优雅地设置响应头。

1) 使用 HttpServletResponse

HttpServletResponse 是一个 Servlet API,它提供了直接操作 HTTP 响应的方法,包括设置状态码、响应头和发送错误信息等。

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HeaderController {

    @GetMapping("/set-header")
    public void setHeader(HttpServletResponse response) {
        // 设置自定义头信息
        response.setHeader("Custom-Header", "value");
        response.setHeader("Content-Type", "text/plain");

        // 设置其他 HTTP 标准头信息
        response.setDateHeader("Expires", System.currentTimeMillis() + 86400000); // 24小时后过期
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为杯】2024数学建模研赛题目

2024数学建模研赛题目已经发布 各个赛题题目如下&#xff1a; A题 B题 C题 D题 E题 F题 赛题完整版在文末&#xff0c;点击下方名片。

【操作系统】01.冯·诺伊曼体系结构

上面这张图就是我们经常能在各种教材中看到的冯诺伊曼体系结构。我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 一、认识设备 输入设备&#xff1a; 键盘、鼠标、网卡、磁盘、摄像头…… 输出设备&a…

Java8 中一个极其强悍的新接口,很多人没用过

在开发过程中经常会使用​​if...else...​​​进行判断抛出异常、分支处理等操作。这些​​if...else...​​​充斥在代码中严重影响了代码代码的美观&#xff0c;这时我们可以利用Java 8的Function接口来消灭​​if...else...​​。 if (...){throw new RuntimeException(&qu…

深入Android UI开发:从自定义View到高级布局技巧的全面学习资料

在Android开发的世界中&#xff0c;UI设计和实现是吸引用户的关键。本文将为您介绍一套全面的Android UI开发学习资料&#xff0c;包括详细的学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;旨在帮助您从自定义View到高级布局技巧&#xff0c;全面提升您的UI开发技能。…

深度学习-从零基础快速入门到项目实践,这本书上市了!!!

此书地址&#xff1a; 《【2024新书】深度学习 从零基础快速入门到项目实践 文青山 跟我一起学人工智能 机器学习算法原理代码实现教程 深度学习项目分析 深度学习 从零基础快速入门到项目实践》【摘要 书评 试读】- 京东图书 除深度学习外我还写了一本软件测试书。我大概是国…

Godot游戏如何提升触感体验

在游戏世界中&#xff0c;触感体验至关重要&#xff0c;既能极大提升玩家沉浸感&#xff0c;让其深度融入游戏&#xff0c;在操作角色或与环境互动时&#xff0c;通过触感反馈获得身临其境的真实感&#xff08;比如动作游戏中角色攻击或受击时的振动反馈&#xff0c;能使玩家更…

【OSS安全最佳实践】降低因账号密码泄露带来的未授权访问风险

如果因个人或者企业账号密码泄露引发了未经授权的访问&#xff0c;可能会出现非法用户对OSS资源进行违法操作&#xff0c;或者合法用户以未授权的方式对OSS资源进行各类操作&#xff0c;这将给数据安全带来极大的威胁。为此&#xff0c;OSS提供了在实施数据安全保护时需要考虑的…

6. Python 输出长方形,直角三角形,等腰三角形

使用Python输出长方形&#xff0c;直角三角形&#xff0c;等腰三角形 这里主要使用python语言里的循环知识&#xff0c;具体说是Python语言里的循环嵌套&#xff0c; 注意&#xff0c;在实际使用中&#xff0c;循环嵌套一般最多到达3层&#xff0c;嵌套太多会影响到程序执行。…

JavaWeb - 5 - 前端工程化

一.前后端分离开发 前后端混合开发 缺点&#xff1a;沟通成本高&#xff0c;分工不明确&#xff0c;不便管理&#xff0c;不便维护拓展 前后端分离开发 当前最为主流的开发模式&#xff1a;前后端分离 前后端分离开发中很重要的是API接口文档&#xff08;如&#xff1a;YApi&…

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性

知识点&#xff1a; 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注&#xff1a;传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址&#xff1a;http…

C++函数重载完成日期类相关计算

本文内容如下&#xff1a; 1.创建类以及函数的声明2.日期加减天数1.月份天数2.函数实现 3.日期比较大小4.日期减日期1.日期的前置和后置加加2.日期减日期的实现 5.内置类型的cout和cin本文代码如下&#xff1a; 要完成日期类的相关计算要创建自定义的类型&#xff0c;然后用函数…

Java制作拼图小游戏——基础编程实战(详细代码注释与流程讲解)

目录 前言 涉及知识点 准备工具 Java开发环境 图片资源 最终效果 ——需求分析 登录界面 功能描述 需求分析 功能需求 游戏主界面 功能描述 需求分析 功能需求 游戏菜单 游戏胜利界面 框架搭建 总结 编码 编码顺序 搭建App实现程序的入口 完成User用户类和…

计算总体方差statistics.pvariance()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 计算总体方差 statistics.pvariance() [太阳]选择题 根据给定的Python代码&#xff0c;运行结果为&#xff1f; import statistics data [1, 2, 3, 4, 5] print(f"【显示】data{…

【C++掌中宝】深入解析C++命名空间:有效管理代码的利器

文章目录 前言1. namespace 的价值2. namespace 的定义3. 命名空间的本质4. 嵌套的命名空间5. 命名空间的使用6. using 指令7. 补充结语 前言 假设这样一种情况&#xff0c;当一个班上有两个名叫 Zara 的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&am…

2.Seata 1.5.2 集成Springcloud-alibaba

一.Seata-server搭建已完成前提下 详见 Seata-server搭建 二.Springcloud 项目集成Seata 项目整体测试业务逻辑是创建订单后&#xff08;为了演示分布式事务&#xff0c;不做前置库存校验&#xff09;&#xff0c;再去扣减库存。库存不够的时候&#xff0c;创建的订单信息数…

攻防世界Web新手练习区题目(view_source到simple_php)WP

目录 view_source​ robots​ Training-WWW-Robots PHP2​ get_post​ backup​ cookie​ disabled_button​ simple_js​ xff_referer​ weak_auth​ command_execution​ simple_php​ view_source 获取在线场景后访问题目场景 在右键不管用的情况下&#xff0…

尚品汇-秒杀成功下单接口、秒杀结束定时任务-清空缓存数据(五十四)

目录&#xff1a; &#xff08;1&#xff09;下单页面 &#xff08;2&#xff09;service-activity-client添加接口 &#xff08;3&#xff09;web-all 编写去下单控制器 &#xff08;4&#xff09;service-order模块提供秒杀下单接口 &#xff08;5&#xff09;service-or…

1份可以派上用场丢失数据恢复的应用程序列表

无论如何&#xff0c;丢失您的宝贵数据是可怕的。您的 Android 或 iOS 设备可能由于事故、硬件损坏、存储卡问题等而丢失了数据。这就是为什么我们编制了一份可以派上用场以恢复丢失数据的应用程序列表。 如果您四处走动&#xff0c;您大多会随身携带手机或其他移动设备。这些…

豆包Python SDK接入流程

模型与价格 豆包的模型介绍可以看豆包大模型介绍&#xff0c;模型价格可以看豆包定价文档里的“模型推理” - “大语言模型” - “字节跳动”部分。 推荐使用以下模型&#xff1a; Doubao-lite-32k&#xff1a;每百万 token 的输入价格为 0.3 元&#xff0c;输出价格为 0.6 元…

vue组件($refs对象,动态组件,插槽,自定义指令)

一、ref 1.ref引用 每个vue组件实例上&#xff0c;都包含一个$refs对象&#xff0c;里面存储着对应dom元素或组件的引用。默认情况下&#xff0c;组件的$refs指向一个空对象。 2.使用ref获取dom元素的引用 <template><h3 ref"myh3">ref组件</h3&g…