4.2.2 系统接口设计 Java程序设计语言提供了两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类。两种机制之间最明显的区别是,抽象类允许包含某些方法的实现,但是接口是不允许的。一个更为重要的不同之处在于,为了实现一个由抽象类定义的类型,它必须成为抽象类的一个子类。任何一个类,只要它定义了所有要求的方法,并且遵守通用约定,那么它就允许实现一个接口,不管这个类位于类层次的哪个地方。因为Java只允许单继承,所以,抽象类作为类型定义受到了极大的限制。接口使得我们可以构造出非层次结构的类型框架。例如:假设有一个接口代表一个singer(歌唱家),另一个接口代表一个songwriter(作曲家): paper51.com public interface Singer{ copyright paper51.com AudioClip Sing(Song s); paper51.com } http://www.paper51.com public interface SongWriter{ 内容来自论文无忧网 www.paper51.com
Song compose(boolean hit); 内容来自www.paper51.com } copyright paper51.com 在现实生活中,有些歌唱家本身也是作曲家。因为是使用接口而不抽象类来定义这些类型,所以对于一个类而言,它同时实现Singer和Songwriter是完全允许的。实际上还可以定义第三个接口,它同时扩展了Singer和Songwriter,并且加入一些适合于这种组合的新方法: http://www.paper51.com public interface SingerSongwriter extends Singer,Songwriter{ copyright paper51.com AudioClipstrum(); 内容来自www.paper51.com VoidactSensitive(); paper51.com } http://www.paper51.com 如果要满足这样的一种灵活性,抽象类是不可能完成的。 copyright paper51.com 虽然接口不允许包含方法的实现,但是,使用接口定义类型并不妨碍你为程序员提供实现上的帮助,在本系统的接口设计与实现中借鉴了Java API中的将接口类与抽象类的优点结合起来,将期望导出的每一个重要接口,都提供一个抽象类的骨架实现(skeletal implementation)类。按照惯有编码命名习惯,将该骨架实现类命名为AbstractInterface 在该系统中采用这种方式的来设计的接口有Business(业务)接口,DAO(数据访问对象)接口。 内容来自www.paper51.com 4.2.3 自定义标签的设计在对系统的实现中,由于在表现层使用的是基于MVC的Struts框架,该框架中为了在表现层的JSP页面中不混合大量的Java代码,及保持JSP页面的程序的容易读性而提供了相应的Struts自己的一套标签,但是考虑到本系统的实际应用的功能实现。且这些功能实现又是Struts标签没法满足要求的,因此在该系统框架中实现了自己的一套标签,主要有<smart:submit></smart:submit>,<smart:select></smart:select>。 内容来自www.paper51.com 1. <smart:submit>标签: 内容来自论文无忧网 www.paper51.com
设计意图: 内容来自论文无忧网 www.paper51.com 在一般的基于B/S结构的web应用系统中,在页面上经常是会涉及到添加、编辑、删除几种常用的功能,在早期的一些开发编码中,相当一部分人是将这几种功能分为多个页面来实现,例如:添加用一个add.jsp页面,编辑用一个edit.jsp页面,删除用一个delete.jsp页面。而这些的页面的代码80%以上都基本上是一样的,只不过是上显示的按钮及在点击相应的提交给后台处理方法不一样。为了达到在一个页面上面实现添加、编辑、删除功能,并且要保持页面代码的清晰可读性,因此,在本系统框架中,封装了自定义的提交标签。 内容来自www.paper51.com 表1 <smart:submit>标签属性列表 paper51.com
属性名称 copyright paper51.com 属性描述 内容来自论文无忧网 www.paper51.com 备注 内容来自论文无忧网 www.paper51.com Id http://www.paper51.com 该标签元素的id 。 copyright paper51.com Name paper51.com
该标签元素的名称。 copyright paper51.com Property paper51.com
当点击该标签所显示的内容后所提交的参数名称 内容来自论文无忧网 www.paper51.com Message copyright paper51.com
该标签在页面上所显示的值,等同于html标签组里面的input标签的value属性。 paper51.com displayControl 内容来自www.paper51.com 是否要对该标签的内容是否在页面上显示出来作控制。 paper51.com 只有两种值 内容来自论文无忧网 www.paper51.com true/false copyright paper51.com
Image paper51.com
该标签在页面显示的内容的背景图片。 内容来自www.paper51.com onClick 内容来自论文无忧网 www.paper51.com
当点击该标签所展现的内容后所触发的事件。 http://www.paper51.com 2. <smart:select>标签: 内容来自论文无忧网 www.paper51.com 设计意图: copyright paper51.com 在一般的基于B/S结构的web应用系统中,在页面上经常要用到下拉框,且在JSP页面加载出来时就有一组相应的值,为了在加载该页面时动态的、带条件的取其标签相应的键/值对,因此,在本系统框架中,封装了自定义的下拉菜单。 copyright paper51.com 表2 <smart:select>标签属性列表 paper51.com
属性名称 http://www.paper51.com 属性描述 copyright paper51.com 备注 http://www.paper51.com name copyright paper51.com 该标签元素的名称。 内容来自论文无忧网 www.paper51.com property copyright paper51.com
该标签元素属性名称,与Struts中的html标签的property元素是一样的含义,对应于FormBean里面的一个域。 paper51.com content 内容来自www.paper51.com 该标签属性为标签取值的业务代码。 http://www.paper51.com multiple 内容来自论文无忧网 www.paper51.com 该属性同html标签组中的select标签的multiple属性。 paper51.com size 内容来自www.paper51.com 该属性同html标签组中的select标签的size属性。 paper51.com
style copyright paper51.com 该属性同html标签组中的select标签的style属性。 http://www.paper51.com
relationValue 内容来自论文无忧网 www.paper51.com 该属性为在加载该标签相应的值时的条件。 paper51.com 4.2.4 基于Struts表现层设计大部分基于B/S结构的web应用系统中,在页面上经常会出现一个以上的功能按钮,而这些功能按钮基本上都是对应于后台的一个操作实现,由于在本系统中的表现层选用较为成熟Struts框架,该框架中最为核心的部分要属控制器控制转发相应的HttpRequest,其中的LookupDispatchAction类是允许你指定一个具有多个方法的类,每一个方法的调用都基于配置文件中指定的一个特殊请求参数值,利用该参数值反向查询资源绑定,并将它与类中的一个方法进行匹配。从这些功能可以看出Struts是满足对系统页面上多个功能按钮与实现的绑定。 内容来自论文无忧网 www.paper51.com
因此,在对本系统进行架构设计的时候,考虑建立一个抽象的BaseAction类,该类继承LookupDispatchAction,实现LookupDispatchAction类中的getKeyMethodMap方法,在方法中返回本系统中请求参数值与资源文件中参数值的键/值对。实现一些对于所有的Action都是有可能用到的公共方法,包括从session中得到用户的信息;对页面上按钮是否显示的控制;检查用户权限;对公共业务逻辑接口的调用等等。在涉及到系统的具体开发实现的时候,要求所有开发人员在写自己的Action的时候统一继承BaseAction。 http://www.paper51.com
4.2.5 基于Hibernate持久层设计
本系统的持久层是基于开源的Hibernate来实现的,在了解到相关的Hibernate特性后,在本系统的框架中,从如下几个方面对其进行了进一步的封装。 copyright paper51.com 1. 对产生Session实例进行封装 http://www.paper51.com 设计意图: paper51.com Session是Hibernate持久化操作的基础。注意这里Session的含义,它与传统意义上的Web层的HttpSession并没有什么关系。Hibernate Session之与Hibernate,相当于JDBC Connection与JDBC。 内容来自www.paper51.com Session作为贯穿Hibernate的持久化管理器核心,提供了众多持久化方法,如save、update、delete,find等。通过这些方法即可透明地完成对象的增删改查(CRUD)。但是值得注意的是,Hibernate Session的设计是非线程安全的,也就是说,一个Session实例同时只可由一个线程使用,同一个Session实例的多线程并发调用将导致难以预知的错误。 copyright paper51.com
因此在本框架中对通过SessionFactory所产生的Session。进行了线程安全性的处理,在实现的HibernateSessionFactory类新建一个Java中的ThreadLocal类,将每次产生Session放入该类中,这样就达到了线程安全性的效果了。 paper51.com 当产生Session而创建SessionFactory实例时,也要注意对SessionFactory重用的问题,因为SessionFactory中保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级缓存和Statement Pool。由此可见,SessionFactory的创建过程必然非常复杂、代价高昂,而这也意味,在系统设计中要充分考虑到SessionFactory的重用策略。由于SessionFactory采取了线程安全的设计,可由多个线程并发调用,大多数情况下,一个应用中针对一个数据库共享一个SessionFactory实例即可。 内容来自www.paper51.com 内容来自www.paper51.com |