首    页 建模架构 设计模式 培训咨询 jdon框架 论坛

  《Java实用系统开发指南》 第四章

网站内容管理系统

  X公司是一家处于快速发展中的中小型销售公司,他们打算架构一个网站。计划分两步走:首先做一个宣传型的网站,然后在公司规模达到一定程度时扩展为网上商店。

  在第一步计划中,X公司的主要想法是通过网站能及时介绍公司的产品、服务以及其他公司相关情况;由于不断有新品上架,他们希望能通过公司市场销售人员直接来修改页面,将新的信息直接发布在网站上;同时他们也希望页面美工风格能定期地改进和更换。

                                                                                                                                                                                                                    X公司这样的需求其实代表了大多数公司进军电子商务的意图,因此这个案例有一定的普遍性。

4.1 需求分析

4.2 架构设计

  根据前面的需求分析,以一个中型系统的架构来设计本项目。在设计本例架构时,应充分考虑其扩展性和通用性。

  在框架技术选择上,预备完全在J2EE的Web框架里实现。这样可以充分了解熟悉J2EE的Web技术,同时又因为Web技术相对后端EJB层来说是比较成熟的,发展变化不是非常大。

                                                                                                                                                                                                          因此,本例的架构可以说是一个J2EE的Web实现的标准架构,可以将它应用到更多的中小型项目中。

4.2.1  系统架构图

  多层架构的优点主要体现为:

  良好的解耦性:各个功能层只负责自己相应的事务,不再相互混淆在一起。每个功能层如果在将来有所变化时,不会涉及到其他功能层,因为每个功能层是相对独立的。

  高度的重用性:各个层的技术都可以移植到其他应用系统。比如表现层的框架一旦确定,可以在第二个项目中同样使用这样的技术,同时还可以提高开发速度。

                                                                                                                                                                                          灵活的扩展性:由于表现层和核心功能分开,可以将系统从PC应用拓展到无线等应用中,所作的修改只是表现层的更改,系统核心功能无需变化。

