javaweb阶段一

Web

对于web来说,其实本质上就是两台计算机之间的资源交互,包括静态资源和动态资源。通过http协议或者是https协议来进行信息交互,通过http协议规定数据格式,然后服务器端也实现了HTTP协议的数据解析;tcp的三次握手、四次挥手来进行交互建立起来连接。这是计算机之间的资源交互,所谓的资源本质上就是010101数据片段的交互。

计算机和计算机之间的交互的五层协议(IOS七层协议)已经提供好了,操作系统也提供了交互的接口。那么对于计算机来说,计算机和计算机之间的交互也就是软件和软件之间的交互,每个软件启动之后会占用一个端口号,通过端口号来进行数据的传输。

在传输过程中,HTTP协议规定了数据的格式,也就是说相当于是提供了一份模板数据,每个用户不同的数据就相当于是在上面进行了自定义的填充操作,然后 另外一台计算机接收到了之后,也会按照相同的方式来进行解析。获取得到里面的数据。

这份协议对人类来说是可见的:对于一个请求来说,tomcat服务器分成了请求行、请求头、请求体;对于响应来说,tomcat分为了响应行、响应头和响应体。

通常来说,都是bs架构的。所以通过请求行、头、体我们可以告知接收请求的服务端客户端的一些信息;通过响应行、头、体可以告知客户端浏览器可以用来做一些什么事情。

所以说双方已经约定好了需要做的事情,那么接下来就是按照需要来完成响应的操作,仅此而已。

不管对于请求还是响应来说,我们只需要注意的是客户端和服务器端如何对交换的二进制数据来进行处理。

类似之前说过的数据类型,内存中存储的都是0101的代码数据,那么如何来对这些01代码来进行分析处理,这是一个问题。

所以java中也通过请求头和响应头来指定了这些信息。

比如说流,也就是文件的上传和下载。在进行文件上传的时候,浏览器端已经明确了文件的类型了,需要告知服务器端,我要上传的是图片、Word等,那么服务器查看是否支持这种格式的解析,如果支持,那么就对其来进行接收和处理。所以不支持,那么就可以给一个错误的响应。所以我觉得既然协议是人规定的,那么就一定规定了对何种数据来进行何种的解析,这一点需要明确好。

请求的时候浏览器会告知服务器,自己有哪些能力能够接收到能够接收到的数据;而不管发送过去的数据服务器端能够进行接收;

服务器端做出处理之后,会告知浏览器端如何来对服务器响应的这些数据来做出响应。如果浏览器支持的话,那么就直接对数据进行处理。这个时候,是客户端对浏览器返回来的数据进行的处理了。而不是服务器端该去考虑的问题了。

对于请求来说,我们可以在浏览器端抓包显示。

对于请求方式来说,常用的是有两种方式:GET/POST,也可以有其他的,但是对于浏览器端来说,暂时只是支持这两种方式:

所以这个时候有需要涉及到一些区别了:

对于get方式来说:1、显示请求参数;2、数据量较少(根据浏览器实现);

对于post方式来说:1、将请求参数封装到请求体中去;2、数据量较大;3、在请求头中会多封装两个参数。一个是数据量大小,另外一个是请求内容的类型,这两个字段是必须的。对于大数据量来说都会使用post方式提交。

可以使用抓包来进行处理说明:

其实最开始学习tomcat的时候,对里面的servlet特别的不理解。什么是运行在服务器端的一个程序

这段代码是我在写这篇笔记的时候才想明白的。运行在服务器端的程序(servlet)是用来接收浏览器端发起的请求的,是对客户端发起的请求来进行处理的。具体的是什么样的请求,这个在之后会通过代码慢慢的来进行解释。

但是后来总结下servlet和普通的java程序的区别:

因为tomcat服务器作为服务器端,总是需要来对服务器端提交过来的数据来进行处理。所以对于来自服务端的请求来说,那么必须得做一个处理。那么这里处理类就是servlet接口的实现类。通常我们使用Http这种类型的类来解决这种使用方式。

