二十世纪九十年代末期,Java的所属SUN公司为了让SERVLET技术适应商业发展,建立了一套有效开发API成之为Java Servlet API,这就使得SERVLET技术具有了更好的跨平台性和较好的可移植性。
在计算机科学技术的发展过程中任何一项技术都有自己的突出点和短板——SERVLET在生成客户请求的网页时,需要在HTML标签中嵌套上JAVA程序代码。这时如果HTML标签中发生个CSS样式细小的变化将导致SERVLET中的Java类不得不重新进行修改。而实际应用中HTML页面的展现必须与Servlet后台代码的侧重点不同,因而这种关联关系会让后台代码Java代码的维护非常麻烦。
2.1.2 JSP技术
JSP[3](Java Server Pages)最大的特点是将静态的HTML标签技术和动态的页面技术相结合,它不仅能够扩展SERVLET API接口,还在继承原有技术上全面保留Java API,在页面的展现形式上更加趋近于HTML技术。
当我们从JSP页面文件的布局上可以非常清楚地看到它与HTML静态网页在布局格式上几乎一致,然而于HTML静态页面相比JSP文件中却可以在任意符合JSP语法的地方嵌入Java程序代码,这样就可以轻松的实现SERVLET程序逻辑。那么在SERVLET应用程序中不易被提取出来的HTML标签代码在JSP页面中能够以较为直接的显示方式展现给开发设计人员,这非常有利于前台页面的有效的结构和展示的设计。
如果对TOMCAT服务器的Web服务器下的WEB/APP目录中的JSP文件进行解析,可以发现每一个JSP文件都将存在一个.java的文件于JSP文件相对。而且当开发人员或用户对JSP文件的HTML标签进行部分修改,系统将没有必要重新启动TOMCAT服务器就可以直接刷新更改后的页面直接看到效果。这跟SERVLET技术有很大的区别,主要是由于被修改的静态代码对Servlet程序代码没有起到作用,这时我们就不需要重新对JSP进行编译,所以直接刷新浏览器即可重新显示页面的更改。
当来自用户的请求系统中的某个JSP页面时,Web容器将会按照以下三个步骤进行处理:
首先将开发人员编写好的动态JSP文件通过Web容器中的SERVLET转换引擎转换成为*.java源代码;然后通过Java虚拟机将*.java源代码文件翻译成为机器能够识别的字节码文件(二进制);最后当客户端发来页面请求时,WEB容器将按照已经编译好的二进制字节码文件进行处理,将生成的HTML页面代码反馈给客户端中显示。
总的来说,JSP技术是一种更接近于视图层、更加易于表现的Servlet程序代码。二者在本质上并没有明显的区别,但是JSP技术为使用者和开发人员提供了丰富的标签库,例如JSTL标签、自定义标签等更加灵活便捷的标签。
2.1.3 JSTL标签
JSTL[4]全称为JSP Standard Tag Library,JSP标准标签库。由于这是基于JSP标准的标签库文件,与STRUCT2等标签库相比,JSTL标准标签库所提供的功能虽然并不是特别丰富,但是JSTL标准标签库的适用性却非常广泛。
JSTL标签库主要为用户提供CORE标签库、FN方法库、XML标签库和FMT标签库、SQL标签库等5个部分的内容。
首先CORE标签库为开发人员提供诸如为了达到实现循环效果后台代码中可以使用
2.1.4 JSP 2.0自定义标签
JSP 1.x标准模版中提供了为用户自定义的标签库的功能供开发者使用,允许开发者编写其所需的标签而且能够并配置定义若干个标签,并以在开发过程中以标签库的形式对页面展示进行合理配置管理。但是开发者在编写自定义标签的时候首先要实现Tag接口或者继承TagSupport类,这个使用方法是JSP 1.x为开发人员提供的开放API。自从JSP 2.0[5]标准发布之后,用户只需要使用更加
简单的SimpleTagSupport类来重写doTag(),这样就使得开发人员在自定义标签的时候更加快捷。
JSP标签库中的自定义标签API的组织结构如图2-2所示。 图2-2 JSP自定义标签的API体系
本系统项目中在处理实体对象数据原型的管理逻辑时,由于分页功能的使用率非常高,因而在本系统我们使用了JSP 标准技术中的自定义标签库功能,定义了
2.1.5 Filter过滤器
Servlet API[6]代表着开源和开放的意思。2000年,三星公司通过发布Servlet 2.3规范,Filter过滤器的功能得到添加,接下来的2.4、2.5版本又使其各项功能得了进一步的改进。
在平时上网时,我们很少的会遇到这样一种情况,用户发的帖子中贴图显现出来的图文与本来所想的样子有很大的出入,出现这种情况最主要的原因就是贴子中的图片的来源网站用了“防盗链”的功能。而绝大多数的网站,在处理权限控制时(如在淘宝网购物必须具有已登录的账户),对于一些重要的操作过程都设置了审核这一环节(如检测到当前用户没有有效的登录状态,则拦截后续操作并转到提示页面)。这一类常用操作都是可以利用Filter过滤器来完成的。
在这一项目中,我们想到有的用户会通过浏览器地址栏暴力探索等非常规方式登录还没有完成的JSP页面造成逻辑错误,从而恶性的利用Filter过滤器拦截,让用户不能登录访问目的网页。
这归根到底是由于本项目所采用的方法是:页面只能用作后台间接反馈给用户的调用出来的结果,用户只能访问后台功能的各模块。
所谓监听器,其实和Java AWT/Swing[7]编程中的Listener是差不多的,一旦触发某一个事件,用户所指定的程序逻辑就会被立即执行,实现预设的目的。程序开发人员只要知道触发了一个事件所调用指定的Listener方法就行,而无需了解事件(Event)和监听器(Listener)是相互作用的过程。因此,只要把用户自己的业务逻辑编入所设定的方法程序中便可。
监听器有监听对象属性变化、监听对象的创建与销毁、监听Session内的对象、监听Session/Request/ServletContext等对象等这几种种类。
该项目中的使用Listener监听器做到了“单态登录”,如果处于登录状态,而这一帐户又在此时于异地登录,先前的登录便会被注销。
只要将业务逻辑编入到HttpSessionAttributeListener接口的attributeAdded()方法中便可实现这一功能。
2.2 MVC模式
Model-View-Controller可缩写为MVC[8]。Java EE中较为广泛的使用了这种分层的思想,主要特点就是提供对流程进行管理的用于控制导向的Controller,同时把业务逻辑和前台表现层隔离开来。
MVC思想最早是在1982年被提出来的,现在它作为差不多全部主流面向对像Web开发技术框架的标准,把业务逻辑和显示层进行分离,不但使得开发效率有所提升,而且具有部署快、可维护性高、耦合性低、重用性高等诸多优点。
如果不使用第三方框加,采用的又是原生的Java EE技术,我们一般就会这样的判断:POJO、DAO、Service等内容为Model层,JSP为View层,Servlet为Controller层,请参见图2-3所示。
图2-3 MVC分层思想
一般想思想意识中的POJO(也称为Bean、VO或原型)不局限于Model层,也不属于其他任何一层。比如在JSP页面当中的EL表达式一般情况下能通过“${bean.attribute}”的形式调用到一个POJO内部的东西。当然这种调用是建立在JSP API基础之上的,绝非与人为设定的Model层产生相互作用。POJO作为数据传递的媒介,将表数据以POJO的形式通过Hibernate等框架到达DAO层,DAO层再把POJO原型对象与Service的交换。在Struts 2.x框架中的ModelDriven接口中有些时候POJO也会作为Controller层与前台交互的媒介。
因此我们会错误的认为POJO与其他层是平等的,其实不然,把它归纳到Model层中是非常不科学的,它只是MVC分层中的一种通讯工具。但事事都无绝对性,这要看开发的人如何去理解和应用。
2.3 Spring框架
Spring框架是一功能强大的整合工具,一直是多框架的保护神,Spring是由Rod Johnson于2003年创建并兴起,它为项目的解耦与新需求的扩展带来了很多方便,设计的初衷是为了应对企业应用的复杂性,积极支持Java EE,弥补了其臃肿、低效等不足之处。当然对传统的Java EE框架也是一种挑点。
尽管Struts框架[8]充分的体现了MVC思想,但也带来局限性,Action与DAO层、Service层过于紧密的耦合,这将对项目的需要变化转型产生消极的影响。这种情况下我们可以使用Spring间接的协调,使用Spring的IoC机制来配置管理并维护这种耦合关系。只有这样,Struts的Action和DAO与Service才能不互相依赖,而是更好的互相配合工作了。
一样的道理,Hibernate也可以通过整合到Spring中来获得同样的良好效果。 虽然Spring框架中提供MVC模块,但暂时并没有使用它们,而使用的是Struts 2框架,这主要是因为该项目中大量的采用了Struts 2标签库内容。
2.4 AJAX技术
AJAX指的是“异步的JavaScript包括XML”(Asynchronous JavaScript and XML)。即在不需要等待服务器将结果返回就可以继续下面的业务逻辑,就是所说的“同步方式”。而传统的“同步方式”是客户端发出了一个请求,只有在服务器响应后,方可继续下一步的业务逻辑。
比如我们平时在一个网站注册一个用户名,用户名输入后直接显示用户名是不是被占用,而不需要刷新页面或者点击一控件。之所以这样,最主要的就是因为onkeyup或onblur等HTML事件触发了AJAX的回调函数,在JavaScript作用下,直接根据服务器的结果信息改变HTML代码内容,而不必刷新页面。
XMLHttpRequest对象是AJAX技术最核心的地方。常见的浏览器都支持AJAX技术,同时在不影响客户端当前的操作的情况下把数据通过一种简单的方式传递到服务器端。AJAX对数据的传递一般采用高效的JSON,但也习惯使用XML格式数据。