目录
1、Session的作用就是用于标识不同的客户端,避免请求混淆。
2、session保存作用域和session实例是相互绑定的
一、后端接收请求的本质
servlet接口中定义了service方法,它可以自动根据不同的请求方法(GET/POST等)调用doGet、doPost等方法。
具体过程:
1)客户端发送HTTP请求,这个请求会被Tomcat等的容器接收
2)容器根据请求的URL寻找对应的servlet并通过反射的方法实例化servlet,举例:接收/add请求,通过反射找到servlet中的AddServlet,由此找到AddServlet类对象
<servlet>
<servlet-name>AddServlet</servlet-name>
<servlet-class>com.xubx.servlet.AddServlet</servlet-class>
</servlet>
<!--反射:mapping -->
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
3)tomcat容器调用Servlet的service()方法,service会调用对应的doGet、doPost方法
4)处理结束后,需要通过响应对象设置响应状态码、响应头、响应体等信息
5)tomcat容器获取到响应信息,将其打包成HTTP响应报文返回给客户端
二、Servlet的生命周期
Servlet的生命周期有三个:初始化阶段(init)-->服务阶段(service)-->销毁阶段(destroy)
其中服务阶段可以重复进行多次,初始化和销毁只执行一次。
单例中线程不安全:
三、Session会话
1、Session的作用就是用于标识不同的客户端,避免请求混淆。
HTTP协议本身是无状态的,每次请求对服务器独立,无法区分不同客户端。
服务器需要一种机制识别不同客户端,以保证各客户端请求不混淆。
当客户端第一次请求时,服务器会创建一个唯一标识的session对象给客户端,客户端之后的每次请求都会带上这个session,服务器通过Session ID来判断请求属于哪个客户端,这样就能防止请求混乱。
2、session保存作用域和session实例是相互绑定的
session保存作用域与每个session绑定,不同浏览器访问的session区域是隔离的
即每个浏览器只能访问对应自己那个session的存储数据,它们之间是隔离的,确保了数据只在指定的客户端中可见,不会互相影响。
四、服务器内部转发和客户端重定向
服务器内部转发
只有一次响应的过程,对于客户端而言,内部经过了多少次转发,客户端是不知道的,并且url不会改变。
客户端重定向
两次请求响应的过程,即客户端重新向另一个接口发送请求
五、Thymeleaf:网页中渲染数据的Java模板引擎
Tymeleaf是用于渲染页面的,即 将后端数据显示在前端页面上,实现了前后端的解耦后端只需要传入数据模型,页面渲染的工作完全交给Thymeleaf来完成。
thymeleaf与前后端分离的异曲同工之处
1. Thymeleaf仍属于后端渲染页面的一种实现,需要后端服务器支持。纯前后端分离是前端直接请求后端接口,不依赖服务器渲染。
2. Thymeleaf通过模板使前端代码更少,开发效率更高。纯分离前端需要自行处理渲染逻辑。
3. Thymeleaf可以避免前端直接操作后端接口的安全隐患。
4. 但Thymeleaf也依赖后端部署,不如纯前后端分离对前后端代码解耦度高。
六、从Servlet底层到框架
总体概述
1. 最初阶段,一个请求对应一个Servlet类,类数量爆炸。
2. 后期阶段,合并请求到一个总Servlet类中,通过operate参数区分请求,使用switch-case选择方法,代码混乱。
3. 再后期阶段,使用反射技术,operate的值直接映射到方法名,简化代码。
4. 最后阶段,引入中央控制器DispatcherServlet,根据url找Controller,operate映射方法,实现请求转发和业务解耦。
Controller的处理也分为获取参数、执行方法、视图处理等步骤。
整个过程体现了软件开发从单一到复杂再到简洁抽象的过程,逐步降低耦合,提高内聚和扩展性。
各阶段详细过程
最初阶段:一个请求对应一个IndexServlet,AddServlet等类,
Url请求为:index.do,add.do,edit.do等等
下一阶段,全部集中在一个中心FruiltServlet接收请求的类中,(根据url中携带的operate的值来选择调用方法)请求为统一的:fruilt.do再加一个同意参数operate=add,edit等等
总结:将各AddServlet等类抽离到一个中心FruiltServlet服务类中,由中心服务类进行各功能的调用,各方法只执行对应的功能。
下一阶段,将中心类改为控制类FruiltController不再接受请求,由统一接收请求的DispathcherServlet类中央控制器进行管理。此中央控制器接受的请求为:fruilt.do,hello.do等等,再通过xml配置文件找到对应的控制类FruiltController,HelloController。
总结(抽离controller组件中的方法调用):将fruiltServlet服务类改成控制类并抽离到DispathcherServlet服务类中,抽离了调用方法的功能,直接在中央控制器中进行调用控制类中的方法,控制类中只保存方法,进一步完善各方法中只进行业务的处理。
下一阶段,将Controller中的视图处理和获取参数抽离出来,即不在Controller中进行页面的跳转、重定向和参数的获取,在中央控制器中进行视图处理和参数获取,此时已经完成在各方法中只进行业务的处理。