1.1 Java是什么
Java是什么?回答这个问题就像是答复太太“这件衣服好看吗?”一样复杂。
对于这个问题,每一位使用过Java的朋友都有自己的理解和答案;而对于没有用过Java的朋友,你解释得越多,他越糊涂(幸好现在从事软件开发而不知道Java为何物的人已经是凤毛麟角,很少见了)。而我自己认为:Java可以是一个支撑平台(体系结构)、一种编程语言、一个编译运行环境,也可以是它们的组合体。
Java诞生之初,是作为嵌入式芯片的编程环境存在的,时至今日,Java已经拥有多个分支(变种)已经在其各自的领域内得到了广泛的发展。Application、Applet、Servlet、JSP、JavaBean每一个名字我们都耳熟能详,下面我们逐个了解一下这些成员。
1.1.1 Java大家庭
Application
通常我们所说的Java程序指的就是Java Application。和普通的Windows应用程序一样,Java Application通过虚拟机可以直接在Windows操作系统中运行。事实上它比Windows应用程序更加适应于Windows:结合相应的虚拟机(JVM)它可以在不同版本的Windows环境中运行,不论Windows98、Windows 2000或是Windows XP,甚至是Linux或UNIX。
良好的跨平台特性,使得Java Application成为那些需要跨平台使用的软件系统的不二选择(使用过Oracle数据库系统的朋友一定对它的安装程序和管理界面记忆犹新,它们正是用Java Application实现的)。
顺便说一句,使用传统的VB或是VC编写的Windows应用程序,都无法在Windows98和Windows2000平台运行,这种状况直到2003年微软(Microsoft)公司的.NET Framework及VS.NET推出才宣告结束。
但令人遗憾的是,尽管VS.NET采用了和Java同样原理的.NET Framework作为新一代应用程序的虚拟运行环境,有效地解决了程序的跨平台运行和移植的问题,但VS.NET并不能向下兼容,使大量以前用VB或VC编写的程序不具有跨平台能力。同时微软公司的VS.NET所编写的程序只能在不同的Windows版本之间跨平台移植,目前还无法将其移植到非Windows操作系统(如UNIX、Linux等)中。
Applet
Applet可以直接翻译为小应用程序。Java Applet就是用Java语言编写的这样一些小应用程序,它们可以直接嵌入到网页或者其他特定的容器中运行,并能够产生特殊的效果(比如嵌入网页中的Applet将受浏览器安全设置的影响,严格控制对访问本地资源的访问)。
Applet必须运行于某个特定的“容器”,这个容器通常是由浏览器担任的,也可以是通过各种插件,或者包括支持Applet的移动设备在内的其他各种程序来运行。
尽管Java Application具有很强的跨平台性,但由于其字节码的编译方式,使得其运行效率较低,而且其编制出的程序界面风格也与标准的Windows风格相差甚远,因此不少人最初认识Java都是从Java Applet开始的。
Java Applet可以嵌套在浏览器中实现图形绘制、字体和颜色控制、动画和声音的插入、人机交互、网络通讯等功能,与用户进行互动、显示动态的画面,还可以方便地、动态地和HTML页面进行数据交换,有效地弥补了Web应用交互能力弱和精密计算能力较差的缺点。
在浏览器中运行时,Applet还会遵循IE严格的安全限制,阻止潜在的不安全请求和操作(例如限制Applet对客户端文件系统的访问)。
Servlet
和Applet相对应,Servlet指的是在B/S(Browser/Server)结构中用Java编写的服务器端程序。
Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java Application不同,Servlet由Web服务器进行加载和管理。支持Servlet的Web服务器必须包含支持Servlet的Java虚拟机。
Servlet与Web服务器的关系类似于Applet与Web浏览器的关系,我们可以将Servlet想象成没有用户界面(faceless)的Applet。
目前,由于Java的流行,大多数Web服务器都支持Servlet,即使不直接支持Servlet的Web服务器,也可以通过附加的插件和模块来支持Servlet,这得益于Java的跨平台特性。另外,由于Servlet内部以线程方式提供服务,不必对于每个请求都启动一个进程,并且利用多线程机制可以同时为多个请求服务,所以Servlet的运行效率很高。
JSP
JSP(Java Server Pages)是由Sun MicroSystem公司在Java语言基础上开发出来的一种动态网页制作技术,其可使您在HTML页面中插入Java程序实现动态页面,并且支持和HTML的混合编写,不需要编译直接执行。用户可以使用普通的文本编辑工具来书写HTML语句,然后将动态部分用特殊的标记嵌入Java程序即可。
Sun MicroSystem公司首先推出Servlet,其功能强大,体系设计也很先进,但是其输出HTML语句的方式仍然沿用了传统CGI程序的作法:用命令逐行输出。从而使得在Servlet动态生成HTML时比较麻烦,因此微软的ASP一度成为动态网页编程的首选语言。
这促使Sun MicroSystem很快推出了类ASP的Java嵌套型语言:JSP。
JSP作为一种全新的网页编程技术,不仅提供了一种方便有效的动态网页制作方法,而且作为Java家族的一分子,它还具有一般Java应用良好的可移植性,这使得JSP页面可以在任何支持Java的应用服务器中运行。
JSP语言通过在HTML语法中嵌入JSP的Tag标签,从而大大简化和方便了网页的设计和修改,这使得源于Java的JSP语言很快地被广泛应用。然而对于多数大型Web应用程序的开发仍然需要Servlet和JSP搭配使用。
JavaBean
ASP通过COM来扩充复杂的功能,如文件上载、发送E-mail以及将业务处理或者复杂计算分离出来成为独立可重复利用的模块。JSP则通过JavaBean完成同样的功能扩充。
本书中的大部分组件都是通过JavaBean的方式来提供的。读者通过简单调用就可以完成各种强大、复杂的功能。
在开发的复杂程度上,COM的开发远比JavaBean复杂和烦琐,学会ASP不难,但学会开发COM却不容易。相比较而言,使用JavaBean对系统功能进行扩充则较容易实现。而且在后期维护的时候,COM组件必须在服务器上注册后方可使用,如果对COM组件进行了更新,就必须在注册表中对组件进行重新注册。更新COM组件的注册过程,对很多程序员来说都是一段不愉快的经历。
所幸的是JavaBean并不需要注册,只要将其放置在CLASSPATH所包含的目录中就行了。对JavaBean进行修改和更新,对绝大多数应用服务器(如JSWDK和Tomcat)来说,只要重新启动服务,就可以载入最新版的组件。
JavaBean是完全的面向对象程序(OOP),可以针对不同的业务处理功能方便地建立一整套可重复利用的对象库,例如用户权限控制、E-mail自动回复等。
JavaScript
首先需要明确的是:JavaScript不是Java大家庭的成员。
我们在这里对JavaScript进行介绍的主要原因是:
1.JavaScript在B/S结构的浏览器中被广泛应用;
2.很多初学者将Java和JavaScript分辨不清。
Applet、Servlet、JSP和JaveBean都是Java在不同环境中的表现形式,尽管他们对标准Java的支持程度各有不同,但他们都是Java的一种分支,秉承着Java的全部特性,支持同样的标准,共同由Java虚拟机JVM解释执行。
而JavaScript除了在编程语法上和Java的书写格式有很大的相似性,以及命名中包含了Java字样外,和Java并无关系。
JavaScript是一种脚本语言,它无法编译成字节码,自然也不需要JVM的支持,是由浏览器对其解释执行的。
1.1.2 Java相关技术
MVC与Struts
MVC是Model(模型)/View(视图)/Controller(控制)的缩写。在我们真正了解MVC之前,我们先来看看我们为什么需要使用MVC构架,以及MVC能给我们带来哪些令人激动的新特性。
在MVC的概念深入人心和Struts广为流传之前,大部分Web应用程序都是用ASP、PHP、JSP这样的过程化语言来创建的。它们将从数据库中检索出来的数据和HTML这样的表示层代码混在一起编写后,由浏览器展示给最终客户。
这样编写的程序代码像面条一样,将服务器端的程序代码和表示层的标签混在一个文件中编写,为程序的调试和修改带来很大的麻烦。甚至美工对页面布局的轻微调整都会导致大量代码的重新编写和调试。经验丰富的开发者能够区分出文件中哪些是数据,哪些是表示层的标签,但这通常很不容易做到,它需要精心的计划和不断的尝试。而MVC的出现则从根本上强制性地将它们分开。
尽管MVC的概念很早就有人提出,但是直到像Struts、JSF之类的MVC构架产品逐渐成熟后,MVC的模型才真正在软件系统的开发过程中得到广泛的应用。
如果你已经对JSP的“面条式”编程感到失望,或者你需要维护其他项目组用JSP编写的应用系统,正面对着一大堆JSP程序而无从下手,又或者你作为一位资深的项目经理,需要带领团队开发一个大型应用系统,而你正对选择什么样的构架设计煞费苦心时,再或者你需要完成一个界面多样化(可以随心定义、甚至可以通过Wap为手机用户提供服务)的应用系统,那么建议你采用MVC构架。
尽管构造MVC应用程序需要一些额外的工作,但是它所带来的好处是毋庸置疑的。
需要说明的是:作为一个MVC的框架,Struts并不是唯一的Java语言对MVC Framework的实现。但Struts作为Jakarta计划的一部分,无论从易用性、可靠性,还是拥有用户的数量上都是目前行业中的佼佼者。因此我们将通过Struts来领略一下MVC的魅力所在。
Model(模型):Struts中的Model由三种类型的JavaBean构成
Action Form
Action Form通常被称为FormBean,对应于来自页面表单中的信息。在MVC的指导思想下,我们在实现用户复杂的业务逻辑时,需要得到用户在浏览器端表单中填写的信息,但却不能通过Request提供的方法直接得到用户提交的数据(因为这不符合MVC的编程理念),所以我们需要在服务器端构造一个和浏览器中表单内容完全一致的类,用它来保存用户表单中的信息,供服务器端的程序调用,这个类就是Action Form类。
Action
Action通常被称为ActionBean,用于响应用户在浏览器端的动作、事件(Event),并获取从ActionServlet传来的FormBean,取出FormBean中的相关信息,并做出相应的处理。通常事件的响应程序通过对实现业务逻辑的Java Bean或EJB等组件的调用来完成。
JavaBean或EJB
这些类用于实现系统所包含的业务逻辑,是整个系统的核心所在。通常这些类被Action类在响应用户的请求时调用。
所有对Action进行处理的对象(以下简称为处理器对象)都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理过程和逻辑,它可以调用业务逻辑(Model)模块,并且把响应提交到合适的View组件以产生响应。
ActionForm组件对象是Struts提供的另一个非常有用的核心组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标签库可以实现对客户端表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。
通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts通常建议使用一组JavaBean表示系统的内部状态,根据系统的复杂度也可以使用Entity EJB和Session EJB等组件来实现系统状态。Struts建议在实现时把事件的响应程序(Action)和业务逻辑的实现代码分离,这样可以保证业务逻辑的可重用性。
事实上,对于初学者来说,可以直接将实现业务逻辑(访问数据库系统)的代码在Action中实现,因为这并不违背MVC构架对结构的要求,只是丧失了业务逻辑的可重用性。
View(视图):Struts通过在JSP页面中嵌套Tag标签实现
Struts提供丰富的JSP标签库:Html、Bean、Logic、Template等(我们还可以自定义标签)。通过这些自定义标签可以非常好地和系统的Model部分交互,通过使用这些自定义标签创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装,同时这些自定义标签还提供了像模板定制等多种显示功能。
简而言之,ActionForm把用户在表单中填写的信息封装成类,供服务器端的程序使用;而TagLib中提供的各种标签则用于服务器端程序输出处理结果。
Controller(控制器):其作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端
Controller的作用有点像浏览器端的Web页面和服务器端Java程序之间的传话筒。它负责浏览器端和服务器端的信息传递,将Web页面的各种事件和请求传递到服务器端相应的Action中进行处理;并且把Action处理的结果送至浏览器端的View视图中显示。
使用MVC构架搭建的工程,同样的业务逻辑,我们将可以用不同的表现形式进行展示,如同彩壳手机可以任意更换外壳一样;应用系统界面的风格不断调整时,不需要对业务逻辑进行任何的调整。
MVC具有的结构化、模块化、组件化的优点,使得大型业务系统的开发和管理更易于实现,但是开发基于MVC的系统,比开发基于JSP的程序从结构上来看复杂了许多,原来通过一个简单的JSP页面就能实现的功能,在基于Struts应用中变成了多个步骤的设计和实现过程。它需要我们花费更多的时间和精力来学习才能掌握。
很多的JSP程序员朋友刚开始学习Struts可能会比较难以适应。因为他们习惯了用Request和Response在页面和服务器端传递数据,而且以“Hello world”程序作为例子,说明JSP是多么简单易用,并且十分强调JSP的灵活性。
诚然,对于一些简单的应用来说JSP足以胜任,使用Struts则会增加系统的开发周期和成本。而且Struts并不能完全替代JSP,任何一个Struts应用都需要JSP的程序支持,二者是密不可分的。
在北京杰软科技有限公司内部,有很多资深的Java程序员,他们对JSP非常熟悉,但对Struts则抱着怀疑的态度,也有很大的抵触情绪,其中很多人甚至认为完成同样一个开发任务,采用Struts会使开发周期远远大于采用JSP开发的时间。
但后来由于公司的技术策略全面调整和部分项目的客户需求,大家被迫强制学习和使用Struts。在逐渐熟悉了Struts的工作原理和开发过程后,大家体会到了Struts的魅力。现在大家相当一致地认为,大多数的情况下使用Struts开发更加简单,更能够有效提高开发效率,增强代码的可维护性。用惯了Struts的程序员开始对维护以前的JSP程序感到无从下手。
对于这个观念转变的过程,我们得出了一个结论:如果要对一种新的技术作出客观的评价,首先必须全面地了解,等能够熟练地应用后才有发言权,才能发现它的优点和劣势。仅凭借自己的经验和感觉对一些新技术的评价显然是有失公允的。
Web Server与Tomcat
自从JSP发布之后,很多公司都计划推出自己的JSP引擎。Apache Group在完成GNUJSP 1.0的开发以后,开始考虑在Sun MicroSystem的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet,这样Tomcat就诞生了。
Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
目前,Tomcat已经是jakarta项目中的一个重要子项目,是一个开放式源码(这意味着Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载),是全面支持JSP和Servlet技术的容器,也是一个Web服务器软件。其被JavaWorld杂志的编辑选为2001年度最具创新的Java产品,同时它又是Sun MicroSystem公司官方推荐的Servlet和JSP容器,Servlet和JSP的最新规范都可以在Tomcat的新版本中得到实现(Tomcat 5.0以后的版本中都已经完全支持Struts),因此其越来越多地受到软件公司和开发人员的喜爱。
Tomcat深受广大程序员喜欢的另一个原因是它运行时占用的系统资源很小,而且拥有良好的扩展性,任何程序员都可以更新、更改或者用自己开发出的程序扩充Tomcat的功能。
尽管Tomcat设计的初衷是作为Apache服务器的扩展而出现,它们是分别独立运行的,所以当你运行Tomcat时,它实际上作为一个与Apache独立的进程单独运行。Apache为HTML页面提供服务,而Tomcat则处理对JSP页面和Servlet程序的请求。
事实上,Tomcat也具备了Web服务器的基本功能——处理对HTML页面的访问请求,因此在大多数情况下,它也可以不依赖于Apache独立运行,同时充当Web服务器和Java容器(应用服务器)两个角色。