赞
踩
一、 绪论
(一)、引言
在校园、机关或企业里,由于各种调查研究的需要,经常会有各种各样的调查问卷,在传统模式下,人们不但要花费不少的费用印刷问卷,而且还要消耗大量时间和精力发放问卷,回收问卷,统计问卷,并且问卷可控性差,容易产生漏卷,废卷等问题。现代信息技术的发展,极大程度上提高了我们生产的效率,当然也为我们解决问卷调查的难题提供了良好的解决方案,其中J2EE解决方案就是一个在绝大多数方面都占据优势的方案,也是本文讨论的主题。
(二)、项目介绍
本项目旨在建立一个基于J2EE的WEB应用系统,提供问卷创建,问卷编辑,问卷发布,问卷统计,题目添加删除修改,友情连接管理等功能;题目支持单选题、多选题、带文本输入的单选题、带文本输入的多选题、问答题;用户可以给某问卷添加图片;用户可以给问卷设置密码,IP限制,包括黑名单和白名单,用户也可以设置同一IP是否可以重复提交等防作弊选项;系统提供对客观题调查结果的智能统计,并用图表展示出来;针对每一张问卷的每一个题目的任易选项,用户也可以设置截断,终止调查,也可以设置跳转,即被调查者点击了某个选项后自动跳转到与该选项匹配的后续题目上。
(一)、J2EE概述
随着Internet计算的迅速发展,作为一门新兴的语言,Java以其完全面向对象的设计风格和良好的平台无关性,已经超越了语言本身的功能,成为了开发Web应用的理想平台。Java平台包括了一种用于实现Java对象的语言和这些Java对象的运行环境——Java虚拟机JVM(Java Virtual Machine)。Java语言的主要特点是平台无关性:在一个操作系统下开发的Java对象可以不做修改的运行在另外一个操作系统的JVM上。JVM封装了各种底层操作系统在体系结构和语义上的差异,在此基础上为Java对象提供了一个统一的运行环境。Java对象的源代码被编译为平台无关的中性代码——字节码。在运行时刻,字节码由JVM进行解释,被映射为真正的相关的操作系统调用而得以执行功能。因此,只要是100%纯Java语言实现的对象可以被各种具有相应JVM的操作系统所支持。
Sun公司的J2EE构架是在1997年的Java One大会上宣布的,J2EE定义了开发和运行企业级Web应用的标准。它是一组规范,旨在为支持Java语言服务器端部署而提供平台无关的、可移植的、多用户的、安全的和标准的企业级平台。伴随J2EE的出现,Java语言的功能和工具得到了极大的扩充、丰富和发展,可以用于复杂的、多层次的以及分布式的电子商务和企业级应用。J2EE构架与技术为组件开发模型提供广泛的支持,同时也提供一组开发工具和服务,以便开发模块化的、可重用的和平台独立的各种组件技术的业务逻辑。
(二)、J2EE的优势
J2EE为搭建具有可伸缩性、灵活性、易维护性的商务系统提供了良好的机制,它具有以下突出的优点:
1、事实的标准:J2EE是由SUN引导,各厂商共同发起的,并得到广泛认可的工业标准,业内的大企业(如IBM,BEA,ORACLE等)都积极参与,很多应用软件开发商也把自己的产品转移到J2EE平台上来,使之成为事实的工业标准。因此,J2EE拥有良好的市场和旺盛的生命力。
2、可保存现有的IT资产:使用J2EE能够充分利用客户原有的投资,保留已有的信息资源;同时,由于基于J2EE平台的产品几乎在任何操作系统和硬件配置上都可以运行,现有的操作系统和硬件也能够被保留使用。
3、高效的开发:J2EE允许公司把一些通用的、很繁琐的服务端任务交给中间件供应商去完成。这样开发人员可以集中精力在如何创建业务逻辑上,相应地缩短了开发时间。
4、支持异构环境:J2EE能够开发部署在异构环境中的可移植程序。基于J2EE的程序不依赖于任何特定操作系统、中间件、硬件。因此设计合理的基于J2EE的应用程序只需开发一次就可被部署到各种平台。这在典型的异构企业计算环境中是十分重要的。J2EE标准也允许客户定购与J2EE兼容的第三方的现成的组件,把它们部署到异构环境中,节省了由自己制定整个方案所需的费用。
5、可伸缩性:企业必须选择一种服务器端平台,这种平台应能提供极佳的可伸缩性去满足那些在它们的系统上进行商业运作的大批新客户。基于J2EE平台的应用程序可被部署到各种操作系统上。例如可被部署到高端UNIX和大型机系统,这种系统单机可支持64至256个处理器。(这是NT服务器所望尘莫及的)J2EE领域的供应商提供了更为广泛的负载平衡策略,能消除系统中的瓶颈,允许多台服务器集成部署。这种部署可达数千个处理器,实现可高度伸缩的系统,满足未来商业应用的需要。
6、稳定的可用性:一个服务器端平台必须能够全天候运转以满足公司客户和合作伙伴的需要。因为Internet是全球化的、无处不在的,即使在夜间按计划停机也可能造成严重损失。意外停机有可能造成灾难性后果。可以把J2EE部署到可靠的操作环境中,它们支持长期的可用性。最健壮的操作系统可达到99.999%的可用性或每年只需5分钟的停机时间,这是实时性很强商业系统理想的选择。
三、 系统的设计与实现
(一)、使用设计模式进行系统设计
软件模式是软件开发期间对重复问题的可复用解决方案,是经验的总结。掌握这些设计模式后,当遇到类似的问题时,就可以快速利用已有的解决方案分析问题,然后采取适当的策略,从而有效缩短软件开发周期并提高软件质量。因此,使用设计模式是进行软件设计开发的有效途径。在企业级应用开发中,通过使用设计模式,可以大大提高应用程序的性能和增加软件的复用性。因此,在本项目中,我们采用经过实践检验的、成熟的面向对象的设计模式来对我们的应用系统进行建模,以期达到服务质量(QoS)较好(可扩展性强、性能优良、安全可靠,有一定的灵活性)的目的,并在此基础上实现整个系统。
(二)、系统总体设计
1、 MVC模式
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式。MVC结构提供了一种按功能对各种对象进行分割的方法,它强制性地使应用程序的输入、处理和输出分开,所以依据这种设计思想能够构造良好的松耦合的构件。使用MVC的应用程序被分成三个核心构件:模型、视图、控制器。
2、系统总体结构
本系统采用MVC的设计模式,用户输入输出界面均为JSP页面,即展示层(VIEW),用户的请求(REQUEST)将会被发送到控制层(CONTROL)的一个SERVLET集中处理,根据请求调用模型层(MODEL)的JAVABEAN对请求进行实际处理,并把结果返回给控制层,控制层根据请求的执行结果将响应(RESPONSE)派发到相应的JSP页面。
例如,一个数据提交(操作请求)的标准流程:在问卷管理模块中的添加问卷页面(SurveyAdd.jsp),用户在这个页面中输入数据,提交之后,请求被派发到一个名为SurveyManage的servlet中集中处理,在这个servlet中,调用了持久层的名为SurveyDAO 的javabean的addSurvey方法对数据进行持久化,然后把处理结果返回给SurveyMange这个控制器,控制器根据返回的结果决定将相应的页面展现给客户端浏览器。
又如,一个数据查询(数据请求)的标准流程:在问卷设计页面中(SurveyAdmin.jsp),用户打开页面后,页面即调用SurveyDAO的listAllSurvey方法查询出所有问卷信息返回给页面,即页面进行数据查询时不再经过CONTROLLER层。如图3-2-1:
图3-2-1
(三)、持久层设计与实现
1、 数据库设计
核心实体包括:问卷(SURVEY),问题(QUESTION),答卷(ANSWERSHEET);还有保存用户输入的文本的文本输入项实体(TEXT),管理员表(ADMINS),友情链接表(LINK),系统配置表(CONFIG),如图3-3-1 。
值得一提的是,为了保证每个题目可以有不限量个选项,在question表中,我把q_body字段用来保存该题目所以的选项信息,每个选项用&$$&这个特殊字符串隔开,同样的,在q_result中保存的调查结果信息用逗号隔开,在q_jdtz中保存的截断跳转信息用&隔开。
图3-3-1
问卷表(SURVEY)
字段名 | 类型 | 可否空 | 含义 |
s_id | Numeric | No | 问卷ID |
Templet_id | Numeric | No | 模板ID,预留字段,暂未使用 |
S_name | Varchar(100) | No | 问卷名称 |
S_desc | Varchar(500) | Yes | 问卷描述 |
S_author | Varchar(100) | Yes | 发起人 |
S_img | Varchar(1000) | Yes | 图片文件名 |
S_ipRepeat | Bit(1) | Yes | 是否允许同一IP多次提交 |
S_createdate | Datetime | Yes | 创建时间 |
S_ipLimitType | Varchar(100) | Yes | IP限制类型,预留字段未使用 |
S_ipRange | Varchar(2000) | Yes | IP限制范围,格式如下:“白名单:192.168.0.1---192.168.0.254;黑名单:127.0.0.1---127.0.0.1” |
S_password | Varchar(100) | Yes | 访问密码 |
S_isOpen | Bit(1) | Yes | 是否开放,即是否显示在首页 |
S_expireDate | Datetime | Yes | 过期日期 |
S_isAudited | Bit(1) | Yes | 是否审核通过 |
S_hits | Numeric | Yes | 点击访问次数,未使用 |
S_usehits | Numeric | Yes | 答卷张数 |
题目表(question)
字段名 | 类型 | 可否空 | 含义 |
Q_id | numeric | No | 题目ID |
S_id | Numeric(18) | No | 问卷ID,survey表外键 |
Q_type | Number(18) | No | 题目类型: 1—单选题,2—多选题,3—单选题加输入框,4—多选题加输入框,5—问答题 |
Q_head | Varchar(1000) | Yes | 题干 |
Q_body | Varchar(8000) | Yes | 选项.以 &$$& 分隔 |
Q_result | Varchar(1000) | Yes | 用户提交的选择,格式如下: 2,3,5,2 表示选择A选项被选择了2次,B选项被选择了3次,C选项被选择了5次,D选项被选择了2次,即此某选项被选择了一次之后,其对应的RESULT值加一。 |
Q_img | Varchar(1000) | Yes | 题目的图片,预留字段。 |
Q_jdtz | Varchar(1000) | Yes | 截断跳转:格式如下:null&69&over&90 即用户点击A选项后,跳转到默认的题目,即下一题,点击B跳转到69号题,点击C终止问卷,点击D跳转到90号题 |
Q_order | Numeric(18) | yes | 题目顺序号,保留字段 |
答卷表(answersheet)
字段名 | 类型 | 可否空 | 含义 |
as_id | numeric(9) | no | 答卷ID |
s_id | numeric(9) | no | 问卷ID,survey表外键 |
as_result | varchar(8000) | yes | 答卷内容 格式如下: 18:as=1,4;text=酱油&@@&19:as=1; 即每个题目用户&@@&分隔; 题目内部以题号开头+冒号+[用户选择的项]+分号+[用户输入文本] |
as_postdate | datetime | yes | 提交日期 |
as_userIP | varchar(50) | yes | 用户IP |
2、 持久层框架设计
持久性框架是一组软件服务,将应用程序同其使用和操纵的数据源分离。它位于机构的数据源之上,隐藏访问这些数据源的数据查询存取API(如JDBC、实体EJB等),它提供的服务应完全抽象,并且隐藏使用及操纵数据源数据的细节。图3-3-2显示了它在J2EE系统体系结构中的地位。
图3-3-2
本系统在持久层主要使用了3种设计模式:DAO模式、VO模式、简单工厂模式。
DAO(数据访问对象)模式:
数据访问对象(DAO)模式使用数据访问对象来封装和抽象对所有数据源的访问,它管理着与数据源的连接以便于检索和存储数据,为业务对象提供了透明的底层数据访问实现。DAO模式完全包装数据的读取和操纵,并包装与数据库交互的数据访问API,它用数值对象包装从数据库读取和发送到数据库的数据,与业务层进行通信。DAO模式提供的灵活性是由于应用程序并不直接访问数据源,而是创建DAO对象,用其访问数据源。读取数据时,可以用数值对象保存取得的数据。例如:
——————————SurveyDAO.java begin——————————
……
public interface SurveyDAO {
boolean addSurvey(Survey survey);//添加问卷
boolean updateSurvey(Survey survey);//更新问卷
boolean delSurvey(Long surveyId);//删除问卷
……
}
——————————SurveyDAO.java end——————————
VO(值对象)模式:
使用值对象能够减少使用实体bean时需要的远程调用的次数。我们使用值对象来封装业务数据,用相应的方法调用来设置和检索值对象。当客户端向实体bean请求业务数据时,该实体bean可以构造值对象,用属性值来填充,并且将值对象传送给客户端。同样道理,客户端向实体bean提交数据时,也采用值对象这一办法。
———————————Question.java begin————————
……
public class Question {
private Long QId;
private Long survey;
private Long QType;
public Long getQId() {//取得问题ID
return this.QId;
}
public void setQId(Long QId) {//设置问题ID
this.QId = QId;
}
public Long getSurvey() {//获取问卷ID
return this.survey;
}
}
……
———————————Question.java end————————
系统中所以的数据库实体,都被封装成了这样的VO。例如,页面上要数据库中添加一个问卷,那么首先页面把数据发送到控制层的SERVLET,在该SERVLET中通过页面传过来的参数构造一个VO,然后把这个VO传递给DAO对象,DAO对象最后完成对数据库的控制操作。
简单工厂模式:
专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
————————————DAOFactory.java begin—————————
public class DAOFactory {
private DAOFactory(){
}
public static SurveyDAO getSurveyDAO(){
return new SurveyDAOimpl();//返回问卷DAO的实现类
}
public static QuestionDAO getQuestionDAO(){
return new QuestionDAOimpl();//返回问题DAO的实现类
}
}
————————————DAOFactory.java end—————————
本工厂类使用了多方法工厂,隔离上层与数据库底层,使上层方法不用关心底层采用何种数据库实现,系统如果要迁移到其他数据库上,也只需实现相应的DAO接口,然后在DAOFactroy类中修改返回的实现类即可。
(四)、 业务逻辑层的设计与实现
本系统涉及的业务逻辑相对简单,因此在设计的时候,我们将其并入MVC控制层,在控制层中直接调用DAO处理对象持久化操作。
————————————SurveyManage.java begin————————
…
public class SurveyManage extends HttpServlet {
private static final long serialVersionUID = -1737458302140188798L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
if(“AddSurvey”.equals(request.getParameter(“op”))){
SurveyDAO surveydao=DAOFactory.getSurveyDAO(); //获取DAO对象
Survey survey=new Survey();//构造VO对象
survey.setSName(request.getParameter(“Survey_name”));//给VO对象赋值
survey.setSAuthor(request.getParameter(“Survey_author”));
…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。