所以这就要求了servlet的运行需要依赖于tomcat服务器环境。

总结起来三点:接收请求并做出响应处理类实现servlet接口必须有tomcat环境

对于servlet的生命周期,这里是有必要来介绍下。

对于每个servlet实例来说,是由tomcat来做一些实例化,然后来进行赋值的。在一个应用中,servlet是单例多线程

也就是说如果在servlet中定义共享变量,那么将会造成线程安全问题。

servlet容器默认是采用单实例多线程的方式处理多个请求的:
1. 当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
2. 容器初始化Servlet。主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池;通过web.xml,初始化每个参数值等等);
3. 当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread)调度它管理下的线程池中等待执行的线程(Worker Thread)给请求者;
4. 线程执行Servlet的service方法;
5. 请求结束,放回线程池,等到被调用;
由以上可得。。线程不是servlet本身。而是tomcat服务器从线程池中分配一个线程。。然后执行httpservlet的dopost方法。。本身是线程不安全的。

但是通常来说,1、2两步在服务器启动的时候已经做好了这件事情,当请求来的时候直接进入了第三步。

在多线程条件下,大量的线程都会调用一个servlet对象的doService方法。线程在执行方法的时候,都将会将方法中的对象的创建转移到线程工作内存中去。

但是如果当前的servlet对象存在着成员变量,如果在doService方法中都操作这个成员变量,而对这个成员变量来说,就已经是线程之间共同操作的变量了。

所以这个时候就存在着线程安全问题。那么这个时候可以根据场景来进行使用。

比如说ThreadLocal(线程隔离操作)、lock、syncronized关键字(后面两个是同步操作)来进行操作。

servlet的生命周期,如果没有配置的话,那么在第一次访问的时候被创建,通过Init方法,然后调用service方法来进行处理,当服务关闭的时候进行销毁方法,这个destroy方法类似垃圾回收机制中的算法。

init、service、destroy

这个和filter的很像。

介绍下常用的请求头、请求体,响应头、响应体

以及servlet的方法介绍:

public interface Servlet {
    // servlet的初始化方法。通过Servletconfig对象,我们可以拿到当前的servlet的任意信息。
    // 常见的比如是:servelet名字,路径等等
    void init(ServletConfig var1) throws ServletException;

    // 获取得到这个servlet配置对象的。可以看到这里我们是可以来自己进行定义的
    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
	
    // 获取得到一些具体的信息而已
    String getServletInfo();

    void destroy();
}

ServletContext对象,是整个项目的一个对象,也就是说一个web项目的对象。

我们可以往整个项目对象中来存储数据,或者是获取得到资源的类型、获取本机中的资源以及全局的配置参数等等。整个感觉还是有点用处的。

存储数据这一块来说,我们通过是不会来占用tomcat服务器的资源来进行使用的。

我们可能大多数就是获取得到文件的MIME文件或者是获取得到文件的路径等等方式

Filter中最容易理解的一句话就是:过滤器是一个运行在服务器的程序(和servlet及其类似), 但是区别是:优先于请求资源(Servlet或者jsp,html)之前执行.

这里的资源不管是动态资源还是静态资源都是资源,而客户端的需求是去服务器端来访问服务器端的资源。

所以我们需要在去请求获取得到资源之前做一些处理,也需要在后置阶段做一些处理。

这里面最常用的就是:权限校验,字符编码设置等等操作。有个著名的框架springsecurity就是基于这个过滤器来简历起来的。

而现在的项目中大多数都会在filter中放置一个ThreadLocal来进行token绑定,从请求头中来进行获取token,然后和redis中的key来作比较。

还剩下一个Cookie和Session而已。一个是存在于客户端,一个是存在于服务器端。

但是存在客户端的cookie被认为是不安全的;存在于服务器端会被认为是占用tomcat服务器资源。

所以对于cookie来说,现在几乎不怎么去进行使用了;而对session来说,现在采用了redis来进行代替。

posted @ 2021-08-29 23:58  写的代码很烂  阅读(50)  评论(0编辑  收藏  举报