JavaWeb课程设计.docx
《JavaWeb课程设计.docx》由会员分享,可在线阅读,更多相关《JavaWeb课程设计.docx(35页珍藏版)》请在冰豆网上搜索。
JavaWeb课程设计
JavaWeb课程设计
题目:
客户信息管理系统
专业:
计算机科学与技术
年级:
计091—3
学号:
2
作者:
刘丹凤
指导老师:
贺秉庚
完成时间:
2012年6月17日
一.课程设计目的
课程设计是一项重要的实践性教学环节,在教师的指导下,以学生为中心,充分调动学生的积极性和能动性,重视学生自学能力的培养。
《JavaWeb数据库系统应用开发与实例》是为教育技术学本科专业开设的专业选修课程,课程的主要目标是要求学生掌握基本的Web应用程序开发和设计的流程及相关的技术技能。
本课程在讲解相关理论知识的基础上,按照一定的组织原则和现有实验条件安排了一定数量的实验,通过这些实验使学生初步掌握开发和设计Web数据库系统的基本方法和基本技能。
然而由于这些实验是分时分批按一定的技术种类和实验目的实施的,固然可以有目的地训练和培养学生某个方面技能,但明显的不连续性使学生不能从整体上把握如何系统地开发和设计一个完整Web数据库系统应用程序。
通过本课程设计可以较好地解决这个问题。
通过本课程设计可以使学生充分认识开发和设计Web应用程序的的重要性和复杂性,充分了解Web应用程序的设计和开发的基本过程,掌握常用的Web开发技术,充分把握各项技术的特点和应用领域以及各项技术之间的相互关系,进一步体会各项技术在Web应用程序中地位和作用从而对各种技术有比较清醒的认识,在此基础上习得Web开发技术平台的选择能力。
二.课程设计内容与目标
课题名称:
客户信息管理系统
设计目标:
本系统模拟企业对于客户信息的管理,操作人员可以添加、修改客户信息,针对客户来电进行记录,并对客户的重要信息进行提醒,等等。
设计方法:
jsp、mysql动态网页制作工具配合相关技术(如HTML、CSS、JavaScript、xml等)
设计要求:
利用Web应用程序的客户端开发技术(包括Jsp、HTML、CSS、JavaScript、HTML、XML、MySql等)设计一个符合要求的JavaWeb数据库应用系统,并实现用户交互功能的设计,达到JavaWeb应用程序可用性和易用性目标。
开发模式:
MVC模式。
MVC模式的目的就是实现Web系统的职能分工。
Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。
View层用于与用户的交互,通常用JSP来实现。
Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
开发工具:
windows7,eclispe,jdk1.7,tomcat7.0、mysql5.5
3、系统设计
1、系统特点
本系统尝试从一些简单的层面对于企业客户信息的管理进行一种探索,针对企业和客户的交流行为进行系统化管理,力求做到客户信息的准确、快捷和可追溯性。
本系统包括3个主要层面,客户信息维护、客户来电记录和客户回访记录。
2、功能设计
4个模块
(1)客户资料信息维护模块
客户信息输入、修改和删除。
(2)客户来电信息模块
来电信息添加和来电信息查询。
(3)客户回访信息模块
回访信息添加和回访信息查询。
(4)客户重要信息提示模块
用例图UseCase
3、用户界面草图
登录草图
导航页面草图
其它功能见后面操作效果图
4、页面迁移图
从页面迁移图中可以看出,本系统的页面迁移基本上发生在模块内部,整体比较简单而清晰
5、页面功能设计
所有页面的pageId和对应页面的Jsp文件名及所对应的功能
4、数据库设计
1、数据库表
(1)用户表user
(2)客户信息表Customer
(3)客户来电表IncomeCall
(4)客户回访表FeedBackCall
2、数据库操作图
5、功能模块的详细设计
1、程序目录结构图
2、数据库访问模块
数据库的设计是需要针对每个模块而不是每个页面进行设置数据库模块,所有的数据访问类DUser、DIncome、Dcustomer、DFeedback、DRemind从同一个父类Dcommom继承,该父类提供了一个方法getDBConnection来获取数据库的链接。
DCommon代码
publicclassDCommon
{
publicConnectiongetDBConnection()
{//尝试连接数据库
try
{//载入MySQL的JDBC驱动类
Class.forName(CommonConst.DB_DRIVER_CLASSNAME);
Connectionconn=DriverManager.getConnection
(CommonConst.DB_CONN_STRING);//获得数据库连接
returnconn;
}
catch(Exceptionex)
{
ex.printStackTrace();
returnnull;
}
}
}
3、共通Servlet的处理
本系统中一旦代码出现了异常,将直接向上抛出,一直抛到共通类Servlet进行处理。
在共通Servlet中发现异常,将页面跳转到错误处理页面,并把错误信息在页面上显示出来,同时提供一个往登录页面迁移的链接。
对应的共通Servlet的相关代码如下:
publicclassCommonServletextendsHttpServlet
{
//保存各页面Id对应的action类的对象
privateHashtablehPageHandler=newHashtable();
//配置文件的存放位置
privateJXPathContextconfigContext=null;
publicvoidinit()
{
//取得配置文件,并获得其中的dom元素
String=getInitParameter("configXML");
String=getServletContext().getRealPath();
//尝试建立配置文件的DOM
try
{
org.jdom.input.SAXBuilderbuilder=newSAXBuilder();
org.jdom.DocumentpDoc=builder.build();
configContext=JXPathContext.newContext(pDoc);
GlobalObjectProvider.init(configContext);
}
catch(Exceptione)
{
System.out.println("Servlet初始化失败!
");
}
//初始化共通类以获取页面信息
CommonConst.init();
}
//每一种动作第一次执行的时候,初始化对应的类
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException
{
//设置提交表单的中文编码
request.setCharacterEncoding("GBK");
HttpSessionmySession=request.getSession(true);
//得到用户输入信息
StringsPageId=request.getParameter("pageId");
StringsActionId=request.getParameter("actionId");
if(sPageId==null||sPageId.equals("")
||sActionId==null||sActionId.equals(""))
{
//非法进入页面,跳转到首页
mySession.invalidate();
response.sendRedirect("../login.jsp");
return;
}
//如果非法进入页面(登录页面除外)
if(!
sPageId.equals("S001")
&&mySession.getAttribute("loginUser")==null)
{
//非法进入页面,跳转到首页
mySession.invalidate();
response.sendRedirect("../login.jsp");
return;
}
try
{
//根据pageId获得处理对象,如果没有则创建一个对象
ObjectoActionObject=hPageHandler.get(sPageId);
if(oActionObject==null)
{
//根据配置文件创建一个新对象
StringsClassName=(String)configContext.getValue(
"ch08-config/page[@id='"+sPageId+"']/@className");
oActionObject=Class.forName(sClassName).newInstance();
hPageHandler.put(sPageId,oActionObject);
}
//取得方法名
StringsMethodName=(String)configContext.getValue(
"ch08-config/page[@id='"+sPageId+"']/action[@id='"+sActionId+"']/@methodName");
//生成对应的参数,并调用对应对象的对应方法
//inputData是根据传入的参数做成的
HashtableinputData=newHashtable();
Enumerationparams=request.getParameterNames();
while(params.hasMoreElements())
{
StringsParaName=(String)params.nextElement();
inputData.put(sParaName,request.getParameter(sParaName));
}
//outputData是下一个页面的值域,在此只是被初始化
HashtableoutputData=newHashtable();
//生成参数列表
Class[]paraType={Class.forName("java.util.Hashtable"),
Class.forName("java.util.Hashtable"),
Class.forName("javax.servlet.http.HttpSession")};
Object[]paraObj={inputData,outputData,mySession};
//生成Method对象
MethodinvokeMethod=oActionObject.getClass().getMethod(sMethodName,paraType);
//调用方法
invokeMethod.invoke(oActionObject,paraObj);
//根据outputData的结果决定下一个页面
StringsNextPageId=(String)outputData.get("pageId");
StringsRealPagePath=(String)configContext.getValue(
"ch08-config/page[@id='"+sNextPageId+"']/@path");
//设置下一个页面的值域
mySession.setAttribute(sNextPageId,outputData);
response.sendRedirect(sRealPagePath);
return;
}
catch(Exceptione)
{
//页面处理出错,跳转到错误处理页面
e.printStackTrace();
HashtableoutputData=newHashtable();
outputData.put("exception",e);
//设置错误页面的值域
mySession.setAttribute(CommonConst.VIEWID_ERROR,outputData);
response.sendRedirect("../error.jsp");
return;
}
}
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException
{
doPost(request,response);
}
}
错误页面:
4、登录模块
由于本系统用户角色只有一种,不存在跳转到不同页面的问题,处理相对简单一些,如果用户登录成功,则将用户信息放到session中,并将页面跳转到导航页面。
(1)登录页面控制模块ALogin相关代码如下:
publicclassALogin
{
publicvoiddoLogin(HashtableinputData,
HashtableoutputData,
HttpSessionmySession)
throwsException
{
//获取输入信息
StringsUsername=(String)inputData.get("username");
StringsPassword=(String)inputData.get("password");
//校验用户输入信息
LUserlUser=(LUser)GlobalObjectProvider.getLogicService(CommonConst.LOGIC_KEY_USER);
//如果对应的类没有的话,报错并返回login页面
if(lUser==null)
{
thrownewException("发生了内部错误,请联系技术人员!
");
}
//获取用户信息
UseruserInfo=lUser.getUserInfo(sUsername,sPassword);
if(userInfo==null)
{
outputData.put("pageId",CommonConst.VIEWID_LOGIN);
outputData.put("errMsg","用户名密码检查失败!
请重新输入。
");
outputData.put("username",sUsername);
return;
}
else
{
outputData.put("pageId",CommonConst.VIEWID_MENU);
//往session中设置用户信息
mySession.setAttribute("loginUser",userInfo);
return;
}
}
}
(2)登录效果图
5、页面导航设计
(1)页面位置信息和页面的pageid息息相关,考虑用一个全局变量来存这个信息,然后通过在共通文件中来访问这个全局变量来获取对应页面的名称。
为了达到这个目的设置一个成员变量pageinfo和对应的设置方法init(),对应代码如下:
publicstaticHashtablepageInfos=newHashtable();
//数据库相关常量
publicstaticStringDB_DRIVER_CLASSNAME="com.mysql.jdbc.Driver";
publicstaticStringDB_CONN_STRING="jdbc:
mysql:
//localhost/ch08?
user=root&password=123";
//初始化
publicstaticvoidinit()
{
pageInfos.put("S002","目录页面");
pageInfos.put("S110","客户资料>客户资料录入页面");
pageInfos.put("S120","客户资料>客户资料修改一览页面");
pageInfos.put("S121","客户资料>客户资料修改详细页面");
pageInfos.put("S130","客户资料>客户资料删除页面");
pageInfos.put("S210","客户来电>快速反应条件输入页面");
pageInfos.put("S211","客户来电>快速反应结果一览页面");
pageInfos.put("S220","客户来电>客户来电信息添加页面");
pageInfos.put("S230","客户来电>客户来电信息查找页面");
pageInfos.put("S231","客户来电>客户来电信息一览页面");
pageInfos.put("S232","客户来电>客户来电信息详细页面");
pageInfos.put("S310","客户回访>客户回访信息添加页面");
pageInfos.put("S320","客户回访>客户回访信息查找页面");
pageInfos.put("S321","客户回访>客户回访信息一览页面");
pageInfos.put("S322","客户回访>客户回访信息详细页面");
pageInfos.put("S410","客户重要信息提醒页面");
}
//获得页面信息
publicstaticStringgetPageInfo(StringsPageId)
{
return(String)pageInfos.get(sPageId);
}
(2)页面外观设计
为四个模块设计不同颜色风格的CSS代码
.tr_head1{color:
black;background-color:
#aaccaa;}
.tr_content1{color:
black;background-color:
#eeffee;cursor:
hand;}
.tr_head2{color:
black;background-color:
#ccaaaa;}
.tr_content2{color:
black;background-color:
#ffeeee;cursor:
hand;}
.tr_head3{color:
black;background-color:
#aaaacc;}
.tr_content3{color:
black;background-color:
#eeeeff;cursor:
hand;}
.tr_head4{color:
black;background-color:
#ccccaa;}
.tr_content4{color:
black;background-color:
#ffffee;cursor:
hand;}
(3)导航页效果图
5、客户资料维护模块
(1)客户资料录入
单击导航页面链接进入客户资料录入页面。
注意两个方面:
一是页面对应的显示元素和输入元素的颜色和当前模块的颜色想吻合,而是在用户输入信息并单击“登录”按钮时,将客户信息登入数据库,然后页面直接转入修改一览。
页面控制类ACustomerAdd:
publicclassACustomerAdd
{
//追加一个客户
publicvoiddoRegister(HashtableinputData,
HashtableoutputData,
HttpSessionmySession)
throwsException
{
//首先获得要追加的客户详细信息
StringsRealname=(String)inputData.get("realname");
StringsSex=(String)inputData.get("sex");
StringsBirthday=(String)inputData.get("birthday");
StringsPhone=(String)inputData.get("phone");
StringsCellphone=(String)inputData.get("cellphone");
StringsAddress=(String)inputData.get("address");
StringsStartDate=(String)inputData.get("startDate");
StringsMemo=(String)inputData.get("memo");
//生成一个Customer对象以调用
Customercustomer=newCustomer();
customer.setRealname(sRealname);
customer.setSex(sSex);
customer.setBirthday(sBirthday);
customer.setPhone(sPhone);
customer.setCellphone(sCellphone);
customer.setAddress(sAddress);
customer.setStartDate(sStartDate);
customer.setMemo(sMemo);
//调用对应的logic类
LCustomerlCustomer=(LCustomer)GlobalObjectProvider.getLogicService(CommonConst.LOGIC_KEY_CUSTOMER);
//添加对应的记录
lCustomer.addCustomer(customer);
//然后重新检索,并将页面迁移到一览页面
VectorvCustomer