第一步:用 IDEA 基于Spring官方骨架,创建SpringBoot工程。
第二步:选择 SpringBoot 框架版本,勾选web开发相关依赖。
在主包名下,创建 controller 包 + pojo 包
package com.itheima.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class RequestController {
@RequestMapping("/hello")
public String hello(){
System.out.println("Hello World ~");
return "Hello World !";
}
}
运行 SprintBootWebObjectApplication 类
- 请求方式:GET
- URL: http://localhost:8080/simpleParam?name=lisi&age=45
@RestController
public class RequestController {
// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
// 第2个请求参数: age=10 参数名:age , 参数值:10
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致
System.out.println(name+" : "+age);
return "OK"; //返回数据
}
}
- 请求方式:GET
- URL: http://localhost:8080/simpleParam?name=lisi&age=45
@RestController
public class RequestController {
// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
// 第2个请求参数: age=10 参数名:age , 参数值:10
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username , Integer age ){// name:请求参数名,required:参数是否必须
System.out.println(username+" : "+age);
return "OK"; //返回数据
}
}
- 请求方式:GET
- URL: http://localhost:8080/complexPojo?username=李四&age=10&address.province=背景&address.city=上海
@RestController
public class RequestController {
//springboot方式
@RequestMapping("/complexPojo")
public String complexPojo(User user) {
System.out.println(user);
return "ok";
}
User{
private String username;
private int age;
private Address address;
Get 和 Set 方法;
ToString 方法;
}
Address{
private String province;
private String city;
Get 和 Set 方法;
ToString 方法;
}
}
- 请求方式:GET
- URL: http://localhost:8080/arrayParam?hobby=string&hobby=java&hobby=python
@RestController
public class RequestController {
//springboot方式
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby) {
System.out.println(Arrays.toString(hobby));
return "ok,arrayParam";
}
}
- 请求方式:GET
- URL: http://localhost:8080/listParam?hobby=string&hobby=java&hobby=python
@RestController
public class RequestController {
//springboot方式
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby) {
System.out.println(hobby);
return "ok,listParam";
}
}
- 请求方式:GET
- URL: http://localhost:8080/dateParam?date=2023-02-09 12:08:09
@RestController
public class RequestController {
//springboot方式
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date) {
System.out.println(date);
return "ok,dateParam";
}
}
- 请求方式:POST
- URL: http://localhost:8080/jsonParam
- 请求体:
{
"username": "lisi",
"age": 23,
"address": {
"province": "beijing",
"city": "上海"
}
}
@RestController
public class RequestController {
// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
// 第2个请求参数: age=10 参数名:age , 参数值:10
//springboot方式
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user) {
System.out.println(user);
return "ok,jsonParam";
}
}
- 请求方式:GET
- URL: http://localhost:8080/path/1000
@RestController
public class RequestController {
//springboot方式
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id) {
System.out.println(id);
return "ok,pathParam";
}
}
- 请求方式:GET
- URL: http://localhost:8080/path/1000/Lisi
@RestController
public class RequestController {
//springboot方式
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name) {
System.out.println(id);
System.out.println(name);
return "ok,pathParam";
}
}
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应码 描述字符串
private Object data; //返回的数据
public Result() { }
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
//增删改 成功响应(不需要给前端返回数据)
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应(把查询结果做为返回数据响应给前端)
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}
负责数据的访问操作,包含数据的增、删、改、查
数据访问接口
//数据访问层接口(制定标准)
public interface EmpDao {
//获取员工列表数据
public List<Emp> listEmp();
}
//数据访问实现类
public class EmpDaoA implements EmpDao {
@Override
public List<Emp> listEmp() {
//1. 加载并解析emp.xml
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
return empList;
}
}
处理具体的业务逻辑
业务接口
//业务逻辑接口(制定业务标准)
public interface EmpService {
//获取员工列表
public List<Emp> listEmp();
}
//业务逻辑实现类(按照业务标准实现)
public class EmpServiceA implements EmpService {
//dao层对象
private EmpDao empDao = new EmpDaoA();
@Override
public List<Emp> listEmp() {
//1. 调用dao, 获取数据
List<Emp> empList = empDao.listEmp();
//2. 对数据进行转换处理 - gender, job
empList.stream().forEach(emp -> {
//处理 gender 1: 男, 2: 女
String gender = emp.getGender();
if("1".equals(gender)){
emp.setGender("男");
}else if("2".equals(gender)){
emp.setGender("女");
}
//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导
String job = emp.getJob();
if("1".equals(job)){
emp.setJob("讲师");
}else if("2".equals(job)){
emp.setJob("班主任");
}else if("3".equals(job)){
emp.setJob("就业指导");
}
});
return empList;
}
}
@RestController
public class EmpController {
//业务层对象
private EmpService empService = new EmpServiceA();
@RequestMapping("/listEmp")
public Result list(){
//1. 调用service层, 获取数据
List<Emp> empList = empService.listEmp();
//3. 响应数据
return Result.success(empList);
}
}
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚低耦合。
高内聚:一个模块中的代码,各个代码块之间关系越紧密,则内聚性越高。
低耦合:软件中各个层、模块之间的依赖(相互关联)性越低,则耦合度越低。
解决思路:
解耦操作:
控制反转:[ Inversion Of Control ],简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器
依赖注入:[ Dependency Injection ],简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。
例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象
把某个对象交给IOC容器管理,需要在类上添加一个注解:@Component
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明bean的基础注解 | 全部类通用注解(除控制类) |
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务逻辑类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
注:
- @RestController = @Controller + @ResponseBody
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
// 使用四大注解声明的 Bean,要想生效,还需要被组件扫描注解 @ComponentScan 扫描
@ComponentScan("dao", "com.Jiacheng")
@SpringBootApplication
public class SprintBootWebObjectApplication {
public static void main(String[] args) {
SpringApplication.run(SprintBootWebObjectApplication.class, args);
}
}
注:不推荐组件扫描,按照 SprintBoot 项目结构创建目录即可
// 依赖注入:@Autowired注解,按照类型进行自动装配。
@Autowired
private EmpService empService;
注解 | 说明 | 位置 |
---|---|---|
@Autowired | 按照类型自动装配 Bean 对象 | 类内 |
@Primary | 让当前类的 Bean 生效 | 类上 |
@Qualifier(“serviceA”) | 指定注入的 Bean 对象(搭配@Autowired) | 类内 |
@Resource(name = “serviceB”) | 按照 Bean的名称进行注入 | 类内 |
// 1.@Autowired 注入
@Autowired
private EmpService empService;
// 2.@Primary 注入
@Primary
public class EmpServiceA implements EmpService {}
// 3.@Qualifier() 注入,指定当前要注入的bean对象
@Autowired
@Qualifier("empServiceA")
private EmpService empService;
// 4.@Resource() 注入
@Resource(name = "empServiceB")
private EmpService empService;
- @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注
- @Autowired 默认是按照类型注入,而@Resource是按照名称注入