1、360 文档中心 word 文档下载网站http:/ 360 文档中心,更多免费文档请访问网址 http:/http:/ JSP_Servlet 的 Web 应用框架的设计与实现计算机技术与发展第 17 卷 第 4 期 17 No.4 Vol.2007 年 4 月 Apr. 2007COMPUTERTECHNOLOGYANDDEVELOPMENT基于 JSP/Servlet 的 Web 应用框架的设计与实现周 云,余青松,敬宗儒(华东师范大学计算中心,上海 200062)摘 要:Web 应用程序的开发过程中存在着 Framework 的应用。这些 Framework 了部分非业务逻辑的过程,F
2、rame2work 模型,实现了部分的自动化处理。该模型的构建,Framework的可能性。关键词:Web 应用框架;MVC;设计和实现中图分类号:TP311:A 文章编号:1673-629X(2007)04-0243-04FrameworkBasedonJSP/Servlet:DesignandImplementationZHOUYun,YUQing2song,JINGZong2ru(ComputerCenter,EastChinaNormalUniversity,Shanghai200062,China)360 文档中心 word 文档下载网站http:/ 引 言在开发 Web 应用程序的
3、过程中,特别是 JSP 应用程序,到处充斥着 Framework 的应用。这些Frame2work 的技术相当成熟,规范十分完整。它们对于程序与数据库打交道的数据 Model 也应该得到妥善管理。另外,这些操作的共通特性都是高于模块级别但又属于代码级别的。所以,应该设计出一个类似于规约性质同时又是以实际代码形式出现的管理体制。于是,Framework 便诞生了。员的编码规范以及后台 Model 实体的管理相当完善。文中关注的重点是如何用最基本的Java 语言工具和设计方式来设计和实现一个带有自动化操作功能的Framework,从而深入理解一些 Framework 内在的处目前流行的 Frame
4、work 有很多,比如 Struts,Spring,JSF 等等1。它们使 JSP 程序员从散兵游勇转360 文档中心 word 文档下载网站http:/ 。理机制。笔者参照 Struts 的前端自动化操作过程设计并且1 Framework 概述人们需要一个 Framework 来对软件开发提供支持,并且对程序员所书写的代码进行规范。一些公共的非逻辑的处理过程应该做成共通模块,一些不好的编成习惯应该得到限制和纠正。同时,实现了一个 Framework 模型,希望借此深入了解一些Framework 的内部实现机制。2 Framework 模型的设计原则最根本的原则是 Framework 要给开发
5、过程带来便利,使得开发过程更加规范完善。为了实现这个根本原则,必须解决两个问题:(1)尽量将非业务逻辑自动化处理;(2)将程序员的发挥空间进行限制。360 文档中心 word 文档下载网站http:/ 云(1981-),男,四川犍为人,硕士研究生,研究方向为 Web 应用;余青松,高级工程师,研究方向为计算机系统分析与集成、Web 应用技术。计算机技术与发展 第 17 卷?244?图层回传参数Servlet 接受参数,并将参数封装到一个对象当中Servlet 选择正确的视图,并且进行显示,这三个步骤与业务逻辑没有关系2。不管你是什么业务逻辑,这三个步骤总会独立地执行。业务逻辑只会出现在这三个步
6、骤的间隙之间。应该据此对这三个步骤分别进行封装,实现自动化处理。对于第二个问题,可以提出一个简单的解决办法:让程序员“只可能将正确的代码写在正确的地方” 。把其他与业务逻辑没有关系的代码全部进行封装即可。综上所述,文中所描述的 Framework 模型的设计原则就是,封装非业务逻辑的操作,度。当然,这只是一个 Framework 现,进一步的应用,Framework 模型图 3 FrameworkUML 类图,。的 2 实体(数据缓冲区)引用HttpServletRequest 当中所有的参数名字以及值,那么就可以把它们封装到一个具体的实体当中。简言之,这个实体就是一个普通的 Java 类实体
7、。那么,这一步所遇到的问题就是如何获得这个实体的引用。因为这个实体的创建应该由程序员完成,所以实体的类型就是千差万别的。针对这种情况,应该把这些类做统一的管理,即把它们全部继承自一个Framework 系统当中定义的基类。同时,由于 Action2Form 只是纯粹的数据实体,业务处理方法没有存在的360 文档中心 word 文档下载网站http:/ Framework 模型的设计Web 程序的设计遵循现在成熟的 MVC 设计模式。Model 的设计组合独立于 Framework 之外。View 是属于前台视图层。Controller 负责接收参数,调用对应的业务模型实体进行处理,返回对应的视
8、图。由此可见,对于业务模型实体的设计重要的一点就是它要能够自动地生成并且被 Controller 自动地调用,同时Controller 还必须将对应的数据缓冲区传递给它。那必要,所以 ActionForm 当中没有对方法进行扩展的必要。因此,规定所有的 ActionForm 实体均继承自Framework 当中指定的基类,这样就可以获取所有 Ac2tionForm 实体的引用了。3.3 获取相应的 Action 实体(业务实体)的引用么业务模型所需要的就是一个标记,一个能够表明它身份的标记。Framework 模型的框架如图 1所示1360 文档中心 word 文档下载网站http:/ Seq
9、uence 图如图 2 所示1;其 UML 类图如图 3 所示。3.1 获取前台视图传回的参数创建了 ActionForm 实体之后,应该创建 Action 实体进行业务逻辑的处理。为了获取 Action实体的引用,可以采用类似于获取 ActionForm 引用的处理方法。另外,Action 实体当中的业务处理方法也是千差万别,没有任何规律。为了保证这些业务方法都被系统调用,可以采用类似于 Servlet 类的处理方式定义一个被 Framework 调用的方法,其余的业务方法均被此方法调用。这个被 Framework 调用的方法叫做executeAction,并且这个方法应该在基类当中定义。F
10、ramework 在获取了 Action 的引用之后,立即调用这先从获取前台视图传回的参数开始进行分析。既然要对这个过程进行自动处理,那么程序要获取 HttpServletRequest 当中各个参数的名字,进行数据缓冲的实体的引用,进行数据缓冲实体当中各个对应图 1 Framework 模型的框架个方法,从而执行所需的业务操作。3.4 创建视图层使用的 PageBean 实体PageBean 应该是在 Action 实体当中创360 文档中心 word 文档下载网站http:/ Action2Form 也可以用作 PageBean,只是笔者认为一个独立的 PageBean 使得流程更为清晰1
11、。PageBean 只是一个 POJO 而已。3.5 返回到对应的视图层图 2 Framework 模型的 Sequence 图在 Action 当中进行完业务处理之后,第 4 期 周 云等:基于 JSP/Servlet 的 Web 应用框架的设计与实现?245?返回一个新的视图层的 url 给 Controller,以便 Con2troller 进行正确的 response 导向。3.6 小 结这些数据缓冲区和业务实体必须继承自指定的类。笔者一向认为继承的作用是便于管理而不是扩展功能扩展功能最好用复合5。这里暂时称呼这些基类为 FrameActionForm 和FrameAction6。这些
12、基类当中可以指定一些基本的方法,当然也可以不指定6。只要实际程序中使用的 ActionForm 和 Action 继承自上面的基类,那么它们就会被Framework 调用管理。FrameAction 当中的方法供 Con2,。4.综合分析可知,所需要知道和掌握的变量是:HttpServletRequest 当中的参数的名字,数据缓冲区中360 文档中心 word 文档下载网站http:/ 的 RTTI 机制提供一些“盲操作”可供使用3。另外,有些信息可以放置在外部的文件存储当中。这些存储信息的文件,可以称之为配置文件。具体的代码实现请参见下文。ActionForm 以及 Action 的。那么
13、问题就演化成为:如何根据一个名字来创建对应的实体。这样看来,似乎只要再次使用 Class.forName 函数4,问题就解决了。为了给程序足够的信息创建对象,Framework 使用配置文件。当然,为了读取这些配置信息,需要一个专门的类进行处理2。这个类的作用就是专门负责读取配置信息。4.4 整合 Framework 模型4 Framework,4.1 获取前台视图传回的参数以及设置数据缓冲区属性值前台回传的参数会被读取到一个数据缓冲区当中进行缓存,从而可以利用 RTTI 机制进行获取一个实体类的数据属性的名字4。这里对编程的规范再次进行限制:对于进行属性设置的函数必须是 setter 形式的
14、函数,否则将不会进行调用。这样,可以使用以下代码获取函数的入口3:Methodm=c.getMethods();Methodmethods=newMethodm.length;StringpropertiesName=newStringm.length;Stringargs=newStringm.length;intcount=0;obj=c.newInstance();bean=(Buffer)obj;360 文档中心 word 文档下载网站http:/ )既然进行框架的整合,那么有必要提及 BruceEckel 在他的巨作ThinkinginJava当中提及的原则6。那就是使用 inner
15、class 对框架进行封装管理,也就是 Factory 设计模式6。所有的innerclass 都应该继承自各自的外部基类,然后再在封装类当中进行定义体的实现。下面是Controller 的代码演示4:packagecontrollers;importclassespublicclassFrameControllerextendsHttpServletstaticfinallongserialVersionUID=0; FrameActionaction=null; FrameActionFormbean=null; FrameConfigurationconfig=null; Hashtab
16、lehtbl=null;publicvoiddoGet(HttpServletRequestrequest,HttpServletRe2sponseresponse)throwsIOException,ServletExceptionpropertiesNamei=mi.toString();)!=-1) if(propertiesNamei.indexOf(”set”methodscount=mi;360 文档中心 word 文档下载网站http:/ 3,propertiesNamei.indexOf();i.indexOf(“set”“(”count ; doPost(request,re
17、sponse); publicvoiddoPost(HttpServletRequestrequest,HttpServle2tResponseresponse)throwsIOException,ServletException得到了属性设置函数,便可以获取对应的属性。接下来,就可以对缓冲区进行设置了。调用Method 类当中的 invoke 方法可以对缓冲区进行设置3。4.2 获取数据缓冲区的引用及业务实体的代码实现StringmappingName=null; Stringpath=null;)=null) if(request.getParameter(“pathName”mappin
18、gName=“/jsp/src.jsp”;getServletConfig().getServletContext().getRequestDispatcher(mappingName).forward(request,response);在实际的应用中,数据缓冲区以及业务实体必须生成实际的对象实体,并且有显式的应用。否则,无法找到该内存块。360 文档中心 word 文档下载网站http:/ 第 17 卷?246?config=newFrameConfiguration(); try/GettheconfiguartioninformationfromtheXMLfile设计与实现进行隔离。
19、所以这样的代码最多只能存在于演示模型中。实际上,至少也得采用一下 Factory 设计模式来对 Framework 进行封装。另外,为了进行规整的操作,根据这个模型的特性,需要一个 Tag 设定表单提交的 url 以及后台所需要的索引信息。到现在为止,设计出的框架模型组件包括 Con2troller,ActionForm,Action,(负责读取 catch(Exceptione) e.printStackTrace(); System.exit(1); bean=getActionFormBean(request); action=getAction();mappingName=action
20、.executeAction(request,re2sponse,bean);成 jar。getServletConfig().getServletContext().Dispatcher(mappingName).forward(;work 模型的应用与验证360 文档中心 word 文档下载网站http:/ ActionForm 和 Action 的类以及进行了正确的配置之后,程序正常运行。在建立这个 Framework 模型的过程中,已经从理论上证明了这个模型的正确性了,虽然这个模型没有实际应用价值。/333GetActionFormBean 3/privateFrameActionFo
21、rmgetActionFormBean(HttpServle2tRequestrequest)Objectobj=null;FrameActionFormbean=null;). Classc=Class.forName(htbl.get(“actionFormType”toString();6 结束语Web 程序的开发几乎已经离不开 Framework 了。. returnbean; /333GetFrameAction 3/privateFrameActiongetAction() FrameActionaction=null; Classc=null;).toString(); c=Cl
22、ass.forName(htbl.get(“actionType”360 文档中心 word 文档下载网站http:/ Framework 到底是怎么工作的?笔者在运用一些Framework 开发项目的基础之上,模仿 Framework 的动作,采用最基本的 Java 语言工具和设计方式构造了一个模型。由此剖析了一些 Framework的“内幕”,加深了对 Framework 的理解。文中设计的框架可以进一步完善以应用于实际的Web 应用程序开发,也可作为设计其他 Web 框架的参考。参考文献:1 HustedT.实战 StrutsM.北京:机械工业出版社,2005.2 CavanessCB.
23、JAKARTASTRUTS 编程M.北京:清华大. returnaction; 学出版社,2004.3 孙卫琴.JAVA 面向对象编程M.北京:电子工业出版社,2006.4 印 .JAVA 语言与面向对象程序设计M.北京:清华从代码当中可以看出,Controller 根据视图层回传的索引信息读取了配置,并且生成了对应的 Action2Form 和 Action 实体。对业务实体的业务过程也进行大学出版社,2000.360 文档中心 word 文档下载网站http:/ EckelB.ThinkinginJavaM.北京:机械工业出版社,1999.6 孙卫琴.基于 MVC 的 JAVAWeb 设计与开发M.北京:了启动。基本上,所有后台所需要的流程都进行了整合。需要注意的是,这里的编码采用的是“硬编码”,没有将电子工业出版社,2004.360 文档中心-海量免费 word 文档,ppt 模板下载。涵盖教育、职场、生活应用等各行业。荟萃营销,职业规划,工作简历,入党,工作报告,工作总结,学习资料,知识点总结等精品文档。360 文档中心 http:/