J2EE项目实训Struts框架技术第8章重构和完善BBS论坛系统第3部分_第1页
J2EE项目实训Struts框架技术第8章重构和完善BBS论坛系统第3部分_第2页
J2EE项目实训Struts框架技术第8章重构和完善BBS论坛系统第3部分_第3页
J2EE项目实训Struts框架技术第8章重构和完善BBS论坛系统第3部分_第4页
J2EE项目实训Struts框架技术第8章重构和完善BBS论坛系统第3部分_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第8章 重构和完善bbs论坛系统(第3/3部分)1.1 对bbs论坛系统进行其他方面的重构1.1.1 面向不同的角色提供不同功能的菜单项目1、面向不同角色用户的应用系统界面设计1)企业应用系统需要面对不同身份的使用者由于企业应用系统一般是需要提供给多种不同类型的用户使用,常规的用户界面设计方法是采用一个统一的操作界面(如对于web应用系统则是提供一个相同的全局菜单)。但由于不同类型的用户(也就是不同的角色)所具有的访问权限是不同的,因此应用系统必须提供一定的访问控制代码来监控不同身份的访问者,这将会增加系统中安全管理和控制调度代码的复杂性

2、。2)面向不同角色用户的应用系统界面设计而采用面向用户角色和行为的应用系统界面设计方案,也就是面向不同的角色用户提供不同访问功能的菜单项目只为当前角色的用户提供可见的服务。具体在技术实现方面的基本思路是指跟踪访问者的浏览和使用行为,应用系统后台将自动地调整界面的功能输出如菜单项目等界面元素,突出当前用户角色所需要的功能、并隐藏对用户无用的功能菜单项目。当然,这一切都是由应用系统本身自动地完成的。这样设计的主要目的不仅能够减少视觉干扰、优化界面输出,同时也将能够大大地降低系统中安全管理代码的复杂性,使得应用系统更利于功能维护和扩展。下面介绍如何实现对bbs论坛系统页面中的全局导航条菜单进行重构操

3、作,最终为不同角色用户提供不同访问功能的菜单项目。2、在bbs论坛系统中为不同角色的用户提供不同访问功能的菜单项目1)用户没有登录系统时,只提供基本的功能菜单bbs论坛系统页面中应用struts框架中的logic标签来区分用户是否登录,并对登录前、后显示出的不同全局导航条菜单项目内容,来为游客(未登录系统时)与登录用户(已经成功地登录系统时)提供不同功能的菜单项目,从而提供针对不同的访问权限进行功能控制。当然管理员成功登陆系统后的显示页面,跟普通用户成功登录系统后的显示页面也不相同。图8.52所示为访问者用户为游客角色的用户时,只提供基本的功能菜单,如注册、登录、bbs分类、高级查询和在线帮助

4、等方面的菜单项目。图8.52用户没有登陆系统时,只提供基本的菜单2)为登录用户增加修改等方面的功能菜单当用户成功地登陆系统后,并识别是否为前台用户,然后再为这样角色的用户提供对应的功能菜单。请见图8.53所示的功能菜单是在图8.52的基础上增加了“修改”(修改注册信息)和信息(查询个人注册信息)等方面的功能菜单。图8.53 用户登陆系统后增加修改等功能菜单3)为后台管理员用户增加后台管理等方面的功能菜单当用户登陆系统成功后,并识别是否为后台管理员用户。如果为后台管理员,则再提供与后台管理有关的功能菜单。请见图8.54所示的功能菜单是在图8.53的基础上,增加了“后台管理”(对bbs论坛系统进行

5、后台管理维护)方面的功能菜单。图8.54 后台管理员登陆系统后增加后台管理等方面的功能菜单3、具体实现的struts框架的logic标签示例上面的功能实现是利用logic标签来进行控制实现的,【例8-6】给出了具体实现的logic标签示例代码。【例8-6】具体功能实现的logic标签示例<logic:empty name="oneuserinfovo"><a href="/webbbs/gouserrgister.do">注册</a>| <a href="/webbbs/gouserlogin.do&q

