BBS论坛的设计.docx
《BBS论坛的设计.docx》由会员分享,可在线阅读,更多相关《BBS论坛的设计.docx(55页珍藏版)》请在冰豆网上搜索。
BBS论坛的设计
BBS论坛详细设计说明书
第一章引言
1.1编写目的
本文档作为BBS的详细设计说明文档,用于与用户确定最终的目标,并成为协议文本的一部分,同时也是本系统设计人员的基础文档。
1.1.1详细设计说明书目的
本详细设计说明书说明了BBS论坛系统设计中的各个组件和类的详细设计和技术实现。
1.1.2预期读者
本系统开发人员及维护人员。
1.2背景
BBS论坛,或者称为社区,是电子商务网站中一种常见功能,也是互联网上一种极为常见的互动交流服务。
它为上网用户提供了也各自由的讨论区。
通过论坛可以向用户提供开放性的分类专题讨论区服务,同时注册的用户可以根据需要在论坛上发表文章,交流技术经验,或者提出问题并表达自己的观点。
不仅如此,上网的用户还可以在论坛中看到他人发表的文章,并且能够对该文章进行评论。
一般情况下,BBS按不同主题分为多个布告栏,其设立多是依据使用者的要求和喜好,但多具有信件交流、软件交流、信息发布等功能。
目前,大部分BBS由教育机构、研究机构或商业机构管理,大多有自己的拨入电话号码,用户只需电脑、调制解调器和电话线就可通过电话拨号登录BBS站点。
1.2.1待开发软件系统的名称
BBS论坛系统
1.2.2项目的任务提出者
1.2.3项目的任务开发者
1.3定义
1.3.1本文档中涉及的专业词汇
1、GB:
中华人民共和国国家标准的英文缩写字母
2、构件:
具有某种功能的可重用的软件模版单元,表示了系统中主要的计算元素和数据存储。
3、逻辑视图:
描述支持系统的功能需求的视图。
4、开发视图:
也称模块视图,主要侧重于软件模块的组织和管理描述。
1.3.2名词说明
1、BBS:
BulletinBoardService
2、JSP(JavaServerPages)
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。
网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。
JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易
3、Struts只是一个MVC框架(Framework)
它用于快速开发JavaWeb应用。
Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签(CustomTag)。
但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。
1.4参考资料
1、本软件项目规划依据标准为国家表准:
GB856T——88;
2、技术参考资料
(1)J2EE项目实训Hibernate框架技术(21世纪高等学校实用软件工程教育规划教材)
杨少波 等编著清华大学出版社2008年5月
(2)J2EE项目实训Spring框架技术(21世纪高等学校实用软件工程教育规划教材)
杨少波 等编著清华大学出版社2008年5月
(3)J2EE项目实训UML及设计模式(21世纪高等学校实用软件工程教育规划教材)
杨少波 等编著清华大学出版社2008年5月
(4)J2EE项目实训Struts框架技术(21世纪高等学校实用软件工程教育规划教材)
杨少波 等编著清华大学出版社2008年10月
第二章系统结构设计
2.1MVC中各层组件设计
2.1.1MVC中的视图层的设计
1、一个典型的Web应用的前端应该是表示层
表示层由UI(UserInterface)和UI控制逻辑组成。
(1)UI(UserInterface)
UI是客户端的用户界面,负责从用户方接收命令,请求,数据,传递给业务层处理,然后将结果呈现出来。
(2)UI控制逻辑
UI控制逻辑负责处理UI和业务层之间的数据交互,UI之间状态流程的控制,同时负责简单的数据验证和格式化等功能。
由于在本项目中的表示层使用Struts框架,下面为Struts所负责的主要功能:
●管理用户的请求,做出相应的响应
●提供一个流程控制器,委派调用业务逻辑和其他上层处理
●处理异常
●为显示提供一个数据模型
●用户界面的验证
以下内容,不该在Struts表示层中出现,因为它们应该是与表示层无关的。
●与数据库直接通信
●与应用程序相关联的业务逻辑及校验
●事务处理
因为,如果我们在表示层引入这些功能的实现代码,将会给系统带来高耦合和难以维护的后果。
(3)本系统的表示层拟采用的技术
●HTML:
实现前台页面的组织编写。
●Javascript:
利用此脚本语言,实现前台表单的简单验证。
●CSS:
利用此技术来确定页面布局,达到前台页面的美化效果。
●JSP:
利用jsp脚本与后台进行交互,以实现页面的动态化。
●Struts:
利用struts标签技术以实现表示层和业务层的分离。
●Ajax:
此技术是近年来流行的基于Web2.0思想的客户端技术,旨在提高页面友好性的异步刷新技术。
本项目中对Ajax技术的使用主要是在用户注册、登录、密码找回等前后台交互型页面以及拥有多级列表联动的页面。
●Frameset:
本系统后台拟采用此技术实现后台页面风格的一致性。
整体设计为上左右结构,如图所示:
2、基于Struts的JSP页面所产生的表示层
(1)如何实现表示和业务的分离---利用标签技术
尽管在Struts的JSP页面中还是可以继续使用Java脚本的,但是,标准的做法是尽可能的使用标签和JavaBean,只有这样一来,才能够把业务逻辑和页面表示彻底分开,提高了系统设计的规范性和代码的可重用性,为后期升级提供方便。
(2)在本项目中所涉及的标签
一方面即可以使用Struts中所提供的各个标签库的标签,同时页根据项目的实际需要定制了自己的标签库的标签。
本项目中的表示层中的部分组件类的类图以及它们之间的关系的图示请见下面
(3)ViewHelp组件(JavaBean)
将某些数据格式化或者数据转换的功能也可以设计为JavaBean组件。
3、客户端的JavaScript脚本的应用
(1)应用JavaScript时的要点
在Struts的应用中,一般是不再鼓励使用客户端的校验技术,而改用服务器端的校验技术以提高项目的安全性和更好的兼容性。
(2)JavaScript在本项目中的应用之一
为了能够在客户端对用户的表单进行及时地检查和实现更友好的人机交互,在某些页面中仍然使用客户端的JavaScript脚本技术----主要承担实时交互和实现动画效果。
(3)JavaScript在本项目中的应用之二
承担实现AJAX技术的编程语言。
4、复合视图模式
(1)复合视图(CompositeView)设计模式
它定义了各种能够以有效地把一个用户的接口划分成多个子视图的规则,并且可以被重新结合起来以生成需要的总体视图。
在本项目中主要利用下面的两种形式来实现复合视图。
(2)其一是“MacromediaDreamweaverMX2004”中所提供的静态模块页面
(3)另一种则是采用Tiles标签库所实现的动态布局页面
Tiles强大的模版功能能够使页面获得最大的重用性和灵活性
(4)HTML中的FrameSet技术
5、本项目中的各种ActionForm类的编程
(1)标准的ActionForm类
有了ActionForm类,网页的表单和后台的Action之间就搭建了一个几乎无缝的平台,所以这个模块是非常必要的,ActionForm类是实现封装网页中的Form控件,是采用面向对象的方式来操作Form表单。
本项目中对各种表示层的页面中的各个表单进行数据封装,设计出各种对应的ActionForm类。
(2)DynaActionForm技术在本项目中的应用
通过利用DynaActionForm类可以不必创建一个个具体的ActionForm类的代码,而只需要在Struts的系统的配置文件struts-config.xml种进行ActionForm组件种的各个属性的配置定义,从而达到减少了ActionForm类的数目的目的。
6、AJAX技术及DWR框架在本项目中的应用
(1)应用的目的
为了提供本项目的表示层组件的可操作性,计划将在本项目的一些功能模块中应用AJAX技术。
(2)应用DWR框架
为了简化AJAX技术的具体开发过程,本项目以DWR框架作为开发的首选平台。
(3)主要的应用模块
●用户登录模块中的用户名称的实时检查
●用户注册时的用户名称是否重用的实时检查
●在各种查询方式中的表单数据之间的相互关联
●首页中的在线用户信息的实时显示
7、关于表单中的重复提交的问题的解决
利用struts的同步令牌机制(token)解决Web应用中重复提交的问题。
在本项目中主要是针对BBS发表的表单进行限制(而对于用户注册表单可以不需要加以限制,因为当用户注册页面回退时,表单中的所输入的密码回自动地被清空,从而也就限制了重复提交的可能性)。
8、页面中的动态内容的缓存
缓存(Cache)机制是提高系统运行性能必不可少的技术。
缓存机制从原理上讲比较简单,就是在原始数据第一次读取后保存在内存中,下次读取时,就直接从内存中读取。
缓存机制也是代理模式的一种实现。
是否有缓冲机制(Cache)是衡量一个J2EE产品是否成熟的重要标志。
因为缓冲对于J2EE系统的运行性能有至关重要的作用,特别是在大量用户并行访问时,没有缓冲机制几乎是不可想象的事情。
(1)应用开放源代码项目OSCache来改善系统运行性能
在J2EE系统中,我们经常需要处理一些特殊的动态内容,这些内容在一个时间段内的变更非常有限,但是又不得不将他们确定为动态内容进行输出,并且这些内容非常消耗数据库系统资源或者web服务器的资源,这时我们就可以采用Cache----一种用于提高系统响应速度、改善系统运行性能的技术----来优化我们的系统。
尤其是在Web应用中,这种处理可以很显著的改善系统运行性能。
开放源代码项目OSCache提供了在J2EE系统中实现缓存需要的丰富的功能。
通过应用OSCache,我们不但可以实现通常的Cache功能、自由的设定cache的相关特性比如缓存时间段/缓存内容等,提升系统性能,而且还能有效的改善系统的稳定性。
(2)对本项目中某些页面内容应用OSCache框架
9、Web系统安全性的考虑
在网络经济迅速发展的今天,安全性是目前系统主要考虑的性能之一。
就本系统而言在表示层拟采用如下技术增强系统的安全性。
(1)本系统中的基本的安全性从以下几个方面加以实现
●登陆验证码
利用一个后台服务器端的功能组件实现随机产生一个验证码,由于验证码是机器随机产生的,因此暴力破解程序无法预料到具体是什么,所以可以防止暴力破解。
●登陆身份验证
系统的每个功能都必须经过身份验证后才能访问,没有认证的请求会被过滤掉,这是最基本的安全要求。
●所有功能都通过Struts的Action来进行访问,不直接以jsp的形式向用户提供功能访问
这样一方面可以防止向用户暴露程序的资源名称,另一方面也可更方便的进行权限控制。
●对用户的请求进行与其身份相匹配的识别
(2)本系统对数据合法性的检查分为多级
在页面使用javascript脚本语言进行简单合法性检查,在ActionForm中对数据进行进一步检查,在业务处理层会对数据做最后的检查。
(3)对Struts的ActionServlet设置Filter
利用该Filter来检查用户的权限,这样既可以防止用户登陆后跨url访问。
在本项目中添加一个WebBBSFilter组件来监控后台管理的URL。
(4)防止扰过权限认证的直接资源访问
虽然前面的设计中,已经要求所有的功能都通过struts的Action来进行访问,但是还是不能排除恶意用户可能会知道程序资源名称(jsp文件),如果这类用户直接输入jsp文件的url访问,有可能会对系统形成威胁。
因此需要禁止所有用户发起的直接资源访问。
通常以这种方式来实现:
在Web应用中创建一个从不使用的角色:
NeverUsedRole,将所有的jsp资源文件配置为必须具有NeverUserRole才能访问。
由于根本没有任何用户可以成为该角色。
由于根本没有任何用户可以成为该角色,所以也就无法对该角色对应的资源直接访问。
*.jspprotectedResource
/*.jsp
neverUsedRole
BASIC
Default
thisisnotExistUser
neverUsedRole
注意:
也可以采用用WEB-INF下的一个目录来存放各个JSP文件,以避免被客户端直接访问。
(5)本系统对后台管理员划分角色
系统管理员、频道管理员、栏目管理员。
每个角色各有其权限。
如系统管理员具有频道管理、广告管理、用户管理权限;频道管理员具有栏目管理、公告管理、评论管理权限,同时频道管理员只具有本频道下的栏目、公告、评论的增删改查权限,不能对其他频道下的栏目、公告、评论进行访问;栏目管理员具有栏目内容,即新闻管理的权限,不能对其他栏目下的内容进行访问。
本系统权限控制采用如下方法实现:
设计方法:
权限字符串分三段,第一段标识用户的身份:
1为系统管理员;2为频道管理员;3为栏目管理员。
第二段标识频道ID。
第三段标识栏目ID。
各段之间用@隔开。
判断方法:
截取登录用户权限字符串第一个字符,如果为1,进入系统管理员页面;如果为2,截取第二字段保存,进入频道管理员页面;如果为3,截取第二字段保存,近一步截取第三字段保存,进入栏目管理页面。
10、各个模块的页面版式和内容布局的设计要求(下面给出主页设置形象图-----仅供参考)
2.1.2MVC中的控制层的设计
1、Struts中的控制层的架构
控制层是整个系统的核心,它是一个状态与流程的管理器。
来自UI所有的命令与数据经过控制层分发给业务层或其他UI,这样我们可以把流程、权限等逻辑单独封装。
这样将能够达到最大化的业务重用。
本系统的控制层采用Struts框架的控制器,分为前端控制器ActionServlet和后端控制器Action。
其中前端控制器旨在统一程序的执行点,同时使用扩展的ActionServlet类对中文编码问题进行处理。
后台控制器各Action类旨在分离业务模块的调度和业务模块的实现,使其更多的用于组织调度特定的业务模块同时转发处理的结果。
(1)Struts中的控制层的架构说明
在Struts中一般采用两个控制器----前端控制器ActionServlet和各个业务模块的后端控制器Action类(一个ActionServlet和多个Action)。
(2)采用这样的系统架构的主要目的是
●一方面借助前端控制器ActionServlet来统一Web应用的请求的启始点,同时也可以在ActionServlet中完成一些请求的前期预处理,使业务控制器侧重于业务功能的调度。
●另一方面,对每个功能模块则允许提供各个模块的控制器组件----Action。
(3)前端控制器和后端控制器之间的关联实现
两个控制器之间以struts-config.xml实现松藕合的关联---其实,Struts的控制层的这种架构是J2EE中的截取过滤器设计模式和基于Servlet的业务请求控制器设计模式的具体应用。
2、Struts中的前端控制器ActionServlet组件
(1)主要的作用
统一程序的执行点并隐藏Web访问进入点固有的“混乱”----用户可能会用不同的URL进入,帮助开发者建立起清晰和明确的秩序和规则。
(2)本项目中采用扩展ActionServlet类
●目的:
实现普通的Web应用中的前端过滤器Filter的作用
尽管一般情况下ActionServlet本身是不需要重新设计的,但在需要对中文进行编码处理等的时候,所以这里需要重新设计ActionServlet,主要是用以统一处理请求的编码方式问题。
●自定义我们自己的BBSActionServlet类组件----实现我们系统的一些功能的要求。
(3)通过扩展ActionServlet类来实现下面的各种功能
●用户发帖中的中文问题
●实现对系统配置XML解析组件的调用
3、各种后端业务控制器Action类
(1)Action类的主要作用
为了能够按照业务功能来划分业务模块和关联业务模块/表示层,在本项目中设计出各种后端业务控制器Action类。
(2)分离业务模块的调度和业务模块的功能实现
尽管Action类本身是可以处理业务功能的实现,但正规的做法是把Action类作为一个业务逻辑的控制器来使用,也就是对Action类的应用-----更多地的是用于组织、调用特定的业务模块和转发业务处理后的结果。
(3)DispatchAction类的具体应用
在实际开发中,为了减少项目中的Action类的个数,可以应用DispatchAction类技术。
在本项目的某些功能模块中应用了DispatchAction类。
(4)编程实现线程安全的Action类
●单实例多线程
控制器Servlet(ActionServlet)仅仅创建一个Action类的实例,并用于所有的请求。
这样需要编写Action类使其能够在一个多线程环境中正确运行,就象你必须安全地编写一个servlet的service()方法一样。
●如何实现Action类的线程安全
帮助线程安全编程的最重要的原则就是在我们的Action类中仅仅使用局部变量而不是实例变量(类中的成员变量)。
因为局部变量的创建于一个分配给(由JVM)每个请求线程的栈中,所以没有必要担心会共享它们。
4、命令设计模式在本项目中的应用
(1)命令设计模式
在本项目中的各个Action类中为了更好地对业务模型组件进行调度,采用命令设计模式。
通过Command设计模式实现把命令的请求和命令的执行相互分离,对命令的请求者以统一的形式进行命令请求(功能调用)。
(2)注意
在Struts中的ActionServlet和各个业务Action之间就是Command模式的应用。
具体的程序代码:
请见对应的各个程序
●命令的请求者某个Action类---
●命令的调度者(司令官)---
●命令的执行者(士兵)----
(3)将命令模式应用到本项目的控制层Action类的编程中
在本项目中的某些Action类由于要完成大量的请求调度(如ShowSomeInfoAction类),因此对这些类应用命令模式来解藕命令的请求者和命令的执行者。
(4)进一步利用SpringIoC来解藕命令的请求者和命令的调度者
在一般的命令模式的实现中,命令的请求者和命令的调度者是紧藕合的,而在本项目中应用了Spring的IoC,从而还能够实现将命令的请求者和命令的调度者做进一步的解藕。
5、利用Log4J实现系统的访问日志
6、应用SpringIoC来管理各个对象
由于本项目的系统架构采用的是Struts+Spring+Hibernate,因此对于控制层和业务处理层之间的关联可以通过SpringIoC来管理各个对象。
2.1.3MVC中的模型层设计----业务处理组件
1、业务层所主要负责的功能
业务层封装了实际业务逻辑,包含数据验证,事物处理,权限处理等业务相关操作,是整个应用系统的核心。
我们将业务层具体分为业务数据与业务操作(业务的功能实现)两部分。
业务层所主要负责的功能如下:
(1)处理应用程序的业务逻辑和业务校验
(2)管理事务
(3)提供与其他层相互作用的接口
(4)管理业务层级别的对象的依赖
(5)在表示层和持久层之间增加了一个灵活的机制,使得他们不直接联系在一起
(6)通过揭示从表示层到业务层之间的上下文(Context)来得到业务逻辑(businessservices)
(7)管理程序的执行(从业务层到持久层)
从编码的视角来看,这层是最容易被忽视的。
我们往往在用户界面层或持久层周围看到这些业务处理的代码,这其实是不正确的。
因为它会造成程序代码的高耦合,这样一来,随着时间推移,这些代码将很难维护。
2、各个业务模块的业务组件的实现
(1)业务操作模块的主要功能
业务操作负责对业务数据进行各种业务相关的处理,例如验证,流向,整合,事物,权限等,但它不负责有关对数据源的操作。
(2)本项目中的主要的业务功能JavaBean组件
在本项目中根据业务应用的类型的不同,采用不同的业务模块的JavaBean组件-----UserManagerBean实现用户管理,而用BBSInfoManagerBean实现信息管理。
(3)“面向接口”编程
由于在本项目中的各个业务功能组件和数据访问组件为了能够达到松散关联,采用了Spring中的IoC来进行管理。
因此,各个业务功能组件都遵守“面向接口”编程的原则,从而提供上面的两个接口------两个接口中的方法定义。
(4)业务功能JavaBean组件与业务实体组件的关系设计
●分离业务数据与业务操作
将业务数据单独封装到只有数据get,set的业务实体组件类中,这个业务实体组件类也可以充当DTO。
●整合业务数据与业务操作,将业务数据与相关的业务操作封装在一起称为业务实体
此业务实体作为统一的业务层为表示层提供服务,同时也负责作为DTO在各个层次间传输。
(5)利用Spring框架技术来分离业务功能JavaBean组件之间的依赖关系
各个业务模块之间的依赖,有时候会是难以解决的问题,尤其是一些可以重复利用的业务组件,例如权限管理,邮件发送等等。
管理好这些各种不同的业务组件是我们的目标,IoC容器为我们提供了最完美的方案,通过它将不同的模块注入到系统中,我们可以在不知道这个组件存在的情况下调用它。
3、业务实体组件(VO)
(1)业务实体组件
业务数据又是业务逻辑的核心,最终业务数据将以一种固定的格式表现于内存中。
我们可以将它在系统的各个层次间传输,从而充当DTO角色。
(2)表达业务数据的方式一般分为两种:
TableModel和DomainModel
综合各种因素考虑,虽然业务简单对应直接的系统我们以TableModel建模开发效率很高但难免保证系统日后不会变的复杂,因此出于复用性,扩展性,性能等方面选