前言:
SpringMVC的层:Dao、Service、Controller、View的关系
- Dao层: 负责数据持久化,与数据库进行联络的任务都封装在其中,Dao层的数据源以及相关的数据库连接参数都在Spring配置文件中进行配置。Dao接口中的方法都大同小异,因为对数据库的基本操作类似:insert、delete、update、select。在Dao层定义的一些方法,在Service层并没有被使用的情况。Dao层的操作经过抽象后基本都是通用的,在Dao层完成相关的定义,有利于后期的Service层的扩展
- Service层: 建立在Dao层之上,Controller层之下。调用Dao的接口(Mapper.java),为Controller层提供接口。负责业务模块的逻辑应用设计,首先设计接口,在设计其实现的类。
- Controller层: 负责具体业务模块流程的控制,即调用Service层的接口来控制业务流程。负责url映射(action)
- View层:表示层,负责前端jsp页面表示。
面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。Dao层设计与设计的数据库表和实现类(对应的Entity或者JavaBean)一一对应,Entity类和java对象,与数据库表一一对应,是其对应的实现类。即一个Entity就是对应表中的一条记录。View层与Controller层结合紧密,需要二者结合协同开发。Service层、Dao层和其他层次耦合很低,完全可以单独开发。
@SpringBootApplication
我们可以把 @SpringBootApplication
看作是 @Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合。
在SpringBoot官网,这三个注解作用分别是:
@EnableAutoConfiguration
: 启用SpringBoot的自动配置@CompoentScan
: 扫描被@Component
(@Service
,@Controller
)注解的 bean,注解默认会扫描该类所在的包下所有的类。@Configuration
:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
Spring Bean 相关
@Autowired
自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
1 |
|
Component, @Repository, @Service, @Controller
我们一般使用@Autowired
注解让Spring容器帮我自动装配bean,要想把类别标识成可用于@Autowired
注解自动装配的bean的类,可以采用以下注解实现:
@Component
: 通常的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪个层,可以使用@Compoent
注解标注。@Repository
: 对应持久层即Dao层,主要用于数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层。@Controller
: 对应Spring MVC控制层, 主要用户接受用户请求并调用Service层返回数据给前端页面。
@RestController
@RestController
注解是@Controller和
@ResponseBody
的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。
单独使用 @Controller
不加 @ResponseBody
的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller
+@ResponseBody
返回 JSON 或 XML 形式数据
@RestController VS @Controller
- Controller 返回一个页面
单独使用 @Controller
不加 @ResponseBody
的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。
RestController 返回JSON 或 XML 形式数据
但
@RestController
只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。
Controller +@ResponseBody 返回JSON 或 XML 形式数据
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用
@Controller
并结合@ResponseBody
注解,也就是说@Controller
+@ResponseBody
=@RestController
(Spring 4 之后新加的注解)。
@Scope
声明Spring Bean的作用域,使用方法:
1 |
|
四种常见的Spring Bean 的作用域:
- singleton: 唯一bean实例,Spring中的bean默认地都是单例的;
- prototype: 每次请求都会创建一个新的bean实例
- request: 每一次HTTP请求都会产生一个新的Bean,该bean仅在当前HTTP request 内有效。
- session: 每一次HTTP请求都会产生一个新的Bean,该bean仅在当前HTTP session 内有效。
Configuration
一般用来声明配置类,可以使用 @Component
注解替代,不过使用Configuration
注解声明配置类更加语义化。
1 |
|
处理常见的 HTTP 请求类型
5 种常见的请求类型:
- GET :请求从服务器获取特定资源。举个例子:
GET /users
(获取所有学生) - POST :在服务器上创建一个新的资源。举个例子:
POST /users
(创建学生) - PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:
PUT /users/12
(更新编号为 12 的学生) - DELETE :从服务器删除特定的资源。举个例子:
DELETE /users/12
(删除编号为 12 的学生) - PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
GET请求
@GetMapping(“user”) 等价于 @RequestMapping(value = “/users”, method = RequestMethod.GET)
1 |
|
POST请求
@PostMapping(“users”) 等价于
@RequestMapping(value=”/users”,method=RequestMethod.POST)
1 |
|
PUT请求
@PutMapping(“/users/{userId}”) 等价于
@RequestMapping(value=”/users/{userId}”,method=RequestMethod.PUT)
1 |
|
DELETE请求
@DeleteMapping(“/users/{userId}”)等价于
@RequestMapping(value=”/users/{userId}”,method=RequestMethod.DELETE)
1 |
|
PATCH请求
一般实际项目中,我们都是PUT不够用之后才用PATCH请求去更新数据。
1 |
|