web后端开发——Springbootweb(包含HTTP、Tomcat、请求的各种参数解释、响应以及分层解耦)

张开发
2026/4/16 18:17:58 15 分钟阅读

分享文章

web后端开发——Springbootweb(包含HTTP、Tomcat、请求的各种参数解释、响应以及分层解耦)
目录Springbootweb快速入门HTTP请求协议响应协议协议解析Web 服务器Apache TomcatTomcat-基本使用SpringBootWeb快速入门运行解析请求响应请求简单参数实体参数简单实体参数复杂实体参数数组集合参数日期参数Json参数路径参数响应分层解耦三层架构分层解耦IOCDI入门IOC详解DI详解b站上黑马程序员的课程笔记Springbootweb快速入门HTTP超文本传输协议规定了浏览器和服务器之间数据传输的规则。浏览器给服务器发送请求服务器解析这些数据后给客户端浏览器响应这些数据浏览器也同时需要解析这些数据。怎么解析呢无论是请求数据的解析还是响应数据的解析都是需要一致的格式来解析这些数据的格式都是由HTTP协议规定特点1、基于TCP协议面向连接安全2、基于请求-响应模型的一次请求对应一次响应3、HTTP协议是无状态的协议对于事务处理没有记忆能力每次请求-响应都是独立的。缺点多次请求间不能共享数据优点速度快请求协议请求方式-GET请求参数在请求行中没有请求体。GET请求大小是有限制的。请求方式-POST请求参数在请求体中POST请求大小是没有限制的。响应协议协议解析根据我们前面所介绍的HTTP的请求格式来解析请求数据及响应数据对于客户端浏览器各大厂商已经给我们提供了里面内置了解析HTTP协议的程序。我们作为服务端开发工程师我们需要做的就是在服务器端通过java程序来接收客户端浏览器发起的请求并获取请求数据然后再参照HTTP协议的请求格式对请求数据进行解析然后还需要参照HTTP协议的响应数据格式给浏览器再响应对应的数据。接下来代码怎么在服务器端怎么解析HTTP的数据并且给浏览器响应数据呢首先HTTP协议是标准的是统一固定的所以解析HTTP协议的代码也都是通用的这里就不展示了因为我写不出来有几万行很多公司都已经把这些代码写好了并且还封装到软件程序也就是web服务器比如jetty、webLogic、webSphere以及最流行的Apache Tomcat中供我们使用。这样的话我们就不用直接对HTTP协议进行操作比如解析、处理等我们只用关注当前项目的业务逻辑的实现来说一下大概的简单的思路1、在代码中创建服务器端对象ServerSocket2、调用accept方法用Socket来接收方法返回值等待客户端连接。3、连接之后调用线程线程要新建一个构造方法把accept方法中的返回的Socker客户端对象传递给它。4、在run方法内调用socker中的getInputStream接收数据与getOutputStream为了响应数据方法获取通道的输入流和输出流。再把这两个流用BufferedReader与BufferedWriter包装起来作用加快传输效率并且能一次读一行数据注意要指定用UTF-8编码。5、一次读取一行进行判断比如是否是Get/HTTP/1.6、如下Web 服务器Web服务器是一个软件程序对HTTP协议的操作进行封装使得程序员不必直接对协议进行操作让web开发更加便捷。主要功能是“提供网上信息浏览服务”。我们只需要在我们的服务器上安装一个Web服务器比如Apache Tomcat然后我们就可以将我们开发好的Web应用部署在Apache Tomcat服务器上启动服务器之后打开浏览器直接访问到部署在Apache Tomcat服务器上的应用程序。Apache Tomcat概念Tomcat是Apache 软件基金会一个核心项目是一个开源免费的轻量级Web服务器支持Servlet/JSP少量JavaEE规范。JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAFTomcat 也被称为 Web容器、Servlet容器。Servlet程序需要依赖于 Tomcat才能运行官网https://tomcat.apache.org/Apache Tomcat的目录如下要部署应用程序就要把应用程序放到webapps这个目录下。Tomcat-基本使用下载官网下载地址 https://tomcat.apache.org/download-90.cgi安装绿色版直接解压即可卸载直接删除目录即可启动双击bin\startup.bat控制台中文乱码修改conf/ logging.properties目录下java.util.logging.ConsoleHandler.level FINEjava.util.logging.ConsoleHandler.formatter org.apache.juli.OneLineFormatterjava.util.logging.ConsoleHandler.encoding GBK关闭直接x掉运行窗口强制关闭bin\shutdown.bat 正常关闭CtrlC正常关闭如果启动那么可以直接在本机浏览器的网址搜索框输入localhost:8080就直接是Tomcat的欢迎界面了。现在来说说特殊情况1、双击启动目录后Tomcat页面一闪而过应该检查JAVA_HOME环境变量是否正确配置。设置--搜索高级系统设置--页面中选到高级然后点击环境变量检查系统变量的JAVA_HOME的环境变量是否正确配置2、启动后报错BindException那么就是端口号冲突找到对应程序将其关闭。如果对应的程序正在使用不能关闭那么配置Tomcat端口号conf/Server.xmlConnector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /将8080修改以下就可以。HTTP协议默认端口号为80如果将Tomcat端口号改为80则将来访问Tomcat时则不用输入端口号。也就是如果将8080改为80那么以后是不用输入端口号的。Tomcat 部署项目把项目放到webapps这个目录下即部署完成。假如把一个Demo项目部署到这个目录下在浏览器网址框输入localhost:8080/Demo就可以访问这个Demo项目的程序了SpringBootWeb快速入门运行解析把项目一创建会关联到如图上的最上面URLstart.spring.io所以在创建项目时需要联网。在创建项目的时候我们会勾选web开发的依赖所以在创建Springboot中就会包含如下两个依赖然后可以看见依赖传递把tomcat依赖传递了进去。这个就是SpringBoot内嵌的Tomcat服务器。起步依赖根据传递依赖把需要开发某一个功能所常见的依赖聚合在一起spring-boot-starter-web包含了web应用开发所需要的常见依赖。spring-boot-starter-test包含了单元测试所需要的常见依赖。官方提供的starterhttps://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#using.build-systems.starters内嵌Tomcat服务器基于Springboot开发的web应用程序内置了tomcat服务器当启动类运行时会自动启动内嵌的tomcat服务器。由于内嵌Tomcat服务器所以在本文章最上面SpringBoot快速入门这个程序运行后会自动的将这个服务器启动起来并且占用它的默认端口号8080然后在浏览器中输入对应的网址就能访问到内嵌的Tomcat服务器的部署到里面的程序最终就拿到响应的结果。pom.xml中的一个小知识点请求响应如图浏览器会给web服务器发送一个请求https://localhost:8080然后web服务器解析请求数据再给一个响应。HTTP协议就规定了浏览器和服务器之间的传输规则。而我们的程序也就是文章最开头HelloController程序仅仅是一个简单的java类他没有实现任何接口也没有继承类这个程序Tomcat是不识别的也不能直接运行。Tomcat虽然不识别HelloController程序但是他识别JavaEE的规范程序Serverlet容器而我们基于SpringBoot开发的web入门程序当中SpringBoot底层给我提供了一个非常核心的Serverlet程序那就是DispatchServerlet它实现了Serverlet规范当中的Serverlet接口。所以DispatchServerlet就是一个可以被Tomcat识别的Serverlet程序有了DispatchServerlet以后前端浏览器发起的请求会先经过DispatchServerlet由DispatchServerlet再将请求转给各个XxxxxxController程序由Controller程序再对请求进行处理处理完毕后Controller程序再将处理玩的结果返回给DispatchServerlet那么DispatchServerlet再给浏览器响应数据。所以由此可见DispatchServerlet在web请求中是非常核心的一个类所以这个类在SpringBoot中称为核心控制器或者前端控制器。如何在DispatchServerlet服务器中获取请求的数据前端浏览器发送数据会携带HTTP的请求数据而web服务器负责请求协议的解析所以Tomcat服务器就会接收到这个服务器并对这个请求数据进行解析并且将解析后的所有请求数据封装到一个对象中这个对象就是HttpServletRequest也叫请求对象。我们的应用程序就在这个对象中获取请求数据然后再对请求进行处理处理完毕后Tomcat服务器需要根据HTTP响应数据的格式给浏览器响应数据如何响应呢通过HttpServletResponse对象来响应数据然后Tomcat就会根据我们在HttpServletResponse对象设置的响应信息来响应数据给浏览器。请求HttpServletRequest获取请求数据。响应HttpServletResponse设置响应数据。对于以上我们需要重点关注的是我们所编写的XxxxxController程序。请求当前主流的开发模式前后端分离。那么我们作为后端人员该怎么测试程序呢之前我们讲的浏览器地址栏所发起的请求全是Get请求直接在浏览器测试也行但是如果我们要测试Post请求该怎么办呢这就要借助一款功能强大的测试工具postman它是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。常用于进行接口测试在官网下载即可简单参数获取请求参数nameage原始方式SpringBoot方式代码如下RequestParam(name 给参数命名的名字,.......后面还有形参可以crltp在idea上看)实体参数简单实体参数上面介绍的简单参数是当前端传递多少个参数我们就要在方法中定义多少个参数如上代码只有两个参数但是如果传递了十个呢二十个呢那样岂不是很麻烦这时我们就可以把所有的请求参数封装到一个类中。但是这样就不能用RequestParam来给参数命名了只能是前端传递的是参数是什么那么这个类定义的成员变量必须和它保持一致简单来说请求参数名与形参对象属性名相同即可通过Pojo接收。代码实现User是标准的javabean类并且成员变量只有name、age。控制台输出用postman测试前者是前端正常的传递name和age后者是前端传递name2和age所以name是null如果前端传递的参数在这个类中没有定义不会报错或者这个类中有参数但是前端没有传递这个参数也不会报错。复杂实体参数数组集合参数数组把前端传递的两个参数game、java自动封装到hobby数组中集合默认会封装到数组里面加上RequestParam注解就会自动封装到集合中日期参数入职日期生日、操作时间等请求参数就是日期参数。Json参数在Js的时候讲过并且Json参数在前后端异步交互的时候使用得很多。Postman再发送请求的时候如何传递Json参数传递Json格式的请求数据我们需要把请求类型设置为Post因为Json格式的请求数据我们需要写在请求体中而携带到服务端的。设置Post并且选择raw并且在最后选择Json加上RequestBoby注解表示把Json格式的数据封装到user中。路径参数参数已经成为了URL的一部分。PathVariable注解是获取路径参数并且把参数绑定给方法中的形参获取单个路径参数获取多个路径参数响应之前我们定义的所有方法其实最后都有一个返回值这个就是给浏览器的一个响应。这个其实是依赖了一个比较核心的注解ResponseBody点击Consle之后点击最左边的show raw log就是如下界面上面一段是请求的数据下面是响应的格式最下面一行hello World!是响应格式里的响应体。代码可以看见响应结果种类很多前端拿到这写数据也不容易开发所以我们还应该改进一下把代码的响应结果统一Result类包含如上三个成员变量是一个标准的JavaBean类并且还要加上这三个静态方法举个例子在Postman响应的信息最后解释一下如上是两个功能接口每写一个这种的都是一个功能接口。分层解耦三层架构这是上个案例的代码文章中我没有把这个案例写出来可以看到如下代码的三层架构都在一个方法中复用性差。Controller先接收数据然后让逻辑处理但是数据还没有解析所以Dao又把文本拿到进行解析封装之后再给逻辑处理逻辑处理完毕之后Controller响应数据。Dao可能访问文件中的数据也可能访问数据库中的数据也可能访问别人给我们提供的接口中的数据实现方式有很多。然而我们要想灵活的切换各种实现我们在前面SE阶段讲到过我们可以通过面向接口的方式进行编程。拆分成三层架构的形式这里没有写接口的代码因为简单就不写了。分层解耦高内聚比如上面代码在EmpServiceA中仅仅只处理与员工相关的代码。耦合就是可以看到如上代码EmpController调用了empServer的方法而empServer调用了EmpDao中的方法。低耦合就是尽量的降低层与层之间、模块与模块之间的依赖、关联程度。最好是能接触耦合。怎么解除耦合呢把对象放到一个容器里每次要用了直接从容器里拿就不用再new了。对象怎么样交给容器来管理这就涉及了Spring中的控制反转容器怎么样为我们的程序来提供它所依赖的资源这也涉及到了Spring中的依赖注入。IOCDI入门通过IOC控制反转DI依赖注入。如下是两个注解的说明。如果说你写了两个类都是实现类EmpServer接口你想让哪一个类进行逻辑处理那么你就直接在那个类上加上Component注解把另外一个类的这个注解取消掉就好。还有注意Autowired是必须要有的另外一个类可有可无。IOC详解将对象的控制权交给IOC容器由IOC容器创建、管理这些对象。IOC这些对象也成为Bean对象。使IOC容器管理的对象生效的范围问题假如dao不在com.itheima这个包下就会报错处理方法在启动类上再加上如下注解参数一指明要扫描的包参数二当前包DI详解假如说你写了两个类都是实现类EmpServer接口一个是EmpServerA还有一个是EmpServerB并且两个上面都标注了Service注解那么就会报错。如下是原因以及解决方法Primary注解是你想让哪一个类生效直接在上面加上这个注解就可以了Qualifier注解在如下图位置指定并且在括号中指定IOC容器中的这个类的名字由于我没有指定名字所以默认是类名的首字母小写Resource注解是由JDK提供的想让哪个类的IOC管理的Bean对象生效直接如下方式指定名字就行重点

更多文章