农民 发表于 2024-7-14 12:37:26

JAVA SMART系统-系统框架设计与开辟(源代码+论文)

这两年开始毕业设计和毕业答辩的要求和难度不停提升,传统的理念缺少创新和亮点,往往达不到毕业答辩的要求,这两年不停有学弟学妹告诉学长自己做的各类系统很难达到老师的要求。
为了各人能够顺利并以最少的精神通过毕设,学长分享优质毕业设计项目,需要的自取。
SMART系统是一个新型智能在线考试信息管理系统,该系统重要实现了门生在线考试与评估以及西席对门生在线考试信息的管理和维护。本文按照SMART系统的非功能性需求,基于Struts、Spring、Hibernate三种开源技能,构建了一个具有良好的可扩展性、可维护性、可靠性的系统框架。整个系统的框架分为三层,分别为体现层、业务层和长期层。 本系统的体现层是基于Struts作扩展设计,结合本系统的需求完成了自界说标签的封装,基本action接口的编写。在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在长期层的设计中则是采用基于现有长期层框架的实现模式,实现了对产生Session实例的封装,对常用数据库操作的封装。如许设计镌汰了耦合性且制止了生成大量的暂时对象。
该系统框架能达到良好的可拓展性和维护性。它不但仅适用这个系统的开辟,可以应用于J2EE领域中基于SSH来架构的大部分B/S系统。接下来向各人展示部分内容,如下:
1.系统总体框架设计

总体布局阐明

https://img-blog.csdnimg.cn/00ae2e4477a340f8a7e5876855b2c7d4.jpeg
 体现层

在整个SMART系统的总体框架中体现层是结合J2EE领域的开源框架Struts来实现的,Struts能充分满足应用开辟的需求,简单易用,该框架是基于MVC模式的来构建的,该模式将表达层分解为自包罗的和可重用的几个部分,当用户通过欣赏器发起HTTP哀求时,该框架将利用其ActionForm将哀求页面的非对象化的数据转化为对象,交由其对应Action来处置惩罚。
https://img-blog.csdnimg.cn/51e718f8310e47698a7289437a7b6d72.jpeg
业务层

在体现层与业务层之间利用一个公共代理类来完成交互,该代理类采用单例模式设计开辟,在整个框架中起到了如下几点作用:

[*]镌汰耦合性
[*]制止生成大量的暂时对象
在该代理类,实现一个对相应业务逻辑的处置惩罚方法,该方法的参数为一个封装好相应的页面数据对象、要调用的业务类的名称及该业务类中相应的处置惩罚方法名的类。
在该层中利用了Spring框架中的IoC模式(英文全名为Inversion of Control即反转模式),该模式类似于著名的好莱坞原则:“Don't call us,we'll call you”,后被Martin Fowler改名为 Dependency Injection 依赖注射,也就是将类之间的关系通过第三方进行注射,不需要类自己去解决调用关系,实现了调用者和被调用者之间的解耦分离。IoC的引入并没有消除接口与实现类之间的联系,它的实质在于只是将这种联系转移了。在Spring的IoC实现中这关系被转移到相应的XML配置文件中,由Spring框架来提供对这种关系的依赖注入。
https://img-blog.csdnimg.cn/03636b01ee574310a481ba1a205ea0b0.jpeg
​​​​​​​长期层

在SMART系统的整体框架中的长期层,是采用基于现有长期层框架的实现模式,在这种模式中,将最为繁琐的基于JDBC的OR映射工作,交由第三方组件(本框架中采用开源的Hibernate)来完成,如许就会在对数据访问对象进行编码时,大大的简化了一些繁琐而又复杂的编码工作,只需要利用Hibernate提供的API,对长期化对象进行操作。在该长期层框架提供了良好的性能优化机制,如内置的数据库毗连池支持,PreparedStatement缓存、数据缓存等。这些优化机制的综合利用大大提升了系统的性能。
在SMART系统的长期层中,对一些常用的添加、删除、更新数据库操作进行了抽象封装。并在Hibernate中配置相应的数据库毗连池实现。
https://img-blog.csdnimg.cn/1acc7982aeb74b4fb461673a7e48755b.jpeg
2. ​​​​​​​总体布局设计与建模

​​​​​​​公共代理机制的设计

在大部分采用B/S布局的web应用中,用户与系统的交互都是要涉及到相应的交互数据、业务逻辑,因此在本系统的框架设计中考虑到将这些交互中涉及到的因素全部封装到一个Carrier类中,再通过一个单例类来实现体现层与业务层的交互,如许用户操作时不用每次都去new一个暂时的对象,也实现各功能模块中子程序之间的解耦。
​​​​​​​系统接口设计

Java程序设计语言提供了两种机制,可以用来界说一个允许多个实现的类型:接口和抽象类。两种机制之间最明显的区别是,抽象类允许包罗某些方法的实现,但是接口是不允许的。一个更为重要的差别之处在于,为了实现一个由抽象类界说的类型,它必须成为抽象类的一个子类。任何一个类,只要它界说了所有要求的方法,并且遵守通用约定,那么它就允许实现一个接口,不管这个类位于类层次的哪个地方。因为Java只允许单继承,所以,抽象类作为类型界说受到了极大的限制。接口使得我们可以构造出非层次布局的类型框架。例如:假设有一个接口代表一个singer(歌唱家),另一个接口代表一个songwriter(作曲家):
public interface Singer{
   AudioClip Sing(Song s);
}
public interface SongWriter{
   Song compose(boolean hit);
}
在现实生活中,有些歌唱家本身也是作曲家。因为是利用接口而不抽象类来界说这些类型,所以对于一个类而言,它同时实现Singer和Songwriter是完全允许的。现实上还可以界说第三个接口,它同时扩展了Singer和Songwriter,并且加入一些适合于这种组合的新方法:
   public interface SingerSongwriter extends Singer,Songwriter{
       AudioClip strum();
       Void actSensitive();
}
如果要满足如许的一种灵活性,抽象类是不可能完成的。
固然接口不允许包罗方法的实现,但是,利用接口界说类型并不妨碍你为程序员提供实现上的帮助,在本系统的接口设计与实现中鉴戒了Java API中的将接口类与抽象类的优点结合起来,将期望导出的每一个重要接口,都提供一个抽象类的骨架实现(skeletal implementation)类。按照惯有编码命名风俗,将该骨架实现类命名为AbstractInterface
在该系统中采用这种方式的来设计的接口有Business(业务)接口,DAO(数据访问对象)接口。
​​​​​​​