6、uot;>登录</a> | </logic:empty><logic:notempty name="oneuserinfovo"><a href="/webbbs/pageforwordaction.do?action=showuserlogout">注销</a> |<a href="/webbbs/pageforwordaction.do?action=showupdateuserinfo">修改 </a>|<a href="/

7、webbbs/pageforwordaction.do?action=doshowonlineuserinfo">信息</a> | <logic:equal name="oneuserinfovo" property="type_user_admin" value="2" ><a href="/webbbs/pageforwordaction.do?action=dosystemmanage">后台管理</a> |</logic:equal>

8、;</logic:notempty>1.1.2 在struts框架中应用数据源datasource技术尽管struts 框架是属于表示层框架,正常也只应该对mvc架构设计模式中所涉及的表示层和控制层进行技术支持,也就是在模型层方面应该是中立的。但struts框架的设计者考虑到应用系统中的持久层在整个项目中的重要性,因此仍然提供对持久层中的有关技术进行支持这主要体现在提供对数据源datasource技术的支持上。因为如何高效和灵活地访问数据库系统、并有效地管理数据库连接connection对象的生命周期,同时也能够为应用系统的业务处理层组件提供更灵活的数据库连接的技术支持是strut

9、s 框架在持久层方面有所作为的主要体现。1、struts框架中的datasource管理器1)javax.sql包中的datasource接口jdbc 2.0 标准扩展包中提供了一个基于工厂方法来获取数据库连接connection对象的javax.sql.datasourc接口,一个datasource对象代表了一个真正的数据源。javax.sql包中的datasource接口,可以采用下面三种实现形式:1) 简单的实现(只提供connection对象,如spring框架中的drivermanagerdatasource类org.springframework.jdbc.datasource.

10、drivermanagerdatasource类)2) 连接池形式的实现(如struts框架中的datasource管理器)3) 分布式事务形式(如bea weblogic应用服务器中所提供的jndi形式的连接池datasource实现)的实现。在应用系统的开发中,为了能够提高应用系统中的数据访问的性能,一般都采用连接池实现形式的datasource对象。2)struts datasource管理器为了帮助开发人员有效和灵活地使用数据库连接对象,在struts框架中提供了一个数据源管理器组件、并也提供了datasourc接口的具体实现类;同时由该数据源管理器组件实现对datasource接口的

11、具体控制和管理,而数据源管理器组件是可以通过以xml配置方式来管理datasource资源。struts datasource管理器主要是通过struts框架的xml配置文件struts-config.xml中的<data-source>标签进行定义的。这个管理器可以用来分发和配置任何实现了javax.sql.datasource接口的数据库连接池(connection pool)。2、jakarta的公共连接池实现类basicdatasourceapache jakarta提供的公共连接池实现类mons.dbcp.basicdatasource可以和struts框架系统中的dat

12、asource管理器相互合作。如果需要在项目中应用struts框架中的datasource管理器以期望能够从一个datasource接口的实现类来获得数据库连接connection对象,首先需要下载与jakarta的公共连接池实现类basicdatasource相关的三个*.jar包文件,这些文件可以从网站上下载,具体请见图8.55所示的下载结果图示。这三个文件分别是commons-pool-1.2.jar、commons-dbcp-1.2.1.jar和commons-collections.jar。图8.55 下载与datasource管理器相关的各个*.jar包

13、文件的图示下载完后并对其进行解压缩,将这三个*.jar包系统文件导入到项目的web-inf/lib目录下,它们主要实现struts datasource管理器和公共连接池的本地实现。最后的操作结果请见图8.56所示。图8.56 导入与datasource管理器相关的*.jar包到项目的web-inf/lib目录下3、在eclipse中为本项目配置出datasource在eclipse开发工具中,将源代码(【source】)窗口中的标签切换到struts-config.xml文件的设计(【design】)窗口显示状态, 并右击其文档显示区域,在弹出的快捷菜单中选择【new】菜单中的【dataso

14、urce】子菜单项目,如图8.57所示的操作结果。图8.57在eclipse中配置出datasourcemyeclipse工具随后将会弹出图8.58所示的对话框,在弹出的图8.58中所示的对话框中的key输入条中输入webdatasource,而在type输入条中输入datasource 的实现类mons.dbcp.basicdatasource;在driver class的输入条中输入net.sourceforge.jtds.jdbc.driver(本示例计划采用jdts的jdbc驱动程序包文件),而在url地址输入条中输入目标数据库系统的url地址jdbc:jtds:sqlserver:/

