毕业论文-基于Java EE的内容管理系统

上传人:na****u 文档编号:61259621 上传时间:2022-03-10 格式:DOC 页数:41 大小:14.91MB
返回 下载 相关 举报
毕业论文-基于Java EE的内容管理系统_第1页
第1页 / 共41页
毕业论文-基于Java EE的内容管理系统_第2页
第2页 / 共41页
毕业论文-基于Java EE的内容管理系统_第3页
第3页 / 共41页
点击查看更多>>
资源描述
济南大学毕业设计摘 要本设计旨在开发一款基于Java EE的内容管理系统(Content Management System,简称CMS),系统面向开发人员,提供一套切实可行的内容管理系统基础开发架构解决方案,以开放源代码的方式为开发人员提供一套内容管理系统的二次开发框架,将开发人员从繁重的前期开发过程中解放出来。系统基于JavaEE平台开发,构建在Spring框架之上,借助Spring Roo快速开发技术实现数据访问层以及Service层的快速开发,使用AspectJ实现编译时织入访问权限控制以及内建声明式缓存解决方案,实现了一套基本的内容管理系统所应具有的基础功能,如RBAC访问权限控制、用户管理、内容发布管理、公告管理、站内信、友情链接等,使得开发人员在项目开发中专注于系统业务逻辑开发,缓解开发人员的工作压力,提高项目开发效率,缩短项目开发周期。关键词:CMS;内容管理系统;二次开发平台;SpringABSTRACTThis design is to develop a Content Management System(CMS), the system is for developer, it supply a useful framework of secondary development based on Content Management System . This basic infrastructure solution make the developer get rid of the heavy work . The system is developed based on Java EE platform, and build with Spring framework , we take fully advantage of Spring Roo Rapid application development tool to build our data access and service layer, by using AspectJ, we weaving access control and cache solution in compile time, Implements a set of basic functions of a CMS should have, such as role based access control, user management, content publish management, announce management, blogroll management .The system make developer focus on business logic, Relieve the pressure on developers, improve the efficiency of project development, and shortening the project cycle and improving product quality.Key words:CMS;Secondary development platform;Spring目录摘 要IABSTRACTII目录III1 系统开发背景11.1 内容管理系统概论11.2 国内外内容管理系统发展现状21.3本文档结构22 系统架构技术及开发工具概述42.1 开发工具42.1.1 Spring Tool Suite42.1.2 操作系统平台52.1.3 Spring Roo52.2 开发技术概要52.2.1 Java EE技术62.2.2 Spring Framework62.2.3 AspectJ92.2.4 Hibernate102.2.5 Dwr102.2.6 Bootstrap113 系统总体设计123.1 需求分析123.1.1 传统Java EE企业架构的不足123.1.2 本系统开发需求133.1.3 性能需求153.2 系统整体架构153.2.1 系统架构模式153.2.2 系统目录结构173.3 系统核心模块设计203.3.1 基于AOP的访问权限控制203.3.2 基于Annotation的声明式缓存方案253.2.3 扩展开发274 项目管理和测试324.1 项目管理324.1.1基于Maven的依赖管理324.1.2代码托管Github324.2 系统测试334.2.1 单元测试334.2.2 系统运行测试34结 论35参 考 文 献36致 谢37IV1 系统开发背景1.1 内容管理系统概论网站内容管理系统, 即 Content Management System ,英文缩写是CMS。 网站内容管理系统具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。 网站内容管理系统的功能并不只限于文本处理,它也可以处理图片、Flash动画、声像流、图像甚至电子邮件档案。 网站内容管理系统其实是一个很广泛的称呼,从一般的博客程序,新闻发布程序,到综合性的网站管理程序都可以被称为内容管理系统。内容管理系统是一个很泛的概念:从商业门户网站的新闻系统到个人的博客都可以称作是内容发布系统。根据不同的需求,网站内容管理系统有几种不同的分类方法。比如,根据应用层面的不同,可以被划分为:(1) 重视后台管理的网站内容管理系统(2) 重视风格设计的网站内容管理系统(3) 重视前台发布的网站内容管理系统根据系统的开发方式有可以划分为:(1) 框架型:本身不包含任何的实现,只是提供了底层的框架,开发人员可以在此基础之上根据需求进行二次开发,实现项目需要的功能。(2) 应用型:本身是一个面向具体类型的应用实现,已经包含了新闻/评论管理,投票,论坛,WIKI等一些子系统。就已经存在的各种CMS来说,最终界面上都是大同小异,但是在编程风格与管理方式上来讲却是千差万别。就CMS本身被设计出来的出发点来说,应该是方便一些对于各种网络编程语言并不是很熟悉的用户用一种比较简单的方式来管理自己的网站。这虽然是本身的出发点,但由于各个CMS系统的原创者们自己本身的背景与对“简单”这两个字的理解程度的不同,就造成了没有统一的标准群雄纷争的局面。简而言之,CMS就是可以让你不需要学习复杂的建站技术,不需要学习太多复杂的程序设计语言,你就能够利用CMS构建出一个风格统一功能强大的专业网站。根据需求不同,内容管理系统又可以被分离成以下几个层面:后台业务管理子系统:后台管理系统主要包含新闻录入、论坛管理、全文检索等,针对不同的需求,提供不同的内容录入管理方式,比如所见即所得的编辑界面或者是基于代码的管理页面,系统权限控制等侧重于管理。门户系统: 门户系统是表现优先的,系统大部分的最终输出页面,网站首页, 子频道,专题,新闻详情等各种模块的组合,这种发布组合逻辑是非常丰富的,门户系统就是负责以上这些后台子系统的组合表现管理。前台发布系统: 这一部分是效率优先的,面向最终用户的缓存发布以及搜索引擎爬虫和URL的设计等。1.2 国内外内容管理系统发展现状目前不论是国内国外,都有大量优秀的CMS系统,这些CMS大都专注于特定领域,当然,随着技术的进步和发展,也有部分厂商为多数应用领域都提供了内容管理的解决方案。比较著名的WordPress起初只是一款博客平台,到现在已经发展为了一款综合的CMS管理平台,当然它的主要功能还是博客,但是通过插件机制,可以很轻松的实现公司宣传网站,作品集网、图库甚至是全功能的商业网站。WordPress的后端非常直观易用,操作都是标准化的,只要你学会了一个管理模块的操作,其它部分的操作就得心应手了,它的功能组织也非常科学,很容易找到需要的功能,其所见即所得的编辑器功能非常强大,包括插入图像、视频和其它媒体,可以在HTML模式和可视化模式之间轻松来回切换。Joomla是目前最流行的开源CMS系统,它运行在PHP和MySQL上,后台相对简单易用,包括文章管理、头版、菜单、媒体和其它内容,下拉菜单也有许多选项,Joomla有一个好用的所见即所得编辑器,支持大量的格式化选项和表情。当然,国内也有很多优秀的CMS系统,较为常见的诸如Discuz是一款老牌的论坛管理系统,而PHPCMS则以文章发布以及二次开发等著称。Discuz是康盛创想(北京)科技有限公司(英文简称Comsenz)推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。Discuz! 的基础架构采用世界上最流行的web编程组合PHP+MySQL实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。PHPCMS采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计、开发与维护。它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各种规模的网站需求,可靠性高,是一款具备文章、下载、图片、分类信息、影视、商城、采集、财务等众多功能的强大、易用、可扩展的优秀网站管理软件。1.3本文档结构在本文档中,将会介绍如下内容。在第一章中,也就是上面的章节中,介绍了什么是内容管理系统以及当前国内外内容管理系统技术发展的现状。第二章将会对系统开发过程中使用的技术以及开发工具进行一个简要的描述,使得在后面的文档阅读过程中,对文档中提到的一些工具以及技术有一个概要性的了解,方便文档的阅读。第三章是对系统总体设计的概述,主要包含了项目开发前期的需求分析、系统的整体架构以及系统核心模块的设计,在阅读完该部分后,将会对系统的总体架构以及核心技术有一个简要的了解。第四章是对系统开发过程中项目管理以及系统测试的说明,系统是基于Maven进行项目管理的,因此有必要对Maven进行一些说明,同时,项目代码托管于Github,测试作为系统开发的重要环节,在这里也会有一个概括性的描述。最后是结论,该部分主要描述了系统完成情况以及系统开发过程中的一些问题和今后的开发方向等。2 系统架构技术及开发工具概述2.1 开发工具2.1.1 Spring Tool SuiteSpring Tool Suite(STS)是一款基于Eclipse的IDE, 它为开发基于Spring的企业应用而产生,提供了最好的Eclipse开发环境,STS同时也提供了最新的基于JAVA和Spring应用开发所需要的所有工具,并且配备了最新的Eclipse版本。STS同时也为Java企业级应用开发提供了一些其它的特性,比如基于Spring DM Server的OSGi开发,以及一些其它的Spring项目支持,如Spring Roo, Spring Batch等。Spring Tool Suite如图2.1所示。图2.1 Spring Tool Suite与MyEclipse等编辑器不同,STS在提供大量开发者需要的功能以及对Eclipse进行各种优化的同时,对STS也采用了开源免费使用的策略,因此,使用STS进行JAVA甚至是Groovy等基于JVM的编程语言的开发是完全免费的,任何人都可以无限制的使用它。当然,STS并不强制你使用完整的STS编辑器进行开发,如果更喜欢原生的Eclipse IDE的话,可以通过STS的在线更新连接对Eclpse进行更新,安装STS的插件,使得使用原生的eclipse也可以体验STS的强大功能。2.1.2 操作系统平台由于系统采用Java语言进行开发,自然继承了Java语言的跨平台特性,不仅支持windows下的开发以及部署,任何支持jvm的操作系统平台都可以平稳的运行。2.1.3 Spring RooSpring Roo是针对 Java 技术的一个可扩展的、基于文本的开源 RAD 工具。它是用于创建和管理基于 Spring 的应用程序的一个强大资源。Spring Roo是SpringSource新的开放源码技术,该技术主要面向企业级Java应用的开发者,该工具在不牺牲工程的完整和灵活性的基础上,简化了开发人员的开发工作。不管是对Java新手还是资深的架构师,Spring Roo都可以在短短的几分钟内构建一个全面完整的工作应用。Spring Roo是用来创建Spring工程的工具,它通过一系列的命令快捷的建立起一个基于Spring的项目,通过不同的命令,可以完成Spring框架的大部分特性的操作。Spring 框架于 2002 年年底发布,目的在于简化 J2EE(目前是 JavaEE)开发。在过去 8 年中,Spring 成功完成了该使命,提供了 Java 社区框架或功能,比如 Spring Security、Spring MVC、事务管理、Spring 批处理和 Spring 集成,这都易于理解和使用。Spring 希望让 Java 开发人员的工作更轻松、更富成效。为此,Spring 创建了一个名为 Spring Roo 的开发工具。使用Spring Roo,你可以动态的添加和配置JPA、Spring MVC、Spring Security等功能,使用log4j进行日志记录,Junit进行单元测试以及jms,电子邮件等框架,仅需要在Roo shell中敲入相应的命令即可。使用Spring roo添加这些常用的功能极大的节省了开发时间,提高了开发人员的生产效率。Roo不能用于编写业务逻辑,单完全可以用来管理程序的基础结构或者是配置。Roo是一个开发时间工具,这意味着应用程序运行时应该独立运行着Roo。由于Roo通过AspectJ对代码完成了编译时织入代码,因此,在最终的产品中,并不会存在SpringRoo部分,因此,对系统性能和内存开销不会有任何影响,同时也确保了最终项目不会依赖于Spring Roo,只需要几个按键就可以从项目中完整的删除Roo。2.2 开发技术概要在该项目的开发过程中,用到了许多技术,这一章,对主要用到的技术进行一个简要的概括。2.2.1 Java EE技术Java是一种可以用来编写跨平台应用软件的面向对象的开发语言,它与1995年由Sun公司开发,现在属于Oracle公司旗下。Java技术具有卓越的通用性、高效性、平台移植性以及安全性,广泛的应用于个人电脑,服务器、数据中心、高性能计算机以及智能手机和互联网等各个领域,拥有全球最大得开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著的优势和广阔的前景。Java主要有四个部分组成:Java编程语言、Java类文件格式、Java虚拟机以及Java API。Java自诞生之日起,分为了三个体系:Java EE, Java SE, Java ME。与传统程序不同,Sun公司在推出Java之际将其作为了一种开放的技术。全球数以万计的开发公司被要求设计的java软件必须相互兼容。Java语言靠群众力量而非公司力量是java公司的口号之一,并获得了广大的软件开发商的认同。这与微软公司所倡导的的注重精英和封闭式的模式完全不同。Sun公司对java编程语言的解释是:java编程语言是个简单的、面向对象的、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。Java平台是基于java语言的平台。这样的平台非常流行。因此微软公司推出了欲与其进行竞争并且模仿java语言的C#语言。2.2.2 Spring FrameworkSprng开发框架是一个非常活跃的开源项目,它是一个基于IoC和AOP的Java EE系统框架,它不强迫你必须去使用它,而是将各种功能进行高度解耦,开发人员可以按照自己的喜好去选择使用这些组件中的某一个或者是某几个。Spring框架通过IoC(控制反转/依赖注入)实现了对Bean的管理,开发人员只需要关注具体业务逻辑的开发,不必要花费过多的时间在Bean的管理上,极大的降低了Java开发的难度,提高了开发效率,减少了开发过程中出现的各种问题,使得应用的开发组建更加快捷简易。Spring IoC如图2.2所示。图2.2 Spring IoCSpring是一个全功能的开发框架,从数据访问层到事务管理,以及web层等都提供了强有力的支持,Spring建议采用面向接口开发,通过接口的实现,使得应用程序的各部分组建之间最大程度的解耦,实现了各个层次之间的分离。Spring同时提供了强大的AOP支持,所谓的AOP就是面向切面编程,它通过预编译以及运行期间代理实现了在不修改源代码的情况下给程序动态统一的添加功能的一种技术。AOP实际上是Gof设计模式的一种延续,设计模式孜孜不倦的追求的是调用者与被调用者之间的解耦,AOP可以说是这种目标的一种实现。AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。Spring AOP代理如图2.3所示。图2.3 Spring AOP代理Spring框架是一个分层的架构,它主要有七个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式。Spring功能模块如图2.4所示。 图2.4 Spring功能模块图Spring MVC属于SpringFramework的后续产品,已经融合在Spring Web Flow中。Spring 框架提供了构建Web应用程序的全功能的MVC模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还可以是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。Spring MVC架构如图2.5所示。图2.5 Spring MVC架构2.2.3 AspectJAspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。AspectJ的动机是发现那些使用传统编程方法无法很好处理的问题。考虑一个应用中的安全策略问题。安全性始终贯穿与系统的所有模块之间,每个模块都需要安全机制才能保证整个系统的安全性,这里的安全策略实际上就是一个横切关注点,使用传统的编程解决此问题是相当困难并且很容易产生各种差错,这就是AOP发挥作用的时候了。AspectJ使用了Java5的注解,可以将切面声明为普通的java类。在传统的面向对象编程中,每一个单元就是一个类,而类似于安全性这方面的问题,它们通常不能集中在一个类中处理,因为他们横切多个类,这就导致了代码无法重用,可以维护性差而产生了大量的代码冗余,这是我们都不喜欢看到的。面向方面编程的出现正好给处于黑暗中的我们带来了光明,它针对于这些横切关注点进行处理,就好像面向对象编程处理一般的关注点一样。而作为AOP的具体实现之一的AspectJ,它向Java中加入了连接点(Join Point)这个新概念,其实它也只是现存的一个Java概念的名称而已。它向Java语言中加入少许新结构:切点(pointcut)、通知(Advice)、类型间声明(Inter-type declaration)和方面(Aspect)。切点和通知动态地影响程序流程,类型间声明则是静态的影响程序的类等级结构,而方面则是对所有这些新结构的封装。2.2.4 HibernateHibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有。它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。Hibernate技术架构如图2.6所示。图2.6 Hibernate技术架构2.2.5 Dwr Dwr(Direct Web Remoting)是一个允许基于java的服务端应用程序和基于javascript的浏览器之间以尽可能简单的方式进行直接交互的java类库。它可以帮助开发人员开发出包含Ajax技术的网站。Dwr概述如图2.7所示。Dwr主要包含两个部分:(1) 允许Javascript从web服务器上一个遵循了ajax原则的Servlet中获取数据。(2) 帮助web开发人员轻松的获取数据动态改变网站内容。图2.7 Dwr概述2.2.6 BootstrapBootstrap是快速开发Web应用程序的前端工具包。它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等。3 系统总体设计3.1 需求分析本系统是一款基于Java EE平台,建立在Spring MVC之上的一款方便二次开发的内容管理系统(CMS)。本系统是一款基于B/S架构的内容管理系统,用户以及管理人员通过网络浏览器对服务器上的系统进行访问,不需再安装任何客户端软件。3.1.1 传统Java EE企业架构的不足在传统的Java EE开发过程中,通常我们会将整个系统分为四个层次: 表现层、业务层、持久层、平台层。JavaEE架构分层如图3.1所示。图3.1 Java EE架构分层由于平台层处于最底层,作为JavaEE架构的运行环境,在这里我们不需要太多关注,在传统的开发过程中,开发人员关系最密切的往往是持久层、业务层、表现层。对于每一个项目而言,我们需要开发它的持久层、业务层、表现层,但是在大量的开发实践过程中,我们会发现,持久层所做的事情都是比较类似的,无外乎对实体关系进行映射,完成对数据库的操作,常见的持久层我们通常会使用JPA、Hibernate或者是iBatis。由于在不同的项目中,持久层总是非常相似的,开发人员需要定义各种实体,然后添加需要的数据表对应的字段,为这些字段添加相对应的get/set方法,而在DAO层,需要实现对各个实体的增删改查操作,一旦数据表的数量增大,给开发人员造成的开发工作量是很大也很繁琐的。分层架构如图3.2所示。图3. 2 分层架构3.1.2 本系统开发需求本系统旨在建立一套基于Java EE企业架构的内容管理系统,通过这样一套系统能够极大的减轻开发人员开发工作量,开发人员不需要关注底层如果实现,只需要按照预定的规范进行开发,同时,系统将提供基于eclipse的模板,极大的减轻开发过程中需要手写代码的工作量。本系统采用了Spring Roo技术,通过AspectJ的编译时织入的强大功能,可以在项目编译时完成很多需要手动完成的操作,以往的持久层开发往往需要定义字段、添加get/set方法、添加DAO层等一系列的步骤,但是使用了SpringRoo之后,开发人员可以通过命令或者是手动的写入文件并加以相关注解的方式实现实体以及相关的get/set方法,对数据的增删改查操作以及复杂的查询操作等。对于表现层来说,常见的开发技术室采用Jsp进行开发,当然也可以使用JSF以及Freemarker等模板技术,在使用Jsp开发过程中,我们往往需要编写大量的html以及javascript代码以实现需要的功能,大量的html以及javascrit充斥着整个web的前端系统,造成开发人员代码维护难度增大,而且,往往大部分开发人员对已页面设计等并不关注,因此,很难做出符合要求以及合适的页面,为了解决这个问题,在本系统的开发过程中,封装了大量的标签,组成一套专注于系统后台开发的标签库,帮助开发人员完成页面的开发,基本事件处理,页面布局,各种控件的增强,文件上传等。业务逻辑层往往是开发人员专注的领域,因此,开发人员可以通过在Service层结合Controller层完成系统开发任务。系统需要提供一套完善的基于角色的访问控制系统(RBAC),以及在系统开发过程中常用的组件:(1)基于角色的访问控制系统实现一套完善的基于角色的访问控制系统,能够对管理用户按照角色进行授权,只有授权用户才能访问相应的模块,提供对角色的增删改查操作,提供对系统权限的控制,用户管理(包含增删改查操作),当然,对一套基于角色的访问控制系统而言,菜单的管理以及自动生成也是至关重要的,通过对菜单的管理,为每个角色可以分配不同的菜单。(2)缓存方案提供一套切实可行的缓存方案,减少缓存操作代码量,以最简化的方式实现缓存,主要提供基于内存和基于磁盘文件的两种缓存实现,后续考虑实现基于memcached的分布式缓存。(3)友情链接管理友情链接在一般网站中都作为基本组件提供,因此,系统很有必要提供一套友情链接管理功能,能够实现对友情链接的排序,分组,以及上传链接图片等操作。(4)公告管理作为一款内容发布系统,公告管理是不可或缺的,因此,系统需要提供一套公告管理系统,能够方便管理人员发布公告,设定公告有效时间等。(5)内容发布管理内容发布作为系统的主要功能,需要完成对文章内容的管理,主要包含内容分类管理,内容发布管理,内容缓存以及内容模型的定制。(6)广告管理实现站点广告的管理,能够对广告进行分类,提供广告图片上传,通过对广告的分类,实现广告位的管理等。(7)消息管理消息管理主要实现站内信的管理,网站用户之间的交流。(8)站点配置站点管理部分主要是完成对站点的基本配置。(9)其它扩展功能提供提供扩展功能,通过扩展,可以为系统提供更多的扩展功能。(10)代码模板提供常用代码的eclipse模板,通过使用基于eclpse的IDE,可以迅速生成代码,只需要做简单的修改即可投入使用。3.1.3 性能需求本系统采用Spring Roo进行持久层以及Service层部分代码开发,由于Spring Roo采用了AspectJ的编译时代码织入功能,因此,在最终的产品代码中,Spring Roo以及AspectJ的切面等代码是不会存在的,在编译过程中,这些代码都被写入了相应的类的二进制字节码文件中,避免了调用额外代码所产生的开销。系统采用独立开发的缓存技术,通过AOP思想以及AspectJ的动态织入功能,完成声明式的缓存方案。缓存技术的采用,使得系统运行过程中对数据库的依赖减小,用少量内存开销换取了数据IO开销,大幅度提高系统的运行效率。3.2 系统整体架构本部分对系统的整体架构进行简要的描述,系统采用Spring Roo技术,在Spring Tool Suite IDE上完成开发。3.2.1 系统架构模式系统基于Spring MVC开发,抛弃了传统开发中复杂的Model-Dao-Service-Web模式,而是在Dao层采用了Activity Record模式,简化了数据持久层的开发。系统架构如图3.3所示。图3.3 系统架构系统主要包含五部分,分别对应着系统五个主要的功能点,主要包括核心部分、扩展部分、直接远程访问部分、公开服务部分、前端站点部分。其中核心部分是系统运行过程中必须的部分,该部分作为系统的基础,支撑着整个系统的运行,扩展部分中,可以通过自定义添加不同的功能对框架功能进行扩展,实现支撑项目业务逻辑的模块。直接远程访问部分允许使用Dwr、Hprose技术或者是其它技术完成直接远程访问,公开服务部分主要提供了常用的一些服务,如验证码、文件上传等独立于系统的服务。前端站点用户向最终用户展现网站内容,属于展现层的范畴。功能模块划分如图3.4所示。图3.4 功能模块划分3.2.2 系统目录结构由于系统是支持二次开发的,因此,很有必要在此描述一下系统的目录结构,在了解了目录结构后,可以方便的对系统进行扩展开发。整个系统的目录结构划分的比较明确,不同目录对应着不同的功能,正是清晰的目录结构划分,才使得系统的模块化变得更加清晰明确。源码包结构如图3.5所示。图3.5 源码包结构系统源码部分目录结构主要分为核心部分、扩展部分、直接远程访问、开放服务、前端站点以及实用工具、助手类部分。(1) 核心部分核心部分包含了整个系统运行过程中必备的一些基本组件,如系统自定义的annotation,控制器/表单基类,数据字典,统一异常处理,主控制器,以及RBAC权限控制系统等该部分是系统的基础组成部分,实现了系统运行所需的核心功能。(2) 扩展部分扩展部分对系统各个模块的功能进行了划分,尽最大程度保证了各个模块之间的独立性,该部分实现了系统需要实现的扩展功能,如公告管理,友情链接管理,内容发布管理等等。如果需要对系统功能进行扩展,可以在该包下建立相应的扩展包,实现自己的业务逻辑以及领域对象。系统的RBAC权限控制系统在权限控制以及菜单管理方面会根据控制器所提供的annotation自动检测到相应的功能实现,只需要在后台进行简单的配置即可使用。(3) 直接远程访问该部分提供了两种直接远程访问的实现,一种是dwr技术,另一种是hprose技术,两种技术在这里都可以直接使用,当然,如果希望使用其他的实现技术的话,可以在这里手动添加。系统后台管理部分在页面展现层和控制层之间的数据交互采用的了dwr技术实现,因此,dwr实现作为系统默认直接远程访问实现是起着举足轻重的作用的。(4) 开放服务该部分一般是对外完全开放的服务,事实上,该部分也是控制器实现,只不过在AOP访问控制方面,并没有对该部分进行限制,因此,对于所有的浏览者来说,该部分是完全开放的,可以注意到,文件上传部分也属于开放服务,这是因为系统当前将上传模块独立,通过对上传资源的限制,以及上传表单令牌机制,对该部分的安全性进行了管理,因此,该部分是安全的。如果需要增加额外的开放服务模块,可以在这里增加,一般情况下,该部分的服务仅仅是提供内容处理的,一般不包含页面渲染。(5) 前端站点该部分用来预留该前端站点开发,为了简化前端开发模式,该部分采用了自定义的CmsDispatcherServlet进行管理,并将Spring上下文注入到前端模块,因此,该部分是一个独立的Spring Web模块实现。同时,该部分主要使用了核心模块中提供的Module和FormModule注解。1) Module该annotation的作用类似于传统javaEE体系中的service层,该注解标注的类将作为前端Service,为前端标签库标签提供数据访问服务。2) FormModule该annotation的作用类似于web层,主要是完成前端标签库标签的表单数据提交处理,提供站点普通用户与系统之间的交互。系统前端建议完全采用系统内置的或者是开发人员自定义的JSP标签开发。(6) 实用工具、助手类实用工具部分提供了系统常用的一些功能类如加解密、Json格式转换、消息构建器等。助手类部分提供了系统的缓存方案以及方便权限和菜单管理的反射工具集。3.3 系统核心模块设计本部分主要对系统中用到的核心模块进行简要的描述。3.3.1 基于AOP的访问权限控制在传统的Java EE应用程序中,采取的访问控制往往是采用过滤器机制实现,通过过滤器拦截进站的web请求,然后再根据用户要访问的web地址进行分析,如果用户拥有对该URL地址的访问权限,则对用户放行,这种实现有一个先天性的缺陷是只能够对web层进行安全控制,无法很好的实现对任意方法的执行进行权限控制,同时,过滤器的使用对系统运行性能也会产生一定的影响。另外一种实现权限控制的方法是将角色权限的检查的相关方法放在Controller类中,导致所有的访问控制代码分散在应用的各个部分,与业务逻辑代码紧紧的耦合在一起,这就导致了程序的可重用性低,调试和维护代码变得十分繁琐,非常不利于软件的开发。针对以上两种情况的弊端,在本系统中,将访问控制模块作为了一个横切关注点通过引入一个Aspect,将用户角色访问控制的相关代码抽取出来,形成一个单独的切面,通过AspectJ的编译器在项目编译时将访问控制代码织入到各个功能模块中,有效的分离了功能模块和访问控制模块,使得系统得以尽可能大的解耦。AOP实现权限控制原理如图3.6所示。图3.6 AOP权限控制原理为了开发过程中的方便,系统实现的权限控制系统支持开发者模式,在开发模式下,系统会对所有的方法访问放行,因此,可以不用处处验证是否有权限进行操作,方便开发调试系统,当然,系统同样支持超级管理员用户,超级管理员用户的账号和密码均采用sha256加密算法混淆加密后存储在配置文件中,用户登录时,系统会判断是否是超级管理员登录,如果是,则所有权限对超级管理员均开发,可以方便在系统上线运行过程中,需要对系统进行相应的权限管理配置等。在权限控制的过程中,通常会有一些方法是我们希望对所有用户开放,任何人都可以直接访问的或者是只允许匿名用户访问(如登录/注册等不希望已登录用户访问),因此,系统提供了公开控制方法和匿名控制方法配置,通过对配置文件简单的配置,可以完成控制器方法甚至是整个控制器的开放。权限控制执行流程如图3.7所示。name.orionis.cms.core.rbac.web.AccountController.loginhelp.index权限控制Aspect采用的是Around Advice对方法执行进行管理,同时,在该Advice中,加入了对控制层异常的处理,因此,控制层中的操作如果出现异常,可以直接抛出甚至是不需要处理,权限控制Aspect会根据方法命名规范采取相应的错误提示信息,如以ajax形式或者是直接以错误页面的形式。系统为权限控制定义了四个Pointcut,通过这三个Pointcut相互约束,完成了对控制器方法的权限控制织入。(1) execution(public * name.orionis.cms.core.*.*(.)(2) execution(public * name.orionis.cms.extensions.*.*(.)(3) annotation(org.springframework.web.bind.annotation.RequestMapping)(4) within(org.springframework.stereotype.Controller *)图3.7 权限控制执行流程上面主要讲述了权限控制的过程,系统不仅使用AOP完成了访问权限的控制,还实现了一套完整的基于角色的访问控制系统(RBAC)与AOP的权限控制相结合,从而更加灵活的对访问权限,用户角色进行管理。RBAC权限控制与AOP结合如图3.8所示。图3.8 RBAC权限控制与AOP相结合在RBAC中,权限与角色相关联,用户通过获取适当的角色而获取该角色的所有权限。这样极大的简化了权限的管理。在这一组织中,角色是为了完成各种工作而创建的,用户依据他们的职责和资格被授予相应的角色,根据用户角色的不同从而在系统中拥有不同的功能。而权限也可以根据角色的不同进行回收。系统通过对Rbac的引入以及实现,灵活的完成了多用户的管理,下面是表结构。RBAC系统表结构关系如图3.9所示。图3.9 RBAC系统表结构关系系统在基本RBAC系统的基础上进行了扩展,增加了对菜单的管理,这样,就实现了不同用户登录系统后的菜单是不同的,增强了系统的可定制性。菜单定制如图3.10所示。图3.10 菜单定制3.3.2 基于Annotation的声明式缓存方案通常,在大型系统以及并发访问量比较大的系统中,为了减少对数据库以及其它I/O资源所造成的耗时操作,减轻系统的压力,对于常用的,不经常发生变化的资源进行缓存,而传统的缓存方案无外乎创建缓存对象,判断是否存在当前对象缓存,如果存在,则返回,否则则缓存新的对象后再返回,对于每一次的缓存操作,这样一个过程必不可少,因此,系统中难免会分散着各种重复的缓存代码,这就造成了开发人员需要不断地复制粘贴相应的缓存代码,在进行一定的修改后使用,但是这样造成了一旦某一天希望换一种缓存实现的时候,程序很难解耦。因此很有必要有一种更加方便,更低侵入性的缓存实现方案。本系统自主实现了一套基于注解的声明式缓存解决方案,与权限控制部分相似,为了提高系统的效率,缓存方案同样采取了AOP机制,使用AspectJ进行编译时织入缓存代码。被缓存方法调用如图3.11所示。图3.11 被缓存方法调用系统实现的缓存方案默认通过方法签名对方法返回值进行缓存,当方法参数不同时,会分别进行不同的缓存。当然也可以手动指定缓存使用的签名或者是缓存主键使用的参数列表。不仅如此,该缓存方案还支持基于缓存时间的缓存,通过在Cached注解上增加缓存有效期,可以实现缓存过期等。系统默认提供了两种缓存方式:(1) 基于内存的缓存实现。(2) 基于文件系统的缓存方式实现。如果这两种方式仍然不能满足开发者的需求,开发者可以实现自己的缓存方案,比如如果开发者需要使用memcached分布式key-value缓存方案,可以自定义缓存类,该类只需要实现ICache接口,同时在Spring配置文件中或者是通过Component注解标注为Spring管理的bean即可。public interface ICache public void put(String key , Object value);public void put(String key, Object value, long expiration);public Object get(String key);public boolean isExist(String key);public void remove(String key, boolean lazy);public void setDevMode(boolean devMode);public boolean isSupportExpiration();图3.12是缓存方法的执行过程图解:图3.12 缓存方法执行过程3.2.3 扩展开发扩展系统功能是相当简单的,一般情况下,对于比较简单的功能,可以快速的生成,这里,以公告发布管理为例,简述一下开发过程。首先需要创建公告数据表,假设公告数据表是如下结构:表3.1 Announce表结构字段名类型约束注释IdLong主键,自增主键VersionIntHibernate用于做乐观锁Titlevarchar公告标题Contentlongtext公告内容Create_dateDatetime创建时间Publish_timeDatetime发布时间PublisherVarchar发布者UpdatorVarchar更新者Start_timeDatetime生效时间End_timeDatetime截止时间HitsInt点击量(1) 创建数据表实体创建数据表实体,在Activity Record 模式下,也就相当于DAO层的创建,在Spring Roo环境下,我们可以简单执行下面几条命令完成实体创建。entity jpa -class .extensions.announce.model.Announcefield string -fieldName title -sizeMin 1 -sizeMax 50 -notNullfield string -fieldName content -sizeMin 0 -sizeMax 1000 field date -fieldName createDate -type java.util.Datefield date -fieldName publishTime -type java.util.Date field string -fieldName publisher -sizeMax 30 field date -fieldName startTime -type java.util.Date -dateTimeFormatPattern field number -fieldName hits -type int -value 0(2) 创建实体对应的表单创建表单类的目的是用于接收通过页面提交的表单数据,Spring会将表单项映射到表单实体的属性上,可以通过annotation的方式方便的完成表单验证以及格式转换。public class AnnounceForm extends Form NotNull Size(min = 1,max=50, message=The title must not be null!) private String title; Size(min = 0, max = 1000, message=Content length must not more than 1000.) private String content; Temporal(TemporalType.TIMESTAMP) DateTimeFormat(pattern = yyyy-MM-dd HH:mm:ss) private Date publishTime; Temporal(TemporalType.TIMESTAMP) DateTimeFormat(pattern = yyyy-MM-dd HH:mm:ss) private Date startTime; Temporal(TemporalType.TIMESTAMP) DateTimeFormat(pattern = yyyy-MM-dd HH:mm:ss) private Date endTime; Override public boolean validate() if(endTime.before(startTime) errorMessages = The end time must after start time!; return false; return true; Overridepublic Announce toEntity() Announce ann = new Announce();ann.setTitle(title);ann.setContent(content);ann.setCreateDate(new Date();ann.setStartTime(startTime);ann.setEndTime(endTime);ann.setPublishTime(publishTime);return ann;.(get/set方法省略)需要注意的是,表单实体需要继承Form类以获取表单额外验证以及转换为数据实体的能力,Form类是一个泛型类,内部包含两个方法,validate和toEntitiy方法,分别用来添加额外的表单验证逻辑和将表单转换为数据实体。在最简单的情况下,也就是这里,我们只需要实现toEntity方法,转换表单对象为实体即可。(3) 创建service创建Service层是相当简单的,只需要简单的执行一条命令就可以完成service层的创建,service会自动的实现所有的对数据实体的增删改查操作。service -interface .extensions.announce.service.AnnounceService -entity .extensions.announce.model.Announce(4) 创建控制器对于控制
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕业论文


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!