后端基础04

发布时间:2026/7/15 18:34:44
后端基础04 一springBoost入门1spring创建一idea是旗舰版要钱的假设idea是旗舰版要钱的就直接在file选择new然后选择module模块直接选择spring boost然后选择maven还有jdk版本spring boost版本还有输入文件名设置文件存储的地址二idea是社区版免费的直接去官网https://start.spring.io/选择maven语言是java然后springboost版本号组织名字文件名...反正大概这个样子最后要选择Spring web这个是基础东西必须有2springboost快速入门代码大概就是这样子的基础入门小代码为什么直接运行这个小代码就可以在浏览器访问服务器//需要定义这个方法上一个请求类 RestController public class HelloController { //创建一个注解用于指定网址的路径 RequestMapping(/hello) //这个name就是前端传递回来的参数 public String hello(String name){ System.out.println(name : name); //返回给前端页面然后会在浏览器打印出来 return hello name~; } }原因就是我们引进来的jar包tomcat其实是一个已经实现的服务器只要有这个包然后运行代码那么就会启动这个编写好的服务器然后就直接可以连接上浏览器这个是java使用最多的服务器二http协议1http概念就是指定数据的传输规则这样浏览器就知道用什么格式发送给服务器服务器以什么格式解析2http在浏览器的开发者工具显示一请求类1第一行表示请求行第一个get表示发送数据类型请求路径http协议的版本号2第二行开始往下就是请求头以 键值 为结构3假设使用post方法发送数据那就还有请求体二响应类第一行响应的协议http然后1.1表示版本200表示类似响应码就表示响应成功第二行往下就是响应头以 键值 结构然后响应体被单独划分到另一个地方叫response返回结果hello heima3http协议请求数据一请求数据的格式请求行数据的第一行请求头以 key value形式以下就是请求头的key的意义请求体只有是post传递方式才有与请求体之间空了一行二请求数据的获取web服务器Tomcat对http协议的数据请求数据进行解析并封装到httpServletRequest在调用controller传递了该方法这样就不需要去处理因为tomcat已经处理好了//注解申明rest控制器 RestController public class requestController { //注解申明请求处理方法并且申明访问地址 RequestMapping(/request) public String request(HttpServletRequest request){ //获取请求的方式 String method request.getMethod(); System.out.println(请求方式method); //GET //获取请求的url地址完整地址 String url request.getRequestURL().toString(); System.out.println(请求url地址url); //http://127.0.0.1:8080/request //获取请求的uri地址用户填写的地址 String uri request.getRequestURI(); System.out.println(请求uri地址uri); ///request //获取请求协议 String protocol request.getProtocol(); System.out.println(请求协议protocol);//HTTP/1.1 //获取请求参数--name age String name request.getParameter(name); String age request.getParameter(age); System.out.println(name:name); System.out.println(age:age); //获取请求体--accept String accept request.getHeader(accept); System.out.println(请求体accept:accept); return ok; } }4http协议响应数据一响应数据的格式和请求的格式差不多就是响应行响应头响应体1状态码1XX就是客户端和服务端建立长时间的连接就会显示1XX的状态码2XX就是连接成功的意思常见是2003XX就是当前访问的方式错误但是服务端还是成功接收然后返回状态码3XX然后附加一个正确的地址local新地址然后浏览器自动访问这个新的地址不知道为什么没有成功看到可能是因为浏览器自带的保存查询的地址所以无法看到4XX就是访问不存在的地址常见就是4045XX就是服务器那一边出问题常见500响应头和响应体之间必须有一行空行二响应方式两种方式1获取http的对象HttpServletResponse然后设置其内容//方法一获取HttpServletResponse对象然后设置响应数据 RequestMapping(/response1) public void response1(HttpServletResponse response) throws IOException { //设置状态码 response.setStatus(HttpServletResponse.SC_OK); //表示200的状态码 //设置响应头 response.setHeader(Content-Type,heima); //设置响应体 response.getWriter().write(h1response ok/h1); }2直接设置自带的对象ResponseEntity使用链式结构设置//方法二使用ResponseEntity返回类型对象直接设置个对象就行 RequestMapping(/response2) public ResponseEntityStringresponse2(){ return ResponseEntity .status(200) // .header(Content-Type,bey) .body(h1response ok/h1); }注意状态码和状态头就不需要自己设置这些会自动设置而且假设自己设置有可能会出错三第一个前后端的小案例1案例的思路and后端逻辑案例用户通过查询对应的地址然后访问浏览器然后浏览器向服务端发送请求信息服务端就是我们的电脑然后读取到用户端的请求后在去自己本地的文件内获取数据将数据预处理读取数据切割数据然后存储到一个集合集合装着对象user然后直接返回给前端代码前端代码获取到服务器的数据后将数据进行解析然后输出显示到浏览器2显示到浏览器的原理将前端代码放置到idea编辑器的resource的文件夹下面然后放置到static文件夹能够显示到浏览器的原因就是因为这个是SpringBoost的框架实现的SpringBoost框架是将静态资源被浏览器访问到所以就会在所在的文件夹就是resource的文件夹下搜索文件static文件比如user.html文件然后将文件以http的形式传输到浏览器最后浏览器解析文件内容显示图像3后端代码的实现//使用注解表示获取用户的请求信息 RequestMapping(/list) //在前端有const result await axios.get(/list);表示请求的地址 public ListUser list()throws Exception{ //逻辑 //先获取本地文件的数据 //想要获取resource文件内的user的数据可以使用类加载器 //先获取当前的类的字节码然后获取其加载器然后在获取resource下user的文件 InputStream resourceAsStream this.getClass().getClassLoader().getResourceAsStream(user.txt); //使用第三方包hutool包来快速读取数据,参数一输入流参数二编码参数三集合 ArrayListStringlines IoUtil.readLines(resourceAsStream,UTF-8,new ArrayList()); //将数据进行切割然后封装成User对象 //使用stream流代码简洁一点 ListUser users lines.stream() .map(line-{//分割字符串然后将分割后的数据添加到对象user内 String[]userInfoline.split(,); Integer idInteger.parseInt(userInfo[0]); String usernameuserInfo[1]; String passworduserInfo[2]; String nameuserInfo[3]; Integer ageInteger.parseInt(userInfo[4]); LocalDateTime updateTimeLocalDateTime.parse(userInfo[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return new User(id,username,password,name,age,updateTime); }).toList(); //最后直接返回User对象所在的集合 return users; }4小问题为什么直接返回user对象的集合就能让浏览器接收到JSON格式的数据原因就是因为 RestController 的注解因为RestController 注解底层其实是两个注解合并在一起的ControllerResponseBody而ResponseBody就是关键注解能将数据转化为 JSON 格式的数据类型就是转化为 String 的集合作用会在SpringBoost的方法的返回值通过消息转化器将集合对象等等数据转化为 JSON 格式的数据再以 http 的形式将数据发送回前端四三层架构1层数的划分刚刚所写的代码是直接将所有功能都放在一起这样代码的复用性差代码的修改难度大所以需要将代码分成书写而刚刚实现的逻辑就有获取用户请求体and响应体数据的读取逻辑操作所以可以将代码分成三层就叫做单一责任原则而我们数据读取还可以创建一个接口来统一数据读取的结构同理逻辑操作也可以用一个接口来同一操作2代码实现这样实现能使代码结构更加清晰复用性好代码修改也简单impl的文件夹就是用来实现接口的实现文件dao就是数据的读取service就是逻辑操作比如对数据的预处理controller表示对用户端的响应和接收projo表示一些对象用于数据存储的对象SpringboostWeb01Application表示主方法运行这个就可以运行所有代码一读取数据的实现类//继承接口同一实现方式 public class daoUser implements dao { Override public ListString readInfo() { //先获取本地文件的数据 //想要获取resource文件内的user的数据可以使用类加载器 //先获取当前的类的字节码然后获取其加载器然后在获取resource下user的文件 InputStream resourceAsStream this.getClass().getClassLoader().getResourceAsStream(user.txt); //使用第三方包hutool包来快速读取数据,参数一输入流参数二编码参数三集合 ArrayListString lines IoUtil.readLines(resourceAsStream,UTF-8,new ArrayList()); return lines; } }二数据处理的逻辑实现部分public class serviceUser implements service { //创建dao的实现类 daoUser daoUsernew daoUser(); Override public ListUser handleInfo() { //需要先获取数据--所以需要调用刚刚创建好的daoUser类 ListString lines daoUser.readInfo(); //将数据进行切割然后封装成User对象 //使用stream流代码简洁一点 ListUser users lines.stream() .map(line-{//分割字符串然后将分割后的数据添加到对象user内 String[]userInfoline.split(,); Integer idInteger.parseInt(userInfo[0]); String usernameuserInfo[1]; String passworduserInfo[2]; String nameuserInfo[3]; Integer ageInteger.parseInt(userInfo[4]); LocalDateTime updateTimeLocalDateTime.parse(userInfo[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return new User(id,username,password,name,age,updateTime); }).toList(); //最后直接返回User对象所在的集合 return users; } }三用户的请求读取和响应//使用注解表示这个方法是获取用户的rest RestController public class UserController { //使用注解表示获取用户的请求信息 RequestMapping(/list) //在前端有const result await axios.get(/list);表示请求的地址 public ListUser list()throws Exception{ //创建刚刚实现的service对象 serviceUser service new serviceUser(); ListUser users service.handleInfo(); //最后直接返回User对象所在的集合 return users; } }五分层解耦1概念耦合就是衡量软件的 各层/各个模块 之间的关联程度内嵌软件中各个功能模块内部的功能联系2解耦原因原因刚刚实现的小代码内部各个代码之间的联系是通过 new 一个对象来实现的但是假设其中的一个代码的名字进行修改那么与之关联的代码也需要修改这样就是耦合性太高不便于后期代码的修改维护所以需要解耦减少耦合性增加关联性3解耦思路创建一个容器用于存储所有方法的对象统一管理然后假设需要使用某一个方法就不要使用 new 对象 的方法而是使用这个容器来获取对象控制反转简称 IOC对象的创建控制权由程序自身转移到外部容器依赖注入简称 DI容器为应用程序提供运行时所依赖的资源Bean对象IOC 容器中创建管理的对象称之为 Bean4实现先将类的上面添加一个注解Component注意是加在实现类上面的将new的对象去掉然后给需要使用其他类的上面添加一个Autowired5IOC分类和使用ioc容器可以分为四个componentcontrollerservicerepository四个容器但其实其他三个都是component的衍生假设不关注代码的实现目的都将注解写为component原则上是没有问题但是不符合规范最好还是按照代码的实现逻辑来选择注解注意声明bean的时候可以通过注解的value属性来指定bean的名字如果没有就默认是类名的首字母小写细节前面声明bean的四大注解想要生效需要被组件扫描注解ComponentScan扫描该注解虽然没有显示配置但是实际上已经包含在了启动类的声明注解SpringBoostApplication中默认扫描的就是启动类所在的文件夹及其子包的代码比如启动类的文件夹是com.itheima那么com.itheima下的子文件夹controllerdaopojoservice都有申明注解componentScan所以不需要再次手动声明6DI的使用分三种情况但实际开发最多使用第一种而springBoost官方推荐就是第二种主要看以后公司要求追求快速开发和简洁就使用第一种追求结构上的规范性和代码的逻辑性就使用第二种一DI 的使用选择假设某一个接口有多个类实现然后在另一个类内使用多态的方法调用这个接口其中还是用依赖注入那么依赖注入自己就不清楚哪一个类是我们真正要注入的那么代码就会报错那么就要声明我们要注入的类是哪一个方法有三个第一种只要标记的类上有这个注解那么假设有多个类实现同一个接口那么优先注入有这个标记的类第二种在调用其他类的接口上面就可以声明要注入的类是哪一个名字细节名字就是类名的首字母小写第三种和第二种一样就是你要注入的类你就先声明你要哪一个前提多个方法实现同一个接口细节名字要求一样首字母要小写以下是第二种方案我感觉这个可以使用的比较广以下是方法三二三个方法之间的区别1依赖注入的注解Autowired 默认按照类型自动装配如果同类型的bean存在多个PrimaryAutowired QualifierResource2Autowired 和 Resource 区别Autowired 是springBoost自带的方法注解Resource 是javaEE规范提供的Autowired 是根据类型进行匹配的Resource 是根据类名进行匹配的