盒子
盒子
文章目录
  1. 先简单列一下与服务器的交互过程。
    1. 访问url
    2. 服务器响应
    3. 返回处理结果
  2. 访问URL
    1. servlet
  3. 服务器响应
    1. 实现servlet
      1. javax.servlet.Servlet接口
      2. javax.servlet.GenericServlet类
      3. javax.servlet.http.HttpServlet类
    2. servlet的生命周期
    3. 返回处理结果
    4. JSP

从 url 访问服务器资源讨论 javaweb 中的 servlet

先简单列一下与服务器的交互过程。

  • 1 访问URL
  • 2 服务器响应
  • 3 返回处理结果

访问url

① 浏览器开始解析地址,把地址分为域名和路径(如果有的话),然后连接DNS服务器,查询这个域名的IP地址。

  • DNS提供的服务就是将域名转换为其服务器的ip地址。

② 获得DNS返回的ip地址后,浏览器开始按照http协议的格式向该ip地址(服务器)和路径请求内容。

  • 1,浏览器如何把提交的数据封装成http协议格式
    • 相关内容:TCP HTTP
  • 2,数据在网路中怎么流到服务器
    • 相关内容:DNS代理,CDN,IP地址,路由,网络结构

服务器响应

③服务器收到某个http请求后,就会把内容按照http协议的格式返回这个请求的客户端。

  • 3,服务器是怎么解析和处理数据的
    • 相关内容:http各种服务器知识 服务器相关语言知识(java,python等) 数据库(SQL NOSQL)等
  • 4,处理结束后的结果是怎么封装在http协议中返回的
    • 相关内容:http 各种web服务器知识

返回处理结果

④浏览器收到服务器返回的内容后,开始渲染并显示出来。

  • 5,浏览器得到数据后,又是怎么处理http响应的
    • 相关内容:http 浏览器
  • 6,浏览器和js怎么处理响应数据,dom如何渲染数据
    • 相关内容:dom js引擎

⑤浏览器与服务器对话结束

从第一步开始谈:

访问URL

一个完整的url是由协议,域名,端口,文件路径四个部分组成的。

比如我输入http://localhost:8080/index.html,

http代表协议,localhost代表域名,8080是端口,/index.html是文件路径。

当我们访问该url地址时,会返回服务器中物理文件index.html的内容,然后浏览器将内容渲染并展示出我们所看到的网页内容。

这里的index.html是静态网页文件,当我们需要采用动态网页开发技术时可以采用jsp,jsp是一种建立在Servlet上的动态网页开发技术。

例如我们打开一个页面,该页面由servlet处理,返回了各种数据,显示在网页上,即动态网页开发。

servlet

servlet就是运行在web服务器端的Java程序,通常用于:

  • 接受数据请求
  • 处理请求
  • 完成响应

我们可以把请求交给一个servlet处理,比如提交一个表单给一个表单处理servlet,servlet处理后(往往是与数据库的交互)返回处理结果。

我们也可以直接访问servlet。不过创建好的servlet只有映射成虚拟路径,客户端(浏览器)才能对其进行访问。

映射方式是在web.xml下如下配置:

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>Servlet名称</servlet-name>
<servlet-class>servlet完整类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet名称</servlet-name>
<url-pattern>servlet对外访问的虚拟路径</url-pattern>
</servlet-mapping>

在web.xml配置文件中将url地址与servlet联系起来。

http://localhost:8080”将请求导向服务器,这里用“localhost”意思就是导向本地的服务器。在服务器中有软件程序监听着端口。url剩余的部分,即文件路径,是由服务器来处理的。

WEB服务器根据请求的文件路径在web.xml配置文件中查找路径所对应的映射信息,然后来访问servlet。

不过当我们像上面那样访问index.html时,并没有对该路径进行映射呢?这时候其实是访问的默认servlet(缺省servlet)。默认servlet用于处理其它servlet都不处理的请求,也就是说,servlet服务器在接收到访问请求时,如果在web.xml文件中找不到匹配的 元素的url,就会将访问请求交给默认servlet处理。当我们访问服务器上的某个静态html文件或者图片时,实际上都是在访问这个默认servlet。