15、:1433/bbsdatabase;访问数据库系统时的用户名称为sa,而密码设置为1234。最后的操作结果请见图8.58所示。在图8.58所示的对话框中点击【确认】按钮后,将产生出下面的datasource的配置项目。在【例8-7】中定义了一个名称为webdatasource的datasource管理器的具体实现,具体请见【例8-7】中的datasource配置项目的示例。如果在项目中需要多个不同的数据源,也可以为应用系统配置定义多个不同的数据源datasource的配置项目。此时,一定要通过不同名称的key来加以区分、并根据名称进行选择。图8.58 设置本datasourc

16、e的各个属性配置参数【例8-7】datasource配置项目示例<data-sources><data-source key="webdatasource"type="mons.dbcp.basicdatasource"> <set-property property="password" value="1234" /> <set-property property="maxactive" value="10" /> <s

17、et-property property="username" value="sa" /> <set-property property="driverclassname" value="net.sourceforge.jtds.jdbc.driver" /> <set-property property="url" value="jdbc:jtds:sqlserver:/:1433/bbsdatabase" /> <se

18、t-property property="defaultreadonly" value="false" /> <set-property property="defaultautocommit" value="true" /> </data-source> <data-source > <! 第二个datasource的配置项目,在此省略- > </data-source> </data-sources >4、在action类中获得dat

19、asource对象在action类的 execute方法中,利用action类中的getdatasource方法获得保存在httpservletrequest对象中的datasource配置项目。本项目示例中的datasource配置项目的key名称为webdatasource,而在action类中获得key名称为webdatasource的datasource对象的代码示例请见【例8-8】所示。【例8-8】在action类中获得datasource对象的代码示例javax.sql.datasource datasource = null;java.sql.connection conn =

20、null;java.sql.statement stmt = null;trydatasource = getdatasource(request,"webdatasource");conn = datasource.getconnection();catch(sqlexception e) system.out.println(e.tostring();1.1.3 struts框架中的异常处理机制及具体应用在常规的web应用系统的开发中,对于应用系统模型层组件所产生出的各种形式的异常的处理方法,主要是采用通过try/catch语句直接编程捕获异常,然后定制个性化的比较详细

21、的错误信息保存到httpservletrequest对象中,最后在具体的返回页面中显示输出这些错误信息、并反馈给用户。这样的异常处理技术实现,将会大大地增加应用系统业务层组件和错误处理功能组件之间的藕合度。因此,更好的设计和开发实现方式,应该分离两者之间的紧密关系。尽管在struts框架中没有提供对面向切面编程技术(aop,aspect oriented programming)的支持,但仍然在对许多技术的支持和应用方面,也应用了aop的基本思想。因为应用系统的健壮性和稳定性的实现和获得,离不开有效的错误处理机制、特别是异常处理技术的具体应用。struts框架不仅要为应用系统的持久层提供“有所

22、作为”的支持,当然在应用系统的错误处理技术的支持方面,肯定也不会“掉以轻心”。因此,在struts框架中同样也加入了对异常处理技术的支持称之为exception handling,而且是以可配置的形式提供给web应用系统的开发者。1、java技术平台的异常处理技术1)系统级异常和应用级异常当java 虚拟机(jvm)在执行应用系统程序中的某个方法时遇到了非正常现象,jvm就会生成一个异常对象,并把它抛给客户以便向客户通报程序在运行过程中出现了有关的问题。合理地处理异常可以使应用系统程序更加健壮和稳定。 从开发应用的角度来看,可以将异常分为系统级异常和应用级异常。前者与应用的逻辑无关,通常是由对

