java Web工作原理

来源:互联网 发布:opta数据查询 编辑:程序博客网 时间:2024/06/06 09:45

1.1解析http协议

HTTP是一种超文本传送协议(HyperText Transfer Protocol,是一套计算机在网络中通信的一种规则。在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议顶层。HTTP是一种无状态协议,意思是指在Web浏览器(客户端)和Web服务器之间不需要建立持久的连接。整个过程就是一个客户端向服务器端发送一个请求(Request),然后Web服务器返回一个响应(Response),之后连接就关闭了。HTTP遵循请求/响应(Request/Response)模型的。所有的通信交互都被构造在一套请求和响应模型中。浏览WEB时,浏览器通过HTTP协议与WEB服务器交换信息,Web服务器向Web浏览器返回的得文件都与之相关的类型,这些信息类型的格式由MIMEMultipurpose Internet Mail Extensions)定义;

注:MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。

HTTP定义的事物处理由以下四步组成:

1.客户端和Web服务器建立连接;

2.客户端发送HTTP请求;

3.服务器端接收客户端的HTTP请求,生成HTTP响应回发;

4.服务器端关闭连接。客户端解析回发响应,恢复页面;

 

 

 

1.1.1建立连接

我们在浏览器地址栏输入http://127.0.0.1\lovobook\index.html,敲回车,客户端就打开了到Web服务器的HTTP端口的一个TCP Socket套接字。因为在网络中间作为传递数据的实体介质就是网线,数据实质上是通过IO流进行输出和输入;

Java底层代码可以实现实现Socket,只不过浏览器已经帮我们做了。

 

1.1.2发送信息

一但建立了TCP连接,Web浏览器就会向Web服务器发送请求指令。HTTP将来自客户端的请求信息封装成HTTP请求,它包括请求行、请求头、消息体以及以及分隔请求头和消息体之间的一个空行。

 

1)请求行

请求行是一个ASCII文本行,由三个标记组成,请求的HTTP方法、请求的URLHTTP版本,中间用空格分开。

HTTP版本1.1中,定义了有八种可能的HTTP请求方法:

1.GET:用于向服务器检索资源。

2.POST:用于向服务器发送数据,并要求指定的URL处理。

3.HEAD:与GET方法相同,服务器只返回状态行和头标,并不返回请求文档。

4.PUT:请求服务器保存请求数据作为指定的URL新内容。

5.DELETE:请求服务器删除URL中命名的的资源。

6.OPTIONS:请求关于服务器支持的得请求方法信息。

7.TRACE:请求Web服务器反馈HTTP请求和其标头。

8.CONNECT:已文档化但当前来未实现的一个方法,预留做隧道处理。

2)请求头

HTTP协议使用HTTP头来传递请求的元信息。HTTP头是一个用冒号分隔的名称/值对,冒号前面是HTTP偷得名称,后面是HTTP头的值。常见的请求头由用户代理资料、可以接收的格式、语言以及内容编码,这些信息用于告诉服务器客户端是什么,客户端想要得到什么格式的回馈信息。

3)空行

发送回车符和退行,通知服务器以下不再有请求头。

4)消息体

HTTP请求中带有查询字符串时,如果是GET方法,查询字符串或表单数据附加在请求行中,那么消息体中就没有内容;如果是POST方法,查询字符串或表单数据就添加在消息体中。

 

1.11.回送响应信息

Web服务器解析请求,定位并读取指定的资源http://127.0.0.1\lovobook\index.html,将文件及其他信息组成HTTP响应返回到客户端。HTTP响应包括:状态行、响应头、消息体以及分割消息体和响应头-的一个空行。

1)状态行

每个HTTP响应以一个状态行开头。状态行由HTTP协议版本、响应状态码和响应描述组成,三者之间用空格分隔。

响应状态码是一个三位数字,它分为如下几个组:

1xx:信息,请求收到,继续处理。

2xx:成功,行为被成功地接受、理解和采纳。

3xx:重定向,为了完成请求,必须进一步执行的动作。

4xx:客户端错误,请求包含语法错误或者请求无法实现。

5xx:服务器错误,服务器不能实现一种明显无效的请求。

2)响应头

响应头与与请求头一样,也是一个用冒号分隔的名称/值对,冒号前面是HTTP头的名称,后面是HTTP头的值。典型的响应头包括内容类型描述、内容长度、时间邮戳、服务信息、内容最后一次响应更新。

        3)空白行