①在地址栏输入url后,浏览器会搜索自身的DNS缓存,看自身的缓存中是否有www.xxx.com 对应的条目,而且没有过期,如果有且没有过期则解析到此结束。

②如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。

③如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件,看看这里面有没有该域名对应的IP地址,如果有则解析成功。

④如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器发起域名解析请求,运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。

⑤域名解析的整个过称就是寻址的过称,解析到对应的IP地址之后,就开始搜寻该物理机上的文件目录

上面两段参考知乎答案 在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?

服务器响应

这一步需要我们自己编写servlet来处理请求。

实现servlet

  1. 实现javax.servlet.Servlet接口;
  2. 继承javax.servlet.GenericServlet类;
  3. 继承javax.servlet.http.HttpServlet类;

javax.servlet.Servlet接口

该接口从设计上采用了设计模式中的模板模式,定义了几个接口和抽象类。通过实现该接口来实现servlet,需要实现该接口的五个方法。

该接口定义了三个生命周期的方法:

1.init()

2.service()

3.destory()

以及另外两个返回servlet相关信息的方法。

三个生命周期方法将在servlet对象特定的状态下被WEB服务器调用。

因为实现该接口必须实现接口定义的所有方法,包括某些不用的方法也得实现。所以就有了使用更为方便的javax.servlet.GenericServlet类。

javax.servlet.GenericServlet类

该类采用了缺省适配器模式,是实现了servlet接口所有方法的类,只不过方法体为空。我们通过继承此类实现servlet,只需重写需要的方法即可。

此类中只有service()属于抽象方法,当我们通过继承此类实现servlet时只需要重写这一个方法即可,其它方法可重写可不重写。

此类除了实现了servlet接口的方法,还定义了一些其它的方法。

javax.servlet.http.HttpServlet类

HttpServlet类是GenericServlet类的子类,抽象程度更高。

web应用与客户端的交互方式有http等多种协议,不过大多数web应用使用的都是http协议。HttpServlet类专门创建应用于Http的servlet。

在此类中,重写了service()方法,通过请求的不同,定义了不同的doXXX()方法。

同样,在Http中,最常用的请求方式使get和post,所以我们通过继承此类编写servlet时,重写doGet(),doPost()方法即可。

servlet的生命周期

若Http请求要访问servlet,服务器首先会解析请求,检查内存中是否已经有了该Servlet对象,若有则直接使用,若无则创建,并调用init()方法实现Servlet的初始化工作。

每一次访问该Servlet,调用一次service()方法。http请求要求访问,服务器为这个请求创建代表http请求的ServletRequest对象和代表http响应的HttpResponse对象,将他们作为参数传给Servlet的service()方法。service()方法从ServletRequest对象中获得客户请求信息,并进行处理,再由ServletResponse对象生成响应结果。

Serlet一旦被创建,会驻留在内存中等待客户端的访问,知道服务器关闭或web应用被移出服务器时,Servlet对象才会被销毁。

返回处理结果

我们可以通过Servlet利用输出流把Servlet处理的结果(如返回的数据)直接显示出来,以此动态生成Html页面,但是这样如果需要稍微排下版的话,就不得不自己打印输出很多的HTML标签。这样还将静态显示的内容和动态产生内容的代码混合在一起了。

JSP

jsp通过在标准的HTML页面中插入java代码,其静态部分不需要java程序控制。

jsp是servlet的一种特殊形式,每个jsp就是一个servlet实例,jsp页面由系统编译成servlet,servlet再负责响应用户请求。

当用户第一次访问jsp页面时,该页面都会被JsqServlet翻译成一个Servlet源文件,然后将源文件编译为.class文件。

Servlet源文件继承了HttpJspBase类,HttpJspBase类是HttpServlet类的一个子类。

jsp页面中将html和java代码耦合在一起,代码的可读性很差,难以修改和维护。

为了减少jsp里的java代码,调用javabean组件来显示数据。

不过这样jsp中还是有不少java代码。

于是推出了JSP EL来进一步减少jsp中的代码。


参考:Java Web中实现Servlet的方式

Web服务器怎么解析URL

怎么通过URL访问到服务器上的物理文件

在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?