• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

JAVA如何构建一个动态网站?

Tomcat 彭东稳 8年前 (2016-08-15) 31247次浏览 已收录 0个评论

在学习Tomcat前,需要先了解Java这门语言JAVA编程语言介绍,其次应该要知道CGI技术以及Java是如果构建一个完整的动态网站?然后再去学习Tomcat容器。

在Web发展初期,只有静态页面处理能力。比如我们所熟知的Apache、Nginx服务器都是web服务器,它们有一个共同特点就是只能处理静态请求。也就是说,只能把本地的现成的html,css之类的东西传给浏览器,然后经过浏览器渲染成一个web页面。事物总是不断发展,网站也越来越复杂,所以出现动态技术,也就是我们今天所说的动态网站技术。而动态网站的成功是离不开CGI(Common Gateway Interface)公共网关接口技术的出现。

CGI(Common Gateway Interface)公共网关接口是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规范。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI程序使网页具有交互功能,但需跟web服务在同一台主机上面运行,不能够夸主机通信。CGI的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI之所以称之为通用网关接口,主要特点就在于CGI程序可以是Python脚本,PERL脚本,SHELL脚本,C或者C++程序等。

那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中,然后CGI程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样,整个过程结束。

大概工作流程图如下:

JAVA如何构建一个动态网站?

通俗点解释,CGI处理流程如下图:

JAVA如何构建一个动态网站?

CGI程序可以是Python脚本,PERL脚本,SHELL脚本,C或者C++程序等。

CGI模式在处理用户请求时,机制如下:

1. 每当客户请求CGI程序的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程,CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程,这也是CGI最为人诟病的fork-and-execute模式。

2. CGI方式的服务器上有多少请求就会有多少CGI子进程,每个子进程都需要启动CGI解释器,加载配置等初始化操作。这也是CGI性能低下的主要原因,当用户请求稍微一多,会大量挤占系统资源,如内存、CPU等。

由于CGI不安全以及性能极其低下的问题,由此衍生了很多其他分支,比如FastCGI(PHP语言使用)。比如ISAPI(Internet Server Application Program Interface)是微软提供的一套面向WEB服务的API接口,它能实现CGI提供的全部功能,并在此基础上进行了扩展。还有比如Python语言使用的WSGI等。现在的CGI基本没人使用,都是使用各自语言基于CGI标准衍生的更优的网关接口。另外多数流行的Web Server都支持FastCGI,WSGI;包括Apache、Nginx和lighttpd等。目前介绍的几种网关协议WSGI也好,FastCGI也好都是Python跟PHP语句在CGI协议基础上分支出来的动态网站处理协议。那么Java又是如何实现的呢?

Java支持的动态网站程序(applet/servlet/.jsp)

伴随互联网爆炸式的增长人们对于动态网站的需求越来越迫切,后来Java就在它的类库程序中提供了一个applet小程序,但是这个程序是在客户端执行的,也就是说客户端需要安装JRE运行环境。程序员把编译好的applet小程序嵌入到HTML语言中。用户需要下载HTML和编译好的applet到本地,再利用JRE执行结果显示在本地网页于是动态网站也就这样诞生了。

这种方式带来的危害:客户端需要安装JRE,程序在客户端执行带来的安全危害,高带宽的网络占用。后来CGI(通用网关接口)协议技术诞生后,Java对动态网站的支持也就发生改变了。

Web服务器只能处理静态内容,如HTML+PHP组成的动态网站,用户如果访问的是静态内容则直接由web服务器返回。如果访问的是动态内容则由web服务器根据CGI技术开启一个进程交由能够处理PHP的程序来运行,然后返回给用户。但是这种执行后的数据是没有格式和编排的,无法格式化成一级标题和链接等,那么在显示给浏览器时,这些样式从哪里来呢?在CGI技术上它没有办法提供说显示的标签是由web服务器提供而执行的数据和处理结果是由PHP程序提供,所以所有的程序都只能由后端的PHP程序来生成。由此HTML文档只能通过PHP程序员给它echo或print出来才能加以显示(当然PHP程序不需要这样,因为PHP足够先进可以自己直接处理它的显示了)。这样一来,当HTML发生改变时整个源程序都需要重新编译一次(动态内容发生改变时必须要重新编译的),我们缓存下来的opcode都有可能失效,所以这就后来出现了MVC框架将展示、数据、业务分来处理;将PHP直接嵌入到HTML中这样一样HTML就不需要让语言本身来处理了。