23、应用系统提供支持服务的程序所产生的如不能正确地获得数据库连接对象、由于数据库原因不能插入数据等等。对这些异常的处理,一般需要由服务提供者的实现程序员来处理该类异常;而应用级的异常是由于操作者用户违背了商业业务逻辑规则而导致出现的各种错误,这种错误一般不是致命的,应该将错误信息反映给应用系统的当前用户并让用户进行处理,并且应用系统尽可能地能够从异常中恢复。2)应用系统开发中的异常处理的基本原则(1)在处理异常时,要注意尽可能不要让最终的用户看到应用系统中原始的java异常信息因此,应该首先对原始的java异常信息进行包装,然后向操作者用户显示容易理解的错误信息。图8.59所示为某个应用系统中直接

24、向用户端产生出原始的异常信息的状态图示,这将产生出不友好的用户界面。图8.59 某个应用系统中直接向用户端产生出原始的异常信息的状态图示而为了能够达到上述的设计目标,可以采用异常处理的链来避免出现这样的状况,也就是在系统中对原始的异常进行转换为应用系统中的自定义的异常类型,然后再次向上一级的调用者程序抛出。实现此功能的示例代码请见【例8-9】所示,该示例代码实现将标准的sqlexception异常转换为项目中的自定义的异常类型webbbsexception。同时也将原始的异常信息写入到log文件中(请见其中的黑体部分的代码)。【例8-9】对原始的异常进行转换为应用系统中的自定义的异常类型的代码

25、示例public void closedbcon() throws webbbsexception try con.close();con = null;catch (sqlexception e) /首先将原始的异常写入到log文件中,再进行异常的转换logger.error(e.getmessage();throw new webbbsexception("不能正确地关闭数据库连接");(2)可以将原始的java异常信息记录到日志文件中通过将原始的java异常信息记录到日志文件中,可以帮助系统管理员或者软件开发人员进一步更方便地查找错误的原因。请见【例8-9】中的黑体部

26、分的代码示例。(3)在表示层的组件中捕获用户自定义的异常类然后根据所捕获的用户自定义的异常类的不同,分别显示出与特定的应用逻辑相关的错误提示文字。实现该功能的示例代码请见【例8-10】所示,该代码为在struts框架中的某个action类捕获底层业务组件所抛出的自定义的异常webbbsexception、并将该异常信息再向某个表示层页面中转发和显示输出。【例8-10】在表示层的组件中捕获用户自定义的异常类的代码示例try okornot=userinfomanagebean.doupdateoneuserinfo(oneregisteruserinfovo);catch(webbbsexcep

27、tion e)request.setattribute("errortext", "出现如下的错误:" +e.getmessage();return mapping.findforward("showwebapperror");2、struts框架中的异常处理机制及实现技术1)struts框架中的异常处理实现的基本过程struts框架中的异常处理机制及实现技术是建立在java语言平台的异常处理技术的基础上的,并在表示层和控制层中提供了对异常处理的具体支持。struts框架中的actionservlet控制器组件一方面要捕获调用应用系统

28、中模型层组件中的业务方法时所抛出的异常,另一方面也还要捕获控制器组件本身在运行过程中所抛出的异常。当actionservlet控制器组件捕获到异常后,在异常的处理代码中将创建描述异常信息的actionmessage对象并把它保存到actionmessages对象中,然后再将actionmessages对象保存到httpservletsequest或者httpsession等特定的范围内;最后,在表示层页面中利用<html:errors>标签检索特定范围内的actionmessages对象,把本地化的错误信息输出到表示层的目标jsp页面中。2)以编程的方式来实现异常处理在基于stru

29、ts框架的web应用系统的开发过程中,对于异常的处理,也可以采用一般的web应用系统中常用的采用try/catch语句形式来捕获应用系统中的各种异常,然后定制出个性化的比较详细的错误信息放进actionerror对象(请见【例5-1】的示例)或者httpservletsequest对象中(请见【例8-10】的示例),然后在具体的返回页面中把这些错误信息反馈给用户(包括开发员)。但采用以编程的方式来实现应用系统中的异常处理,将不可避免地会产生出硬编码的后果(也就是将异常的类型、错误提示以及显示异常错误的目标程序等信息具体固定了),从而增强了与错误信息的藕合度。而更好的实现方法是应用“可配置”的异