最后一个响应头之后是一个空行,发送回车符和退行,表明以下不再有请求头。

4)消息体

要发送回客户端的HTML文档或其他要显示的内容等。Web服务器把要发送给客户端的文档消息放在消息体里。

 

1.1.4关闭连接

HTTP响应到达客户端后,浏览器先解析HTTP响应中的状态行,查看请求是否成功的状态代码。然后解析每一个响应头,读取响应消息体,将消息体渲染在浏览器页面上。

一个HTML文档可能包含其他的需要被载入的资源,浏览器会识别,并对这些资源再进行额外的请求,这个过程一直循环到所有的数据都按照响应头中规定的的格式恢复到页面中。数据传送完毕,服务器端关闭连接,即无状态协议。

 

1.2Web服务器的缺陷

1.只能向客户端提供静态网页内容

2.增加一个辅助应用生成动态页面

 

1.3服务器端网页编程

Web服务器创建动态服务器端内容的我过程,我们称为服务器端网页编程。服务器端网页编程的技术有多种,包括最早的CGI技术、微软的ASPASP.NET技术、基于JavaServlet/JSP技术等。

 

1.3.1最早的解决方案

CGI即通用网关接口(Common Gateway Interface),是最早用于创建动态服务器端内容的一种技术。使用CGIWeb服务器可以将客户端的请求传递给一个外部程序,这个外部程序可以执行、创建动态内容,并响应传递给客户端。

 

CGI最大优点是它可以用ShellPerlCPHPPython等编写 

CGI最初是被设计来作为Web服务器与外部应用程序进行通讯的标准方法,用于产生动态网页的功能实际上是设计目标的次要结果。使用CGI作为Web服务器的辅助应用时,每次请求一个CGI资源,将在服务器上创建一个新的进程(Process),并通过标准输入和环境变量将信息传递给该进程。

 

 

 

每次请求就打开一个CGI进程,严重消耗服务器资源。极大地限制了一个服务器可以支持的并发CGI用户数量 .

 

1.3.2 Java的解决方案

Java的世界里,Servlet以及Web容器,被设计来解决CGI的问题,为Web开发者创建一个健壮的服务器端环境。

 

 

1)Servlet

Servlet是一个在Web服务器端或者应用服务器端运行的Java程序,主要用于在服务器端产生动态内容。与我们学习过的其他Java技术一样,Servlet是与平台无关的Java类,能够编译成平台中立的字节码,从而被基于Java技术的Web服务器动态装载和运行。

 

import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();

        out.println("<html>");

        out.println("<head>");

        out.println("<title>Hello World!</title>");

        out.println("</head>");

        out.println("<body>");

        out.println("<h1>Hello World!</h1>");

        out.println("</body>");

        out.println("</html>");

 

1Servlet是常规Java代码。代码中用了一些新的API,但是不涉及新的语法。

2Servlet代码中有我们不熟悉的重要语句。Servlet不属于J2SE,它属于单独的规范。

3Servlet对标准类(HttpServlet)进行了扩展。

4Servlet没有main()方法。

 

Servlet的主要任务:

1)读取客户端发送的显式和隐式数据。客户端发送的显示数据(包括最终用户在网页HTML表单中输入的数据以及查询字符串)、以及隐式数据(HTTP信息)都被封装在HTTP请求中。

2)生成结果。在此过程可能要访问数据库、执行RMIEJB调用、调用Web服务,或者直接计算得出对应的响应。实际数据可能存储在关系型数据库中。该数据库可能不理解HTTP,或者不能返回HTML形式的结果,所以Web浏览器不能直接与数据库进行会话。即使它能做到这点,为了安全上的考虑,我们也不希望它这样做。因此,我们需要Web中间层从HTTP流中提取输入数据,与应用程序会话,并将结果嵌入到文档中。

3)向客户端发送显示数据(即文档)和隐式数据(HTTP响应数据)。这个文档可以用各种格式发送,包括文本(HTMLXML)、二进制(GIF图像),甚至可以建立在其他底层格式上的压缩格式,例如GZIP。但是,到目前为止,HTML是最常用的格式,所以Servlet的重要任务之一就是将结果包装到HTML中。显示数据和隐式数据最终都被封装在HTTP响应中。

 

2)Web容器

容器对Servlet的支持包括:

