MVC模式作为现在软件行业最为流行的一种设计模式,一旦和Java相结合,所产生的作用是无庸质疑的。面向对象的概念结合结构清晰的模型-视图-控制器三层结构,使得软件设计人员的思想得到进一步的解放,MVC模式的一个更大的优点在于清晰的结构能使得软件开发完成之后的维护和拓展变的更加轻松。MVC的优点表现在以下几个方面:(1)可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。(2)视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。(3)模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。(4)潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
本文介绍了基于Java的MVC模式的网上日志备忘系统的设计与实现,主要包括系统需求分析和系统的功能设计、数据库设计以及主要的Java类的设计和相关的XML文件的配置。本系统主要基于Java和MVC模式,采用struts框架实现主要功能模块的设计,采用Mysql数据库实现数据结构设计。重点阐述了用户登录模块、用户日志管理模块和后台管理模块的设计。
2 基础知识 2.1 JAVA程序语言
Java是一种简单的、面向对象的、分布式的、可解释的、键壮的、安全的、结构中立的、可移植的、性能优异的、多线程的、动态的语言。Java的开发环境有不同的版本,如sun公司的Java Developers Kit,简称 JDK。后来微软公司推出了支持Java规范的Microsoft Visual J++ Java开发环境,简称 VJ++。现在流行的开发平台有Eclipse和JBuilder等。主要具有平台无关性、安全性、面向对象、分布式、健壮性等特点[1][2]。
2.2 MVC设计模式
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet[3]。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。
模型(Model):就是业务流程、状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。
业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。
控制层(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。
2.3 JSP(JAVA SERVER PAGE)
基于文本的WEB组件,在HTML代码中嵌入JAVA代码来实现动态内容的输出的一项技术。
1)利于将创建内容和表示内容的代码分离开来;
2)标签技术更容易使人理解和使用,组件重用;
3)动态内容与静态内容的分离;
4)本质上还是servlet,在服务器端被转换成servlet;
5)适合多层WEB应用开发体系结构 。
2.4 Struts框架
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架[4]。
Struts有如下的主要功能:包含一个controller servlet,能将用户的请求发送到相应的Action对象[5]。JSP tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息[6]。
Struts优点:
1)集中式的、基于XML的配置方式,避免了Java硬编码;
2)提供了Form bean的方式封装用户请求的参数,使其在请求阶段方便使用;
3)自定义了很多有用的标签,如Bean tags可以方便操作Bean中的内容;HTML tags 可以让你轻松初始化表单域等内容;
4)增加了表单验证功能。
3 系统设计 3.1需求分析
本系统的用户可分为管理员,注册用户和普通用户(即未注册用户)三类。考虑到系统的安全性,本系统共分成两个界面:一个界面用于注册登录,主要进行基本资料的修改、日志分类和日志内容的管理以及查询等,进入方式为主页默认显示;另外一个界面用于后台管理员登录,主要负责审核用户权限、系统新闻维护、公告维护等。
从总体上看,系统主要需要实现了下列功能:
对管理员来说,包括用户管理、新闻维护、公告维护。
l 用户管理:管理员可以通过进入用户管理模块对用户进行相关的操作。首先从查询页面输入查询条件,结果在查询模块下方分页显示,管理员可以在查询结果中对用户进行相关操作。主要包括用户信息的浏览,注册用户的权限的审批和停用,用户的删除。
l 新闻维护:管理员可以对前台首页的本站新闻进行维护,包括新闻的添加,修改和删除。
l 公告维护:管理员对首页公告进行更新。
对用户来说,包括用户注册、用户登陆、浏览新闻和共享文章,以及登陆后日志分类维护,日志内容维护等。
l 用户注册:非注册用户要取得系统的使用权必须先进行用户注册。用户通过进入注册对自己的基本信息进行填写,提交后经过管理员审核完成,正式获得系统的使用权。
l 用户登陆:注册完成并且经过审核的用户须登陆后才能进入日志维护页面。该模块实现了用户的登陆和错误验证。
l 浏览新闻和共享文章:普通用户(包括注册和非注册用户)进入首页都能对新闻和注册用户发布的公开权限的文章进行浏览,通过点击标题能够查看详细内容。
l 日志分类维护:此模块主要对日志分类进行维护。如果是第一次进入系统,写日志之前必须先添加日志分类。本模块主要实现了分类的即时添加和删除。
l 日志内容维护:注册用户登陆后在日志维护主页面点击分类,页面显示出此分类下的所有日志,在日志标题右边能对发布日志进行删除和修改,点击日志标题能浏览日志全文,在日志显示模块上方点击发布日志,进入日志发布页面。
需求分析用例图如图 3-1。
图3-1 需求分析用例图
3.2 功能划分 3.2.1 前台功能模块划分
图3-3后台功能模块图3.2.2 后台功能模块划分
3.3 数据库设计 3.3.1 数据库需求分析
根据系统的需求,主要数据项和数据结构如下。
l 管理员信息,包括的数据项有:用户名、口令等。
l 用户信息,包括的数据项有:用户名、密码、真实姓名、性别、联系方式、E-mail地址、电话、用户简介等。
l 日志信息,包括的数据项有:日志编号、标题、内容、发布时间、更新时间、发布人、所属分类等。
l 日志类别信息,包括的数据项有:类别编号、类别名、创建用户名。
l 新闻信息,包括的数据项有:新闻编号、标题、内容、更新时间、转载地址等。
l 公告信息,包括的数据项有:公告编号、标题、内容、更新时间等。
为了从多方面来保障用户个人信息和日志信息的安全性、可信性,本系统还应该建立一套机制,这套机制至少应该包括用户和后台管理的账号的安全机制、后台数据库的安全机制、用户使用过程的控制和验证机制。
3.3.2 数据库物理设计
本系统数据库主要使用POWERDESIGNER进行逻辑设计和物理设计。该软件能很直观将实体之间的关系清晰的表述出来。数据库的物理设计如图 3-4。
图3-4 数据库的物理设计
3.3.3 数据库逻辑设计
由于本系统是为网上日志备忘系统而设计的,因此数据库名称定为diary。根据需求分析设计了如下图所示的数据库结构图3-5。具体的用户数据表详细信息见附录一。
图3-5 数据库结构
3.4 系统结构
因为本系统的实现主要是基于Java的MVC设计模式,所以整个软件在架构被分成了三部分,也就是MVC中的三个表现层:模型层,控制层和视图层。下面分别就这三个表现层对系统结构进行说明。
首先是视图层。视图层简单的理解就是用户的操作界面和程序在处理完用户提交的请求之后返回给用户的结果显示界面。本系统的视图层主要是用JSP页面来实现的。JSP是JAVA的一个网络应用组件,它通过动态JSP代码和HTML语句的相互嵌套,经服务器编译之后在浏览器上显示处理结果[7][8]。本系统的JSP页面可分为两类:完整的JSP页面和功能单一的JSP代码段。完整的JSP页面基本上规划好了整个页面的显示格局,具有独立显示结果的功能;而功能单一的JSP代码段是为了保证代码的清晰性和可重用性而独立出来的只具有单一功能的代码段,它不能被独立显示出来,而只能通过在完整的JSP页面中使用JSP动作语句INCLUDE使之成为JSP页面的一个功能块[9]。本系统的JSP页面都放在webcontent文件夹下, 并且根据各自功能而命名,如日记修改JSP文件叫editDiary.jsp、分类编辑JSP文件叫editKind.jsp。
其次是控制层。由于主要使用Struts框架来实现MVC模式的设计,控制层主要是在webcontent下WEB-INF文件夹中的web.xml和struts-config.xml(见附录)来实现整个系统的逻辑跳转(具体内容见附录)。当然在这之前必须把struts的外部jar包放到web-inf下的lib文件夹中,这样在写java类时直接继承struts的相关类便可实现商业逻辑了。
再次是模型层。一个好的项目必然有一个好的软件结构,在建立JAVA类之前,根据项目不同的功能先建立各自的类包很关键,这样能使在开发的时候不会因为找不到相关的类而晕头转向[10]。本系统一共建立了6个包,分别是my.bean,my.dao,my.action,my.form,my.util,my.base。下面分别对各个包里面类的作用进行简单的介绍。
My.bean:主要是存放Javabean类,主要包括和数据库中数据表的字段相对应的属性和赋值取值方法。为数据操作对象对数据进行操作时提供盛放数据的容器。
My.dao:数据操作对象包。没个类中都对应相关数据表的所有数据增删查改操作方法。
My.action:严格来说这个包里的类应该属于控制层。和struts-config.xml文件联合作用。该包的类全部继承自struts包中的Action类。通过复写execute()方法来实现业务逻辑。
My.form:表单类,所有从页面提交的表单,通过struts-config.xml文件关联后都能和此包中的类进行自动匹配。本包中类的结果类似于bean,只不过所有属性都是和表单中的参数名对应的。在创建相应的赋值取值方法之外,如果表单需要验证的话,必须复写父类的validate()方法实现表单的验证。
My.util:实用工具类。辅助类包,主要放一些重复使用次数较多的类文件。如数据库连接类Conn。
My.base:基本类。里面存放和struts验证机制和国际化相关联的properties文件和用来解决页面显示乱码问题的过滤器CharacterEncodingFilter类文件。(struts-config.xml和web.xml文件见附录三)
系统需要的Mysql数据库驱动类和struts外部包放在WebContent目录下的WEB-INF中的lib文件夹下。
源程序的文件结构视图如图3-6。
图3-6 源程序的文件结构视图
4 主要功能模块概述
4.1 用户注册模块 4.1.1 流程分析
如果用户要使用为系统提供的日志功能,那么在使用之前必须先注册。注册方式很简单在首页登陆模块内点击进入注册页面。页面中的用户信息用户名和密码为必填项。若此两项信息未正确填写将返回到注册页面并且显示错误信息。执行入库操作之前先查询用户名是否已经存在,若已存在则返回注册页面显示错误提示。为保障系统的安全性,用户在注册成功之后,需等待管理员审批。在审批通过之后方能成为正式用户,使用该系统相关功能。用户注册过程活动图如图4-1。
图4-1 用户注册过程