30、常处理实现方式。2) 用可配置的方法来实现异常处理其实采用可配置的方法来实现应用系统中的异常处理,在j2ee技术平台中很多框架都应用了此方法、包括j2ee web标准规范中也在web.xml中提供了对可配置的异常处理的支持(请见【例4-11】的示例)。当然,在struts框架中也提供了以配置的方法来实现应用系统中的异常处理的技术支持。通过在struts的配置文件struts-config.xml中来定制应用系统运行时的各种类型的异常处理规则。从而使得应用系统在错误处理实现技术方面,也具有一定的灵活性。3、以配置方式处理action类中所触发的各种异常在struts框架中允许以配置方式来处理异常

31、,从而可以避免在action类中通过程序代码以硬编码的形式处理异常,以提高程序的灵活性、可重用性和可维护性。这主要是通过struts-config.xml配置文件来定制异常处理信息,并指定如何处理action类中所抛出或者捕获的各种异常。1)在struts-config.xml文件中声明全局异常定义全局异常声明对应用系统中的所有action组件类都适用,并且全局异常定义的方法主要是利用<global-exceptions>标签实现,请见【例8-11】全局异常定义的配置示例。【例8-11】全局异常定义的配置示例<global-exceptions><exceptio

32、n key="strutsweb.login.exceptiontext" path="/showerrortext.jsp"scope="request" type="com.px1987.sshproject.exception.webappexception" /> </global-exceptions>【例8-11】的示例中定义了一个全局异常并采用struts框架中默认的异常处理类org.apache.struts.action.exceptionhandler来进行错误处理,该全局异常

33、声明的作用是当某一个action类中抛出com.px1987.sshproject.exception.webappexception异常的时候将通过showerrortext.jsp页面来显示错误提示文字,而其中的strutsweb.login.exceptiontext是资源字符串配置文件中的某一个key键。所对应的错误提示文字串为:strutsweb.login.exceptiontext=this is struts exception。struts框架中的可配置方式的异常处理实现其实就这么简单,开发者不再需要在程序代码中应用try/catch来捕获,一旦出现所定义的异常类型的异常错误

34、抛出,系统就会转到相应的页面并显示输出定制的错误信息。在<exception>标签内所包含的各个属性项目的含义如下:1) type:指定待处理的异常类的包和类名称2) handler:指定异常处理类,如果设置为用户自定义的异常处理类,则该类必须继承exceptionhandler类,而默认值为org.apache.struts.action.exceptionhandler。3) path:如果出现了异常错误,将由那个页面来显示错误提示文字4) key:指定错误提示文字的资源字符串文件中的key名称,struts框架将根据这个key到resourceboundle文件中寻找匹配的k

35、ey值所对应的错误提示文字消息文本。5) bundle:指定resource bundle,如果没有设置此项将使用默认的resource bundle。6) scope:指定actionmessages的存放范围,可选值包括request和session。默认值为request。2)在struts-config.xml文件中声明局部异常定义在某个<action>标签内所配置定义出的异常定义为局部异常定义,只适用于本action组件。<exception>标签的定义规则与全局异常定义规则相同。【例8-12】所示为某个action组件的局部异常定义的示例。【例8-12】某个

36、action组件的局部异常定义的示例<action-mappings> <action input="/index.jsp" name="userloginform" path="/userloginuri" scope="request" type="com.px1987.sshproject.action.userloginaction"><exception key="strutsweb.login.exceptiontext" scope

37、="request"path="/showerrortext.jsp"type="com.px1987.sshproject.exception.webappexception" /> <forward name="loginsuccess" path="/loginsuccess.jsp" /> <forward name="loginfailure" path="/loginfailure.jsp" /> </action> </action-mappings>1.2 本章小结1、本章的学习重点“测试为先,持续重构”作为良好的软件开发方式被越来越多的开发人员所采纳。本章以重构和完善bbs论坛系统为示例,系统地介绍了软件重构技术及在项目中具体的实际应用、eclipse开发工具对重构技术的支持等方面的内容。通过对bbs论坛系统实施代码重构,一方面扩展了系统的功能实现,另一方面也提高了系统中的各个功能实现程序代码的可读性和可维护性、可扩展性和可重用性,并降低对整个项目的维护修改的成本。而ec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论