第4章 后端Web基础(基础知识)

发布时间:2026/10/7 9:50:36
第4章 后端Web基础(基础知识) 一、SpringBoot Web入门静态资源服务器上存储的不会改变的数据通常不会根据用户的请求而变化。比如HTML、CSS、JS、图片、视频等(负责页面展示)动态资源服务器端根据用户请求和其他数据动态生成的内容可能会在每次请求时都发生变化。比如Spring框架、已过时ServIet、JSP等(负责逻辑处理B/S架构Browser/Server浏览器/服务器架构模式。客户端只需浏览器应用程序的逻辑和数据都存在服务器端。(维护方便 体验一般)c/S架构Client/Server客户端/服务器架构模式。需要单独开发维护客户端。体验不错 开发维护麻烦1、概述官网spring.ioSpring发展到今天已经形成了一种开发生态圈Spring提供了若干个子项目每个项目用于完成特定的功能。以Spring Framework为中心将Spring Framework简化为Spring BootSpringBoot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。官方推荐 企业主流2、入门程序1创建项目2pom.xml文件内容目前了解即可!--父工程-- parent/parent ​ !--项目的坐标和描述信息-- ​ !--Java的版本-- properties/properties ​ !--引入依赖版本已在父工程中管理过-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webmvc/artifactId /dependency ​ !--单元测试依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webmvc-test/artifactId scopetest/scope /dependency ​ !-- SpringBoot的打包插件-- build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build3创建请求处理类package com.itheima; ​ RestController //标识当前是一个请求处理类 public class HelloController { ​ RequestMapping(/hello)//请求路径 public String hello(String name){ System.out.println(Hello Controller ... hello name); return Hello name ~; } ​ }浏览器访问结果4启动类package com.itheima; ​ SpringBootApplication public class SpringbootWebQuickstartApplication { ​ public static void main(String[] args) { SpringApplication.run(SpringbootWebQuickstartApplication.class, args); } ​ }5整个项目的管理配置文件resources目录下的application.properties文件3、官方骨架连不了解决方案将国外的地址改为国内的阿里云的地址使用魔法也可以4、入门解析起步依赖有starter标识spring-boot-starter-web:包含了web应用开发所需要的常见依赖。spring-boot-starter-test:包含了单元测试所需要的常见依赖。官方提供的starter:Spring Boot Reference Documentation引入web就会引入关于web开发的所有依赖。得益于Maven的参数传递Maven引入的这两个依赖二、HTTP协议1、概述概念Hyper Text Transfer Protocol超文本传输协议规定了浏览器和服务器之间数据传输的规则。特点1.基于TCP协议面向连接安全2.基于请求-响应模型的一次请求对应一次响应3.HTTP协议是无状态的协议对于事务处理没有记忆能力。每次请求-响应都是独立的。缺点多次请求间不能共享数据。优点速度快2、请求协议-数据格式1请求数据格式请求头和请求体中间隔了一个空行2GET和POST的区别请求方式-GET请求参数在请求行中没有请求体如/brand/findAll?nameOPPOstatus1。GET请求大小在浏览器中是有限制的。请求方式-POST请求参数在请求体中POST请求大小是没有限制的。3请求头中的key介绍Host请求的主机名User-Agent浏览器版本例如Chrome浏览器的标识类似Mozilla/5.0...Chrome/79IE浏览器的标识类似Mozila/5.0 (Windows NT... like GeckoAccept表示浏览器能接收的资源类型如text/*image/*或者*/*表示所有Accept-Language表示浏览器偏好的语言服务器可以据此返回不同语言的网页Accept-Encoding表示浏览器可以支持的压缩类型例如gzipdeflate等。Content-Type请求主体的数据类型。 Content-Length请求主体的大小单位字节。3、请求协议-请求数据获取Web服务器(Tomcat)对HTTP协议的请求数据进行解析并进行了封装(HttpServletRequest)在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作让Web开发更加便捷。RestController public class RequestTestController { ​ RequestMapping(/request) public String request(HttpServletRequest request){ // 1.获取请求参数name, age String name request.getParameter(name); // Tom ​ // 2.获取请求路径uri 和 url String uri request.getRequestURI(); // /request String url request.getRequestURL().toString(); // http://localhost:8080/request ​ // 3.获取请求头 User-Agent String userAgent request.getHeader(User-Agent); // Mozilla/5.0 (Windows NT 10.0; Win64; x64) ​ // 4.获取请求方式 String method request.getMethod(); // GET ​ // 5.获取请求的查询字符串 String queryString request.getQueryString(); // nameTomcatage10 ​ return request success; } }小结1HTTP请求数据需要程序员自己解析吗?不需要Web服务器负责对HTTP请求数据进行解析并封装为了请求对象2如何获取请求数据?HttpServletRequest对象里面封装了所有的请求信息4、响应协议-数据格式1响应数据格式2五类状态码状态码大全状态 | Status - HTTP 中文开发手册 - 开发者手册 - 腾讯云开发者社区-腾讯云3响应体的key介绍5、响应协议-响应数据设置Web服务器对HTTP协议的响应数据进行了封装(HttpServletResponse)并在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作让Web开发更加便捷。方式一、HttpServletResponse原生写法RestController public class ResponseController { ​ RequestMapping(/response) public void response(HttpServletResponse response) throws IOException { // 1.设置响应状态码 response.setStatus(401); // 2.设置响应头 response.setHeader(itheima, itheima); // 3.设置响应体 response.getWriter().write(h1Hello Response/h1); } }方式二ResponseEntity封装写法Spring推荐RestController public class ResponseController { ​ RequestMapping(/response) public ResponseEntityString response() { return ResponseEntity.status(401) // 1.设置响应状态码 .header(group, itcast) // 2.设置响应头 .body(h1Hello Response/h1);// 3.设置响应体 } }注意 响应状态码和响应头如果没有特殊要求的话通常不手动设定。服务器会根据请求处理的逻辑自动设置响应状态码和响应头。三、SpringBoot Web案例1、准备工作创建一个SpringBoot工程并勾选web依赖、lombok。引入资料中准备好的用户数据文件user.txt)及前端静态页面。定义一个实体类用来封装用户信息2、开发服务端程序接收请求读取文本数据并响应。3、具体操作流程1创建项目勾选两项并Create创建没用的文件删掉2引入数据和静态文件3定义实体类数据类型用包装类不要用基本数据类型因为基本数据类型要赋初始值在资源文件夹下创建pojo文件夹创建User实体类Data//代替set、get方法 NoArgsConstructor//代替无参构造 AllArgsConstructor//代替有参构造 public class User { private Integer id; private String username; private String password; private String name; private Integer age; private LocalDateTime updateTime; }4整体项目加载hutool依赖用于加载并读取txt文件dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version5.8.27/version /dependency创建控制层文件在UserController文件中操作文件将文件内容拆分ResponseBody注解的作用将controller方法的返回值直接写入HTTP响应体如果是对象或集合会先转为json再响应RestController Controller ResponseBodyRestController public class UserController { ​ RequestMapping(/list) public ListUser list(){ //1.加载并读取文件 InputStream in this.getClass().getClassLoader().getResourceAsStream(user.txt);//获取文件 ArrayListString lines IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList());//将文件装入集合并接收返回值。参数为输入、字符类型、装入集合 ​ //2.解析数据封装成对象 -- 集合 ListUser 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); }).collect(Collectors.toList()); ​ //3.响应数据 //得益于RestController注解 return userList; } }以上代码复用性差、难以维护四、分层解耦用于解决以上代码复用性差、难以维护的问题1、三层架构将以上代码拆解成这三层1每一层的职责controller控制层接收前端发送的请求对请求进行处理并响应数据。service业务逻辑层处理具体的业务逻辑。dao数据访问层(Data AccessObject)持久层负责数据访问操作包括数据的增、删、改、查。2创建三层架构创建controller文件夹、创建service文件夹、创建dao文件夹在dao数据访问层创建接口和实现类在service业务层创建接口和实现类将以上单文件中的代码分解到这些分层的文件中2、解耦思路IOC与DI介绍1内聚与耦合耦合衡量软件中各个层/各个模块的依赖关联程度。内聚软件中各个功能模块内部的功能联系。软件设计原则高内聚低耦合。高耦合的原因每一层都new其它层的对象降低高耦合创建一个容器用于装每一层产生的对象其他层在容器中调用该对象。用到的技术包括控制反转和依赖注入2分层解耦的思路控制反转Inversion Of Control简称IOC。对象的创建控制权由程序自身转移到外部容器这种思想称为控制反转。依赖注入Dependency Injection简称DI。容器为应用程序提供运行时所依赖的资源称之为依赖注入。Bean对象lOC容器中创建、管理的对象称之为Bean。3、IOC与DI入门将Dao及Service层的实现类交给IOC容器管理。为Controller及Service注入运行时所依赖的对象。在Dao及Service层实现类上面加Component注解表示交给了IOC容器管理注意是加在实现类上而不是接口上在Controller及Service层实现类下面加Autowired注解表示从DI容器中获取了对象4、IOC详解1其他控制反转的注解除了使用Component注解交给IOC容器还提供了其他三个注解注意 声明bean的时候可以通过注解的value属性指定bean的名字如果没有指定默认为类名首字母小写。RestController已经包含了Controller2组件扫描注解前面声明bean的四大注解要想生效还需要被组件扫描注解ComponentScan扫描。该注解虽然没有显式配置但是实际上已经包含在了启动类声明注解SpringBootApplication中默认扫描的范围是启动类所在包及其子包。规范启动类裸露在外面5、DI详解一常见的依赖注入方式1.属性注入企业常用2.构造函数注入3.setter注入6、DI详解二Autowired注解默认是按照类型进行注入的。如果存在多个相同类型的bean将会报出如下错误1方案一Primary加在被注入的类上。用于提高优先级2方案二Qualifier加载注入的类上表示选择哪个类注入3方案三Resource将方案二的两个注解合并为一个注解Resource与Autowired区别?Autowired是Spring框架提供的注解而Resource是JavaEE规范提供的Autowired默认是按照类型注入而Resource默认是按照名称注入