4.2.2  MVC模式和Struts

  表现层涉及很多用户界面的元素,因此比较难以实现重用。但是,有一个宗旨是:不能将功能性的代码与显示性的代码混合在一起,否则,当需要更改页面或者扩展新功能时会带来很大的修改量,甚至破坏原有系统的稳定性。

  因此,需要对表现层进行细化,可以将表现层分3个部分:

  视图(View)负责显示功能。

  控制器(Controller)根据Model处理结果,调节控制视图View的输出。

  业务对象模型(Business Object Model)是对真实世界实体的抽象,可以是一些数据,也可以是一些处理对象或事件对象。在本项目中,业务对象就是那些包含状态和行为的Javabeans,如图4-4所示。

  有一种观点认为只有大项目才需要采取MVC。实际上,很多时候无法确定项目的规模。因为客户的需求始终不断在变化,如果原有的基础架构不具有很强的拓展性,那么项目进行到中途时可能要再进行重新设计,很容易陷入左右为难的地步。所以,无论任何项目,用标准的架构去设计它,就如按标准的方法去做事一样,相当于成功了一半。

  具体实现MVC模式的软件框架有很多,其中应用最广泛的有下列3种:

  Apache Struts(http://jakarta.apache.org/struts/) Strut是基于JSP的框架软件,有大量文章和参考资料面世,其中《Struts in Action》一书非常值得一读。

  Apache Cocoon (http://xml.apache.org/) Cocoon是基于XML和XSLT技术的MVC模式实现框架,在Cocoon中很巧妙地利用XML技术实现了内容和模板分离的功能。

                                                                                                                                                              Petstore WAF(Web Application Framework)Petstore是SUN公司推出的一个J2EE实例样本,WAF是其Web实现框架,其原理类似Strut。

  Jsp中使用include的主要问题是:

  如果要修改的不只是头部和尾部,而是整个页面的布局,那么就必须逐个进行页面的修改。

  大量include嵌套使用,这类似面向过程语言中的GoTO语句,会使维护扩展变得非常困难,但是因为编写简单直接,不少程序员还是可能喜欢这样做。在一个项目中开这种先河,将出现大量层层重叠的include语句,严重破坏了页面的可扩展性和可维护性,使得页面修改扩展成为整个系统的恶梦。

                                                                                                                                                  调试不方便。include分动态静态两种用法,静态用法调试很不方便,因为即使被include的JSP页面在一些容器中,主页面如果不修改,容器将不会重新载入新的使用“include”语句调用的子页面,除非调用者页面和被调用者页面均被修改

4.2.3  DBO模式和Castor

  在Java中,对象序列化成二进制数据是比较方便的。但是将一个对象序列化成XML文本时,也许就没那么简单了。对象和XML之间序列化和反序列化依赖很多方面,比如文本的编码、映射设置等。

  将包含数据的对象序列化成XML文本后,就可以很方便地实现数据的持久化保存。

       

  数据持久化表示数据将脱离应用程序的生存周期,也就是说,当这个应用程序退出或计算机关机,这些数据还将继续存在。因为这些数据已经被保存到永久存储介质上,如硬盘文件系统或关系数据库系统。

  在讨论DBO模式(Data Bind Object Pattern)之前,首先必须了解一个很重要的概念,就是MVC模式中的Model。它泛指的是一种业务对象模型(Business Object Model),数据对象模型(Data Object Model)是业务对象模型的一种,它包含状态以及操作状态的行为。数据对象也可以被认为等同于经常提到的另外一个名词:值对象(Value Object)。

                                                                                                                              数据对象是对真实世界中实体软件的抽象。它可以是人、事或地方以及一些商业概念,比如订单、客户这些概念也属于业务对象。

  DBO模式有3个参与角色:

  数据对象:将要被序列化到XML或从XML反序列化的对象。

  数据绑定对象:这是一个工具型的基本对象,这个基本对象抽象了XML的序列化和XML API的具体使用细节。

                                                                                                                  XML 序列化 API: 真正实现XML序列化的具体行为,具体实现可以采取JDOM、Castor、JAXB或其他类似工具。

4.2.4  Cache设计

  是否有缓冲机制(Cache)是衡量一个J2EE产品是否成熟的重要标志。因为缓冲对于J2EE系统的运行性能有至关重要的作用,特别是在大量用户并行访问时,没有缓冲机制几乎是不可想象的事情。

                                                                                                    J2EE作为一个多层结构,每发生一次请求,将可能经过系统的许多层次。这些层次中有的可能位于另外一台服务器上,那么网络连接开销将延迟请求信号的处理时间。使用缓冲可以节约请求信号的处理时间,大大提高系统的整体响应能力。

  因此,在一个分布式的集群Cluster(负载平衡和错误恢复)环境中,Cache的设计就比较复杂。综合各种因素,使用JMS(Java Message System)进行这种通知信息提示是一种比较切实可行的方案,带来的性能损失也不是很大,支持分布式环境的不少缓冲产品已经面世。因此,一个系统从单机环境升级到分布式环境,缓冲机制可能要作一定的修改。

4.3 详细设计和实现

4.3.1  基本对象设计

4.3.2  数据模型的实现

4.3.3  抽象工厂(Abstract Factory)模式

  在本项目中,使用了XML文件系统作为数据存储介质,但是如果将来系统发展到一定规模,使用关系数据库作为存储介质,那么就需要替换存储介质。这种替换工作力求修改最小,不影响原有系统的稳定性,最好能无缝过渡到数据库系统,也就是说为了让系统具备灵活的扩展性和伸缩性。

                                                                                      为了达到这个目的,需要将有关XML数据操作的细节封装起来,使得外界根本不知道系统内部是采取XML文件还是使用数据库来实现数据持久化的。

4.3.4  生成器(Builder)模式

  Builder模式是一种将复杂对象的组装创建过程封装起来的模式,将过程中具体实现细节隐含在抽象接口后面。想到Builder模式应该就会联想到汽车的组装:汽车分很多部件,部件组装起来就成为一辆汽车,Builder模式是将汽车组装过程进行了封装。

  “页”是这个项目中的一个复杂对象,需要通过复杂的混合组装过程,将内容在一个“页”中以一定模板显示出来。分别依据Builder模式的参与者设计如下:

                                                                            “页(Page)”是Builder模式中要构造的复杂对象。“页(Page)”是由菜单(Menu)、内容(body)以及模板JSP等部件组成。

4.4 表现层的实现

4.4.1  Struts相关设置

4.4.2  创建PageForm

  Struts中需要一个ActionForm,它实际是一个Javabean,字段都是JSP中form的一些字段,如果有过JSP/Javabeans开发经验的人会使用下列代码:

<jsp:useBean id="userInfo" class="com.ora.jsp.beans.userinfo.UserInfoBean">

<jsp:setProperty name="userInfo" property="*" />

</jsp:useBean>

                                                                    这里UserInfoBean的字段对应HTML中Form表单的字段,从而在Form提交时,表单字段自动映射到UserInfoBean的字段。如果不清楚,可以参阅有关JSP/Javabeans的章节。

4.4.3  创建PageAction

  Action是和控制器Servlet在一起工作的,Action是整个系统中关键的、起调度控制作用的类。

                                                            在Action类中,将要处理前面页面输入本类的参数,进行相关业务逻辑运算。然后根据结果,从struts-config.xml中根据用户定制的Forward页面,将Forward页面推到用户的浏览器中去。

4.4.4  创建Page.jsp页面

  在JSP中消除Java代码分两个步骤:

  能够在Action中实现的功能移动到Action中实现。

                                                  使用Struts标签语句替代Java代码实现的功能。在JSP中使用Struts特殊标签taglib语句,参考  http://jakarta.apache.org/struts/userGuide/dev_html.html。


4.4.5 
自定义标签库
4.4.6 
创建SavePageAction
4.4.7  Tiles
模板

  在前面设计中,一个页面被分为几个区域:标题栏、页尾栏、菜单栏以及内容栏部分。如何使用Tiles将这几个部分组合在一起?

                                          Tiles的页面组装配置可以在JSP,也可以在tiles-defas.xml中。


4.4.8 
创建cmsMenu.jsp
4.4.9 
创建index.jsp
4.4.10 
小技巧

  在J2EE应用中经常需要知道某个文件的绝对路径,如何能从Web容器中自动获得某文件的绝对路径?

  例如上节中,1.jsp中body指向的是“/data/1.jsp”,在相对目录data下的1.jsp是系统程序自动生成的。也就是说使用了File有关API操作,而File操作必须提供绝对路径。例如,在项目系统建立c:\cms下,目录结构见前面章节,那么“/data/1.jsp”的绝对路径应该是c:\cms\data\1.jsp。注意,如果有本地文件操作,那么系统就不能打包成*.war,必须提供完整的目录路径。

                            那么如何获取根目录c:\cms?通过配置文件设定也可以,但是不灵活,每次移动项目都要修改配置文件。


4.5
项目重整Refactoring
4.6
调试、发布和运行
4.6.1  
配置和运行

  本项目由于只使用了J2EE中的Web框架,因此可以使用专门的Web容器服务器。Tomcat (http://jakarta.apache.org/tomcat/)是免费开源的Web服务器,是Jakarta项目中的最著名的子项目,它还是Sun公司推荐的servlet和jsp容器(http://java.sun. com/products/jsp/tomcat/)。

  很多人一直对免费或开放源代码的产品实现商业应用存有疑惑,但是Tomcat作为类似Apache一样的Java服务器,经过几年来大量使用证明,其稳定性和成熟性是有目共睹的。经过最新的研究表明:系统在并发用户100以下时,Tomcat的响应时间和商业服务器相差不多,可见Tomcat是能够大量被应用到中小型企业系统中。


4.6.2   Log
调试信息的配置

  项目第一次调试总会存在诸多问题,因此需要打印出系统中每个步骤的运行结果,这样可以跟踪调试。以前是使用System.out.println来设置输出调试信息。但是这有一个缺点,就是当项目切入正式运行后,不希望这些日志输出到容器的控制台上。因为这样还会降低系统性能,但是如果手工逐个到程序中删除,又将为以后扩展维护带来不便。

  以后章节会谈到如何使用Log4J来跟踪调试,但是在Tomcat中设置Log4J不是一件方便的事情。需要做一个专门的Proxy类,通过这个Proxy类,可以动态地设置是使用System.out.println还是Log4J,或者关闭一些调试信息。

定义Log的级别如下:

ALWAYS = 0;

VERBOSE = 1;

TIMING = 2;

INFO = 3;

IMPORTANT = 4;

WARNING = 5;

ERROR = 6;

FATAL = 7;


4.7
小结

  单从网站内容管理系统上看,使用Java或J2EE实现这个系统并不比其他语言PHP或ASP有更多的优势和好处,但是,在目前Java世界中,网站内容管理系统已经被整合进入门户Portal系统中,内容管理成为Protal系统中一个主要的Portlet。

    一个灵活的、可伸缩的门户Portal系统是复杂的,Java平台所具有的可重用性、可拓展性以及高度安全性等特点才能够得到真正的体现。

 


更多标签...



Jdon框架演示

JiveJdon
源码下载

VIP收费区

历史热点讨论排行榜




google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘





手机 add to google add to yahoo
联系我们 | 关于我们 | 广告联系 | 网站地图 | 设为首页

沪ICP证08026060 如有意见请与我们联系 Powered by JdonFramework
_×
您有新消息