1.Controller层(Controller):
也称为前端控制器或请求处理器,它是项目与用户交互的入口。Controller接收HTTP请求,解析请求参数,调用Service层处理业务逻辑,并返回响应给客户端。
Controller通常使用@RestController或@Controller注解。
@Controller注解:
@Controller注解用于定义一个控制器类,通常用于创建Web应用程序中的控制器。在使用@Controller注解时,方法通常返回一个视图(View),该视图会被解析器解析并返回给客户端。这意味@Controller通常用于创建传统的MVC应用程序。
@Controller示例:
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
为什么说是返回了一个视图,详细解释为什么返回的是视图?为什么要返回视图?
在使用@Controller注解时,控制器方法通常返回一个视图(View)对象,该对象表示要渲染的用户界面。这是因为@Controller注解用于创建传统的MVC(Model-View-Controller)应用程序,其中View对象是模型(Model)和控制器(Controller)之间的桥梁,负责将模型的数据渲染到用户界面上。
当控制器方法返回一个视图对象时,该对象会被视图解析器(ViewResolver)解析为一个实际的视图,并将其渲染为HTTP响应。视图解析器根据视图名称和视图解析器配置来决定要渲染哪个视图。
返回视图对象的优点在于,它可以将模型和视图的分离实现得更加清晰,使得开发人员可以更好地控制应用程序的行为。控制器方法只需关注如何获取和处理数据,而不需要关心如何将数据渲染到用户界面上。这种分离可以提高应用程序的可维护性和可扩展性,使得开发人员可以更好地重用和测试代码。
此外,返回视图对象还可以使得应用程序更加灵活,因为视图解析器可以根据需要将视图对象渲染为不同的格式,如HTML、XML、JSON等。这使得应用程序可以支持多种输出格式,从而更好地适应不同的用户需求和场景。
总之,返回视图对象的原因在于,它可以将模型和视图的分离实现得更加清晰,使得开发人员可以更好地控制应用程序的行为,并使应用程序更加灵活和可维护。
@RestController注解:
@RestController注解是@Controller的一个特化版本,它结合了@Controller和@ResponseBody注解的功能。使用@RestController注解的类,所有方法的返回值会直接以JSON或XML格式写入HTTP响应体中,而不会经过视图解析器进行渲染。因此,@RestController通常用于创建RESTful风格的Web服务。
@RestController示例:
@RestController
public class MyRestController {
@RequestMapping("/api/hello")
public String hello() {
return "Hello, World!";
}
}
在上面的例子中,hello()方法返回一个Map<String, String>对象,该对象被标注为@ResponseBody。这意味着该对象会被直接转换为JSON格式,并发送给客户端。
需要注意的是,在使用@ResponseBody时,控制器方法的返回值类型必须是一个支持序列化的对象,如String, Map, List等。如果需要返回其他类型的对象,可以使用Jackson或其他序列化库将该对象转换为JSON或其他格式。
什么是RESTful风格的Web服务?
RESTful(Representational State Transfer)风格的Web服务是一种设计Web服务的架构风格,它是基于HTTP协议和统一资源定位器(URL)的架构风格。RESTful Web服务遵循REST原则,使用HTTP方法(如GET、POST、PUT、DELETE等)来操作资源,使用URL来唯一标识资源,使用标准的MIME类型(如JSON、XML等)来表示资源的状态。
RESTful Web服务的主要特点如下:
资源(Resource):RESTful Web服务中的所有内容都被视为资源,资源可以是一个实体、一个 concept(一个抽象的、可以被表示和操作的思维或信息单元。它并不直接对应数据库中的实体,而是一个更广泛的概念,可以是数据模型中的一个属性、一个业务逻辑的结果,或者是一个业务规则。例如,一个“天气预报”的概念可能包含多个具体的天气数据点,如温度、湿度等。)、或一个 service,每个资源都有一个唯一的URI(统一资源标识符的缩写,用于唯一标识互联网资源的字符串序列)。
表示(Representation):资源的表示方式可以是多种多样的,如JSON、XML、HTML等,客户端和服务器可以通过Accept和Content-Type头来约定资源的表示方式。
状态转移(State Transfer):RESTful Web服务鼓励将服务器的状态传递给客户端,客户端可以根据服务器的状态来操作资源,从而实现无状态的通信。
无状态(Stateless):RESTful Web服务要求每个请求都必须包含所需的所有信息,服务器不能存储客户端的任何状态信息,这使得RESTful Web服务具有可伸缩性和可靠性高的特点。
分层系统(Layered System):RESTful Web服务可以通过分层的架构来实现,每层之间可以通过统一的接口来交互,这使得RESTful Web服务具有可扩展性和可维护性高的特点。
RESTful Web服务的优点:
它可以使用标准的HTTP协议和URL来实现简单、统一、可扩展的API,使得开发人员可以更好地开发和集成应用程序。此外,RESTful Web服务还可以支持多种表示方式,使得应用程序可以更好地适应不同的用户需求和场景。
什么是@ResponseBody注解?
@ResponseBody是一个Spring注解,用于将控制器方法的返回值直接写入HTTP响应体中,而不是被视图解析器解析并渲染为视图。当在控制器方法中使用@ResponseBody时,该方法的返回值会被转换为指定的格式,并直接发送给客户端。
@ResponseBody返回一个JSON对象的示例:
@RestController
public class MyController {
@GetMapping("/hello")
public @ResponseBody Map<String, String> hello() {
Map<String, String> map = new HashMap<>();
map.put("message", "Hello, World!");
return map;
}
}
在上面的例子中,hello()方法返回一个Map<String, String>对象,该对象被标注为@ResponseBody。这意味着该对象会被直接转换为JSON格式,并发送给客户端。
需要注意的是,在使用@ResponseBody时,控制器方法的返回值类型必须是一个支持序列化的对象,如String, Map, List等。如果需要返回其他类型的对象,可以使用Jackson或其他序列化库将该对象转换为JSON或其他格式。
总之,@ResponseBody注解用于将控制器方法的返回值直接写入HTTP响应体中,而不是被视图解析器解析和渲染为视图。这可以用于返回JSON或其他格式的数据,以满足AJAX请求或其他需要返回数据的场景。
为什么使用@RestController注解而不使用@ResponseBody注解?
因为@RestController是@Controller和@ResponseBody的组合注解,可以简化控制器类的编写。当在控制器类上使用@RestController时,该类中所有的方法都会被视为返回HTTP响应体,从而省去了每个方法上都需要添加@ResponseBody的麻烦(这个想法很Java!)。
2.Mapper层(Mapper):
数据访问层,它负责将业务对象(如Model)转换为数据库操作的SQL语句(如JPA或MyBatis),以及将数据库查询结果转换回业务对象。Mapper接口通常使用@Mapper注解。
3.Model层(Model):
也称为领域模型或业务对象,它封装了业务数据和业务逻辑。Model层不直接处理数据库操作,而是通过Service层与数据库交互,它的目的是将业务逻辑与数据操作解耦。
4.Service层(Service):
服务层是业务逻辑的核心部分,它处理复杂的业务规则、数据验证、业务协调等。Service层通常会调用Mapper层来执行数据库操作,并将结果转换为Model对象或直接返回。
5.Handlers层(Handler):
这个术语在一些项目中可能不常见,但如果你指的是错误处理或全局处理,它可能指处理HTTP异常的类,如@ExceptionHandler注解的类,用于捕获并处理Controller抛出的异常。
6.Commons层(Commons):
也称为工具库或基础库,它包含项目中重复使用的通用功能,如日志处理、异常处理、日期时间操作、文件操作等。这些代码通常被多个层共享。
上述组件之间的逻辑关系:
用户请求通过Controller层到达,Controller调用Service层处理业务逻辑。Service层通过Mapper层操作数据库,Mapper将Model对象和数据库操作绑定起来。
Service层处理完业务后生成Model对象,或者直接返回结果给Controller。Controller负责将结果转换为HTTP响应并返回给客户端。
如果在处理过程中出现异常,可能被Handlers层捕获并转化为友好的错误信息返回。
Commons层提供了一致的编程接口和通用工具,使得其他层的代码更加简洁和可维护。
Spring 框架(Spring Framework):
Spring Boot 基于 Spring Framework,提供了核心功能,如依赖注入、AOP、事务管理、数据访问等。
Spring Web 模块:
提供了 Web 应用的基础支持,如 Servlet、控制器、模板引擎等。
可选模块:
Spring Boot Actuator:提供应用监控和管理功能,如健康检查、度量指标、配置管理、跟踪和过滤等。
Spring Boot Security:提供安全相关的功能,如身份验证、授权、基于角色的访问控制等。
Spring Boot Cloud:提供云原生应用的支持,如服务发现、配置中心、负载均衡、分布式追踪等。
Spring Boot Test:提供了测试相关的功能,如自动配置测试环境、模拟服务等。