[*]<smart:select>标签:
设计意图:
在一样平常的基于B/S布局的web应用系统中,在页面上经常要用到下拉框,且在JSP页面加载出来时就有一组相应的值,为了在加载该页面时动态的、带条件的取其标签相应的键/值对,因此,在本系统框架中,封装了自界说的下拉菜单。
自界说标签的设计

在对系统的实现中,由于在体现层利用的是基于MVC的Struts框架,该框架中为了在体现层的JSP页面中不混淆大量的Java代码,及保持JSP页面的程序的容易读性而提供了相应的Struts自己的一套标签,但是考虑到本系统的现实应用的功能实现。且这些功能实现又是Struts标签没法满足要求的,因此在该系统框架中实现了自己的一套标签,重要有<smart:submit></smart:submit>,<smart:select></smart:select>。
     2.<smart:submit>标签:
设计意图:
在一样平常的基于B/S布局的web应用系统中,在页面上经常是会涉及到添加、编辑、删除几种常用的功能,在早期的一些开辟编码中,相当一部分人是将这几种功能分为多个页面来实现,例如:添加用一个add.jsp页面,编辑用一个edit.jsp页面,删除用一个delete.jsp页面。而这些的页面的代码80%以上都基本上是一样的,只不外是上显示的按钮及在点击相应的提交给后台处置惩罚方法不一样。为了达到在一个页面上面实现添加、编辑、删除功能,并且要保持页面代码的清晰可读性,因此,在本系统框架中,封装了自界说的提交标签。
​​​​​​​基于Struts体现层设计

大部分基于B/S布局的web应用系统中,在页面上经常会出现一个以上的功能按钮,而这些功能按钮基本上都是对应于后台的一个操作实现,由于在本系统中的体现层选用较为成熟Struts框架,该框架中最为核心的部分要属控制器控制转发相应的HttpRequest,其中的LookupDispatchAction类是允许你指定一个具有多个方法的类,每一个方法的调用都基于配置文件中指定的一个特殊哀求参数值,利用该参数值反向查询资源绑定,并将它与类中的一个方法进行匹配。从这些功能可以看出Struts是满足对系统页面上多个功能按钮与实现的绑定。
因此,在对本系统进行架构设计的时候,考虑创建一个抽象的BaseAction类,该类继承LookupDispatchAction,实现LookupDispatchAction类中的getKeyMethodMap方法,在方法中返回本系统中哀求参数值与资源文件中参数值的键/值对。实现一些对于所有的Action都是有可能用到的公共方法,包括从session中得到用户的信息;对页面上按钮是否显示的控制;查抄用户权限;对公共业务逻辑接口的调用等等。在涉及到系统的具体开辟实现的时候,要求所有开辟职员在写自己的Action的时候统一继承BaseAction。
​​​​​​​基于Hibernate长期层设计

本系统的长期层是基于开源的Hibernate来实现的,在相识到相关的Hibernate特性后,在本系统的框架中,从如下几个方面对其进行了进一步的封装。

[*]对产生Session实例进行封装
设计意图:
Session是Hibernate长期化操作的基础。留意这里Session的含义,它与传统意义上的Web层的HttpSession并没有什么关系。Hibernate Session之与Hibernate,相当于JDBC Connection与JDBC。
Session作为贯穿Hibernate的长期化管理器核心,提供了浩繁长期化方法,如save、update、delete,find等。通过这些方法即可透明地完成对象的增编削查(CRUD)。但是值得留意的是,Hibernate Session的设计是非线程安全的,也就是说,一个Session实例同时只可由一个线程利用,同一个Session实例的多线程并发调用将导致难以预知的错误。
因此在本框架中对通过SessionFactory所产生的Session。进行了线程安全性的处置惩罚,在实现的HibernateSessionFactory类新建一个Java中的ThreadLocal类,将每次产生Session放入该类中,如许就达到了线程安全性的结果了。
当产生Session而创建SessionFactory实例时,也要留意对SessionFactory重用的问题,因为SessionFactory中生存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级缓存和Statement Pool。由此可见,SessionFactory的创建过程必然非常复杂、代价高昂,而这也意味,在系统设计中要充分考虑到SessionFactory的重用策略。由于SessionFactory接纳了线程安全的设计,可由多个线程并发调用,大多数情况下,一个应用中针对一个数据库共享一个SessionFactory实例即可。
      2.对通常的数据库操作进行封装
设计意图:
在系统的设计架构中考虑到代码的重用性,因此对一些通用的数据库的操作都将其封装到一个公共类中,如许就镌汰了系统开辟职员的代码编写工作量,也制止了同功能代码的重复编写。
​​​​​​​序列图

https://img-blog.csdnimg.cn/c4cc4cde01cc4cf28dc64257ebcc2383.jpeg
 其他内容就不一一展示了,如需对应的源码,可以评论大概下方联系我,私信都可以。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: JAVA SMART系统-系统框架设计与开辟(源代码+论文)