通信支持。利用容器提供的方法,我们能轻松的让ServletWeb服务器对话。不用我们自己建立的ServletSocket、监听某个端口、创建流等。容器知道自己与Web服务器之间的协议,所以我们的Servlet不用担心Web服务器和我们自己的Web代码之间的API。我们要考虑的只是如何在Servlet中实现业务逻辑。

生命周期管理。容器在控制Servlet的生与死。它会负责加载类、实例化和初始化Servlet、调用Servlet方法,以及使Servlet实例能够被垃圾回收。有了容器的控制,我们就不需要太多的考虑资源管理了。

多线程支持。容器会自动地为它接受的每个Servlet请求创建一个新的Java线程。针对客户的请求,如果把Servlet已经运行完相应的HTTP服务方法,这个线程就会结束。由服务器创建和管理多个线程来处理多个请求,可以让我们省掉很多工作。

JSP支持。容器会自动把JSP翻译成为Servlet Java代码。

处理安全性:Java Web应用程序通常需要实现安全性控制,限制用户可以访问的资源。SUM Servlet规范中规定Web容器必须实现访问权限控制,这样我们在编写Servlet程序时,就不用考虑安全性问题,Web容器会帮我们完成。

 

Servlet规范

规范只定义了一个容器必须实现的标准功能

Servlet容器有很多不同的实现

Tomcat

Jboss

WebLogic

WebSphere

Oracle9i AS

 

3)ServletWeb容器配合处理请求和响应

CGI类似,Servlet允许一个请求被一个程序处理,并且使用同样的程序产生动态的响应。此外,Servlet特别定义了一个有效的生命周期,使得单个进程管理所有请求成为可能。它消除CGI进程缺陷,允许主进程在多个Servlet和多个请求之间共享资源。

 

 

 

Web服务器应用软件(例如Apache)得到一个指向Servlet的请求时,服务器不是把这个请求交给Servlet本身,而是交给部署该Servlet的容器。容器创建一个ServletRequest对象和一个ServletResponse对象,用户请求的参数封装在request对象中,然后传递给ServletServlet将响应结果写到了ServletResponse对象中,交给容器再传回给用户。

 

 

 

 

 

1)客户端向Web服务器发起一个HTTP请求。

 

2HTTP请求被Web服务器接受,如果请求的是静态页面,则由Web服务器负责处理。如果请求的是Java Web组件(Servlet或者JSP),则移交给Web容器。Web容器可以在主机的同一个进程、不同的进程或其他的Web服务主机的进程中启动。

 

3Web容器根据Servlet的配置文件确定调用的具体Servlet类,并把request对象、response对象传给它。

 

4)Servlet通过request对象知道客户端的使用者是谁,客户的请求信息是什么和其他的一些信息。Servlet处理完请求后把要返回的信息放入response对象返回到客户端。

 

5)一旦Servlet完成了请求的处理,Web容器就会刷新response,把控制权返回给web服务器。

 

1.4 Java Web 应用程序的组成

规范规定Java Web应用程序主要由如下部分组成:

配置文件:每个Web应用程序包括一个配置文件web.xml。这个配置文件以有效的结构化的方式控制Web应用程序的资源。Web应用程序使web.xml对外部访问者不可见,同时提供一个地方来私有的存储其他定制配置信息。

静态文件和JSPWeb应用程序的主要用途是服务于WWW上的内容。内容包括ServletJSP等动态资源,同时包括html页面等静态资源。Web应用程序自动管理部署在其中的JSP和静态资源。

类文件和包:Web应用程序装载和管理自定义的Java代码。对于Servlet等给定应用程序的类文件,有个指定的位置来存放,容器从该位置装载和管理编译了代码。Web应用程序定义了一个相同的位置来存放Java包和jar文件。

 

说明:

网页(无论是静态的html,动态的jsp可以放在Web应用的根目录下,也可以放在如jsphtml这样的子目录下。

图像文件经常会放在images的子目录下。不过这是一种习惯,不是必须。

Servlet类、javaBean类、标记处理程序类和其他类文件都放在WEB-INF/classes目录下。

lib目录用来包含应用程序任何所需要的jar文件、如数据库驱动、上述类的压缩包。

标记描述器放在WEB-INF目录下,如果有多描述个文件,通常放在tld目录下。

Applet程序放在应用的目录下。而不是放在WB-INF下。

WEB-INF目录下存放web.xml部署描述文件。

 

1.5 Web容器Tomcat介绍

源自于Apache软件基金会Jakarta项目

满足ServletJSP规范要求

能独立成为一个Web服务器

也是ServletJSP的容器

0 0