SpringBoot+SpringMVC常用注解
文章目录
- 发展历程
- 项目创建
- 项目结构
- 入门案例
- 配置文件的两种方式:只能使用一种
- 创建项目二
- 入门案例
- 常用知识及注解
- @Controller:类上面加,SpringMVC的注解
- @GetMapping:方法上面加
- Spring框架的两项核心功能
- @Component:组件。控制反转,加在业务类上面:比如SudentServiceImpl
- @Autowired:依赖注入:spring框架自动将容器中的实例,自动赋值给需要的类。是Spring的注解
- @Resource注解:依赖注入,不是Spring的注解
- @Component 和@Service,@Repository (仓储),@Controller ,@RestController一样,自动创建唯一实例
- @XXXMapping:用在方法上面
发展历程
SpringBoot环节:主力,要掌握,熟练使用
发展历程:
之后同一期出现的三种:
SSH1:
servlet+jsp,这是初级阶段。mvc三层架构。m:model,v:view,c:controller
struct 1.0 起初解决mvc 扩展名为.do的网站
spring 1.0:专注于帮程序员创建对象(程序员new对象容易失控)。单例对象(只创建一次对象就行了,属性类没有必要重复使用)
hibernate 1.0 :orm关系映射。将数据库中的结果集转换为Java对象,无需自己写sql。
之后发展:
SSH2:
struct 2.0 .action扩展名
spring 2.0 加入aop功能,面向切面功能
mybaits:orm 轻量级,需要程序员自己写sql
hibernate 2.0+
SSM:需要使用xml配置
springMVC:解决MVC,替代struct2.0。容易
Spring 3.0+ 增加更多功能,模块化
mybaits 3.0+ 替代hibernate
微服务:把一个大项目拆分成小的项目,然后根据需要进行整合。(例如:微信上面的小程序)规模小。
SprigBoot:不是一个框架。是一个快速开发脚手架。快速开发,在一定程度上限制了自由性。有固定的目录结构,有约定俗成的配置。约定大于配置(配置越少越好,快速开发)。SpringBoot用于整合SSM。
项目创建
项目创建完成后首先检查编码,配置maven
项目结构
xml配置文件说明:
以spring-boot-starter开头的包,叫启动器。对项目进行自动化配置。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.situ</groupId><artifactId>demo01</artifactId><version>0.0.1-SNAPSHOT</version><name>demo01</name><description>demo01</description><properties><java.version>21</java.version></properties><dependencies><!-- thymeleaf启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
<!-- SpingMVC启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 单元测试启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
入门案例
根包。所有的自己写的java部分写在根包下:约定大于配置
主启动类。
在类上面加上Controller表示这个类是一个控制器类。
在方法上加上GetMapping注解表示这个方法可以接收请求,指定请求的路径。
如果方法上面不加GetMapping注解表示这个方法就是普通方法。
package com.situ.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller//表明这是一个控制器类
public class HelloWorldController {@GetMapping("/hello")//方法的路径public String hello(){System.out.println("hello");return "hello";}
}
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body>
<p>你好</p></body>
</html>
启动:
配置文件的两种方式:只能使用一种
创建项目二
创建的时候加入:
以spring-boot-starter开头的包,叫启动器。对项目进行自动化配置。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
入门案例
根包。所有的自己写的java部分写在根包下:约定大于配置
主启动类。
在类上面加上Controller表示这个类是一个控制器类。
在方法上加上GetMapping注解表示这个方法可以接收请求,指定请求的路径。
如果方法上面不加GetMapping注解表示这个方法就是普通方法。
list.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>学生信息列表页面</title>
</head>
<body><h1>学生信息列表页面</h1><table><thead><tr><th>姓名</th><th>性别</th><th>出生日期</th></tr></thead></table></body>
</html>
结果展示:
常用知识及注解
@Controller:类上面加,SpringMVC的注解
在类上面加上Controller表示这个类是一个控制器类。
@GetMapping:方法上面加
在方法上加上GetMapping注解表示这个方法可以接收请求,指定请求的路径。
如果方法上面不加GetMapping注解表示这个方法就是普通方法。
Spring框架的两项核心功能
控制反转: Spring:将创建对象的权限交给spring框架,称之为控制反转 Inverse Of Control 简称ioc
依赖注入:Spring框架自动将容器中的实例,自动赋值给需要的类,DI
@Component:组件。控制反转,加在业务类上面:比如SudentServiceImpl
Spring:将创建对象的权限交给spring框架,称之为控制反转。Inverse Of Control,简称Ioc。
加上这个注解,spring在启动的时候会自动扫描根包下面的所有带这个注解的类,如果发现就会创建唯一实例(控制反转),是单例的
创建出来的唯一实例放在了哪里?创建出来了如何获取?
手动获取:
创建出来的唯一实例放在了容器对象里面, 然后将容器对象放在全局域中:
package com.situ.controller;
import com.situ.model.Student;
import com.situ.service.StudentService;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import java.util.List;
import java.util.Map;@Controller//控制器类
public class StudentController {private StudentService studentService;@GetMapping("/student/list")//访问路径,能够接收请求。public String list(Map<String, Object> map, HttpServletRequest request){//这个方法只能使用反射的方式调用:因为参数可以加,不确定多少个//手动获取实例:ServletContext ctx = request.getServletContext();//全局域//spring的应用上下文对象。容器 。创建的唯一实例会放在容器里面,然后放在全局域中:ApplicationContext ac = WebApplicationContextUtils.findWebApplicationContext(ctx);studentService = ac.getBean(StudentService.class);//取出指定类型的唯一实例List<Student> students = studentService.findAll();//调用方法:map.put("students", students);//放到请求域中:底层自动进行参数校验return "student/list";//return就是请求转发,请求转发到templates下面的student/list文件}
}
但是手动获取比较麻烦,所以出现了依赖注入:
@Autowired:依赖注入:spring框架自动将容器中的实例,自动赋值给需要的类。是Spring的注解
依赖关系:实现类实现接口,实现类就依赖于这个接口。让Spring去解决依赖关系。
依赖注入的三种方式:
1.字段注入:加在字段上面,不推荐使用,不方便测试
@Autowiredprivate StudentService studentService ;
2.setter注入
@Autowiredpublic void setStudentService(StudentService studentService) {this.studentService = studentService;}
3.构造器注入
构造器注入可以省略Autowired注解
@Autowired //构造器注入可以省略此行注解public StudentController(StudentService studentService){this.studentService= studentService;}
@Autowired
1.默认按类型匹配 使用频率比较高
当有多个实现类匹配时,可以使用@Primary注解表示优先
2.按名称匹配:需要搭配 @Qualifier()注解,同时指定Bean的名称,bean名称可以在@Component(“i2”)中指定,要是括号中不指定,则默认以类名(首字母小写)为bean名称
@Resource注解:依赖注入,不是Spring的注解
也是依赖注入
1.默认按名称注入 按name值
@Resource(name = "i1")
2.按类型注入:通过type属性
@Component 和@Service,@Repository (仓储),@Controller ,@RestController一样,自动创建唯一实例
其中,@RestController 是Controller的别名,
@Controller 和@RestController还会被识别出控制器,是不同于上面的额外作用。@Controller 和@RestController一般不用于创建唯一实例。
他们都是自动创建唯一实例的,但是 @Component 比较中性,不能见名知意。所有我们在Servcie层一般使用@Service,在Dao层数据处理层一般使用@Repository创建唯一实例
创建唯一实例:
注入依赖:
@XXXMapping:用在方法上面
在Controller中,一个方法只有指定@XXXMapping,才能接收请求。如果一个方法上面不加注解,那么他就是一个普通方法。
常见方式:
@GetMapping 接收get类型的请求
@PostMapping 接收post类型的请求
@PutMapping 接收put类型的请求
@PatchMapping 接收patch类型的请求
@DeleteMapping 接收delete类型的请求
@RequestMapping:接收任意类型的请求,但可以手动指定请求类型。
produces属性指定响应内容的类型。
@RequestMapping(value = "/student/list",method = RequestMethod.GET)
@XXXMapping也可以添加到类上面:添加到类上,表示所有方法以类上定义的方法作为公共前缀。表示全局统一定义。@GetMapping("/student/list")
参数:是通过反射调用的,数量,顺序可以任意。
1.可以HttpServletRequest,HttpSerlvetResponse,HttpSession
2.基本数据类型,以及包装类,BigDecimal,BigInteger,String。用于接收请求中的参数。
搭配 @RequstParam注解、搭配@PathVariable注解(路径变量)。通过这个注解可以指定获取参数和传输参数名字不一样的情况。这两个都是定义在参数位置上的。
3.javabean,普通类。将请求参数通过反射,设置到javabean实例中。即Spring会自动映射,获取参数,转类型、赋值一系列全部搞定。
4.Map,Model,ModelMap:充当请求域。map最常用。
5.加@RequestParam注解的map,此map不再作为请求域,而是用于存储请求参数。
6.以上类型的任意组合。
map:
返回值:
1.当返回的是字符串且响应内容类型为text/html,返回值即模板文件名。在满足1的基础上,返回"forword:/xxx",表示请求转发。在满足1的基础上,返回"redirect:/xxx",表示重定向。
2.ModelAndView:即可以指定视图名称,同时可以当请求域使用。前三种本质上也会被包装成ModelAndView
3.如果指定响应内容类型为josn,并且添加了@ResponseBody注解,无论返回值是什么类型,都会序列化成json字符串。
4.返回ResponseEntity类型,仅限于响应json格式。同时封装了业务数据,以及响应的状态码。