一.SpringBoot
1.入门程序
需求:基于SpringBoot开发一个Web应用,浏览器发起请求/hello之后,给浏览器返回一个字符串”Hello Xxx“
第一步:创建springboot工程,并勾选web开发相关依赖


第二步:定义HelloController类,添加方法hello,并添加注解


创建完成之后,可以删除掉一些不需要的部分,springboot会自动创建包,下面的springbootwebquickstaetApplication是启动类,static是存放比如Html、css这些静态文件,
template里面存放模板文件,application里面存放springboot的核心配置文件;text目录下存放基本的测试类
package com.itheima;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//表示当前类是一个请求处理类
public class HelloController {
@RequestMapping("/hello" )//表示前端传递的请求路径
public String hello(String name){//name是接受将来前端传递过来的name参数
System.out.println("name:"+name);//将name输出到控制台
return "Hello" + name + "-";//给前端响应了一个字符串
}
}

2.脚手架连接不上解决方案

换成如右图所示,阿里云的URL即可,后续操作与上述入门程序一致
3.入门程序刨析

依赖传递:指在软件项目管理中,当一个库(A)直接依赖另一个库(B),而库(B)又依赖库(C)时,库(A)会间接依赖库(C)。这种依赖关系会自动传递到项目依赖树中,无需显式声明。

也就是说一个main方法运行了内部集成进来的tomcat服务器,而tomcat服务器启动起来之后会将我们所编写的项目代码部署在服务器中,然后就可以打开浏览器进行访问。
而这个web起步开发依赖当中所集成进来tomcat服务器(标红框起来的地方)称之为内嵌的tomcat。
二.HTTP协议
1.概念

特点:
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型:一次请求对应一次相应
3.HTTP协议是无状态的协议:对于事务处理没有记忆能力。
- 缺点:多次请求间不能共享数据
- 优点:速度快
无状态的意思:每次请求-响应都是独立的
2.HTTP-请求协议
1)请求数据格式

请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=OPPO&stauts=1。GET请求大小在浏览器是有限制的。
请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。
注:请求体与请求头之间隔了一个空行

2)请求数据获取
Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServleRequest),在调用Controller方法的时候传递给了该方法。这样程序员不必直接对协议进行操作,让Web开发更加便捷。

package com.itheima;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
@RequestMapping("/request")
public String request(HttpServletRequest request){
//1.获取请求方式
String method = request.getMethod();
System.out.println("method:"+method);
//2.获取请求url地址
String url = request.getRequestURL().toString();// http://localhost:8080/request
System.out.println("url:"+url);
String uri = request.getRequestURI();
System.out.println("uri:"+uri);
//3.获取请求协议
String protocol = request.getProtocol();// HTTP/1.1
System.out.println("protocol:"+protocol);
//4.获取请求参数 - name
String name = request.getParameter("name");
System.out.println("name:"+name);
//获取请求参数 - age
String age = request.getParameter("age");
System.out.println("age:"+age);
//5.请求头 - Accept
String accept = request.getHeader("Accept");
System.out.println("accept:"+accept);
return "ok";
}
}

3.HTTP-响应协议
1)响应数据格式


重定向:客户端往服务器端请求失败时,返回3xx并回带B服务器端地址,然后重新请求B服务器端,这是浏览器自动的行为。

这三个最重要,必须掌握!
2)响应数据获取
Web服务器对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。这样,程序员不必直接对协议进行操作,让Web开发更加便捷。