Java引入CGI技术后又开发了另外一个特殊类叫servlet,而servlet就是以Java语言实现的CGI技术,能够使java开发动态页面并且能够以CGI技术跟前端web服务器通信,以Java代码来开发网站必须遵循servlet规范。Servlet本身能接收HTTP请求理解HTTP协议,并且能够将这个程序的执行结果以HTTP的报文格式封装起来再通过前端响应给客户;所有这样一来它就能够理解HTTP协议和HTML的规范了,从此以后用servlet也可以开发动态站点了。但是同时也受CGI的限定、并且对所有的代码编码都是硬编码。Java代码中打印HTML,就算是HTML文档也得由java输出,这样一来对Java程序就要求甚高了,Java程序员不光要写Java代码,同时也要会前端技术并且要把前端技术跟Java代码很好地编排到一起去才能写出一个好看的动态web页面。所以Java这时候也需要一种类似PHP中MVC框架的实现将数据、展示、业务分开。于是就在servlet上实现了一种类.JSP(Java server page)技术,可以让Java直接以标签的方式嵌入到HTML中的一种网页开发技术,也为实现MVC框架打下基础,不用让语言本身来处理HTML了。

JSP开发的网页还是得编译成servlet风格的编码.java文件(servlet类的文件),但是这个不需要程序员的参入由jasper进行处理将jsp开发的网页.jsp文件编译成Java程序.java文件,然后再由servlet(Java C编译器)将.java编译成Java class的.class文件在JVM中运行。

Servlet container就是包含Jasper和servlet及JDK的一个web容器,通过Jasper将.jsp编译成.java文件然后通过CGI技术把.java文件传递给servlet负责接收然后通过JDK编译(依赖Java API公共类)成Java class并在JVM中执行,将执行结果响应给用户。

在系统中不管是servlet container还是servlet或Jasper都表现为一个JVM进程,也就是一个JVM实例。JVM开启多线程负责处理用户请求都在JVM内部进行处理。

Java技术流派

Java从1.2版本开始,就拆分了如下三个技术流派:

J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;

J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境,可写C/S架构程序,主要就是JDK提供的,可以简单理解为JDK就是J2SE技术;

J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器,J2EE技术包含了J2SE技术,也就是在JDK的基础之上同时还包含了Servlet、JSP、EJB、JMS、JMX、JavaMail等类库,这是一个浩大的工程,它们都是以类库的形式提供,但默认没有被JDK所包含,所以也就在J2SE技术之外了,属于J2EE。

什么意思呢?

如果你学习J2SE那么你可以写这种C/S架构的程序是没有问题的,但是如果你想写B/S架构的Web应用程序那么就需要在J2SE的基础上还要会Servlet技术、JSP技术等才可能写出一个Web应用程序。如果应用于大型网站开发技术的话,还会用到EJB、JMS、JMX等技术。

那么如果你学习了J2EE技术,使用Java编写了一个动态web站点,那么此时如果有一个组件提供了JDK、同时提供了Servlet以及JSP,那么我们就称它为Java web容器(类似PHP应用程序服务器)。但是需要注意的是JDK技术有开源的OpenJDK以及Sun JDK可以使用,但是Servlet以及JSP技术或规范(就是说如果运行动态网页应该提供这个一个类库)谁提供呢?也就是说你要真正提供这么一个类你需要自己写代码去实现它了,所以就有很多公司或组织就专门来实现这一类代码,而后并把他们整合在JDK之上从而提供一个Servlet容器或Web容器。

上面说了,Java官方的J2EE不仅提供了JDK,还提供了Servlet、JSP、JMX、JMS、EJB、JavaMail等类库。所以市面上有些公司或组织没有实现这所有的功能,只实现了其中一部分。如果有有些公司或组织在JDK的基础之上(JDK开源了,不需要重新写代码),再参考Sun公司给出的Servlet、JSP规范开发出Servlet和JSP的代码实现,那么这个组件就称之为Web容器,可以用来运行Java开发的动态站点了。

其实目前市面上这类实现有很多种了,比如商业实现:最著名的属于IBM公司的WebSphere容器,是IBM公司提供的企业级J2EE容器,它提供了JDK并且在里面提供了Servlet、JSP、JMX、JMS、EJB等各种J2EE所需要的类库实现。另外一个比较出名的商业产品就是Weblogic,属于BEA公司的,但是现在已经被Oracle收购了。还有如Oc4j、Glassfish、Geronimo、Jboss等等,JBoss已经被RedHat收购了。当然除了商业实现之外,也有开源实现,如Apache基金会的Tomcat,但Tomcat只实现了J2EE众多类库中的一部分;以及resin、jetty都是用来运行Java web容器。

当你了解了Java的发展时间线、及Java代码的运行方式、及JDK和JRE的作用区别、及Jvm虚拟机的作用及运行时区域、及Servlet和JSP技术的作用、及一个Java web容器的实现方式后。就可以去学习不管是商业产品WebSphere、还是开源产品Tomcat了。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!