JavaWeb核心基础:Servlet生命周期、Request/Response与Session/Cookie 一.SpringBoot1.入门程序需求基于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/findAllnameOPPOstauts1。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(h1hello responseh1); } //方式二由Spring官方提供的响应对象ResponseEntity RequestMapping(/response2) public ResponseEntityString response2(){ return ResponseEntity.status(401)//响应状态码 .header(name,itheima)//响应头 .body(h1hello responseh1);//响应体 } }注响应状态码和响应头如果没有具体要求通常不手动设定。服务器会根据请求处理的逻辑自动设置响应状态码和响应头。三.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.javapackage 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 ListUser list() { // 返回类型改为ListUser //1.加载并读取user.txt文件获取文件中的数据 InputStream in this.getClass().getClassLoader().getResourceAsStream(user.txt); ArrayListString lines IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList()); //2.解析用户信息封装成User对象-list集合 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); // 创建对象User }).toList(); //3.返回数据json return userList; } }UserController.java小结1.静态资源存放的位置resources/static2.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默认按照名称注入