package com.itheima;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
public class ResponseController {
//方式一
@RequestMapping("/response")
public void response(HttpServletResponse response) throws IOException {
//1.设置响应状态码
response.setStatus(401);//状态码不用特别设定,一般浏览器会自动设定
//2.设置响应头
response.setHeader("name","itheima");
//3.设置响应体
response.getWriter().write("<h1>hello response<h1>");
}
//方式二:由Spring官方提供的响应对象ResponseEntity
@RequestMapping("/response2")
public ResponseEntity<String> response2(){
return ResponseEntity.status(401)//响应状态码
.header("name","itheima")//响应头
.body("<h1>hello response<h1>");//响应体
}
}
注:响应状态码和响应头如果没有具体要求,通常不手动设定。服务器会根据请求处理的逻辑,自动设置响应状态码和响应头。
三.SpringBoot Web案例
要求:基于SpringBoot开发一个Web应用程序,最终完成用户列表的渲染展示

package com.itheima.pojo;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
// @Data
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String name;
private Integer age;
private LocalDateTime updateTime;
// 全参构造器
public User(Integer id, String username, String password, String name, Integer age, LocalDateTime updateTime) {
this.id = id;
this.username = username;
this.password = password;
this.name = name;
this.age = age;
this.updateTime = updateTime;
}
// 手动getter方法
public Integer getId() {
return id;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
}
user.java
package com.itheima.controller;
import cn.hutool.core.io.IoUtil;
import com.itheima.pojo.User; // 需要导入User类
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@RestController//@ResponseBody-> 作用:将controller返回值作为响应体的数据直接响应;返回值是对象/集合->json->响应
public class UserController {
@RequestMapping("/list")
public List<User> list() { // 返回类型改为List<User>
//1.加载并读取user.txt文件,获取文件中的数据
InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");
ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());
//2.解析用户信息,封装成User对象->list集合
List<User> userList = lines.stream().map(line -> {
String[] parts = line.split(",");
Integer id = Integer.parseInt(parts[0]);
String username = parts[1];
String password = parts[2];
String name = parts[3];
Integer age = Integer.parseInt(parts[4]);
LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
return new User(id, username, password, name, age, updateTime); // 创建对象User
}).toList();
//3.返回数据(json)
return userList;
}
}
UserController.java

小结
1.静态资源存放的位置
- resources/static
2.@ResponseBody注解的作用
- 将controller方法的返回值直接写入HTTP响应体
- 如果是对象或集合,会先转为json,再响应
- @RestController = @Controller + @ResponseBody
四.分层解耦
1.三层架构



遵循单一职责原则,复用性强,方便维护
2.分层解耦
耦合:衡量软件中各个层/各个模块的依赖关联程度
内聚:软件中各个功能模块内部的功能联系
软件设计原则:高内聚低耦合


实现分层解耦的思路:
- 将项目中的类交给IOC容器管理(IOC,控制反转)
- 应用程序运行时需要什么对象,直接依赖容器为其提供(DI,依赖注入)
控制反转:简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称之为控制反转,容器可以称为IOC容器或Spring容器。
依赖注入:简称DI,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为Bean。
空指针的含义:空指针是编程中常见的概念,表示指针未指向有效内存地址。正确处理空指针可以避免运行时异常,提高代码健壮性。不同语言提供了多种机制(如可选类型、注解、静态检查等)来帮助开发者管理空指针问题。
3.IOC & DI入门

两步走:
1.将Dao及Service层的实现类,交给IOC容器管理。
2.为Controller及Service注入运行时所依赖的对象。



小结
1.@Component将一个类交给IOC容器管理,注意:是加在类上,而非接口上。
2.@Autowierd可以从IOC容器中找到
该类型的bean,然后完成依赖注入。
4.IOC详解
要把某个对象交给IOC容器管理,需要在对应的类上加如下注解之一:

注:声明bean的时候,可以通过注解的value属性指定bean的名字(一般不需要指定),如果没有指定,默认为类名首字母小写。
注意事项:
- 在Springboot集成Web开发中,声明控制器bean只能用@Controller
- 声明bean的注解要想生效,需要被扫描到,启动类默认扫描当前包及其子包
5.DI详解


@Resource 与 @Autowired区别
- @Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的
- @Autowired默认是按照类型注入,而@Resource默认按照名称注入
920

被折叠的 条评论
为什么被折叠?



