Spring MVC 入门之 设置响应

一、返回数据或者页面

在 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小时后过期
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值