JavaEE上机实验报告211.docx
《JavaEE上机实验报告211.docx》由会员分享,可在线阅读,更多相关《JavaEE上机实验报告211.docx(18页珍藏版)》请在冰点文库上搜索。
JavaEE上机实验报告211
院系:
计算机科学学院
专业:
软件工程
年级:
14
课程名称:
JavaEE程序设计
组号:
十九
姓名(学号):
柳真201421092073
吴超201421092077
刘仁杰201421092068
张浩东201421092082
陈初相201421092119
指导教师:
徐胜舟
2016年12月05日
年级
14
班号
04
组号
19
专业
软件工程
实验名称
JSP编程
实验室
9#204
实
验
目
的
和
要
求
一、实验目的:
(1)掌握JSP指令的使用方法;
(2)掌握JSP动作的使用方法;(3)掌握JSP内置对象的使用方法;(4)掌握JavaBean的编程技术及使用方法;(5)掌握JSP中数据库编程方法;
二、实验要求:
1.利用JSP编程技术实现一个简单的购物车程序,具体要求如下。
(1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息。
(2)编写一个JSP程序来获取用户提交的登录信息并查询数据库,如果用户名为本小组成员的名字且密码为对应的学号时,采用JSP内置对象的方法跳转到订购页面(显示店中商品的种类和单价等目录信息);否则采用JSP动作提示用户重新登录(注:
此页面上要包含前面的登录界面)。
(3)当顾客填好所需商品的数量并点击提交按钮时,将前面订购的商品放入购物车中并显示购物车里的相关信息,包括商品的名称和数量以及所有商品的总价格。
(4)将商品信息写入数据库,计算价格时通过查找数据库来完成。
以下功能选做:
(5)实现一个简单的注册功能,使新用户能够将自己的信息(姓名和学号)写进数据库,以供后面登录时使用。
(6))将数据库的相关操作改写成一个JavaBean。
需
求
分
析
3、需求分析:
随着互联网的迅速普及,以及网络技术的不断发展,人们通过网络的生活方式不断变化。
网络购物就是其中的一种。
网络购物车的实现满足了很多用户的需求和对用户对购物方便的需求有了很大的提升。
(1)用户登录模块:
通过查询MongoDB数据库,完成登录认证。
。
(2)用户注册模块:
通过写入MongoDB数据库,完成用户注册。
(3)记住密码模块:
通过使用Cookie,实现记住首页用户名和密码功能。
(4)查看商品模块:
通过查询MongoDB数据库,返回商品具体信息,并显示在客户端界面。
(5)购买商品模块:
通过查询MongoDB数据库,调用封装好的购买商品操作类,购买成功后,显示在购物车中。
(6)购物车:
显示用户购买商品具体信息,删除已购买商品或添加已购买商品数量,计算用户当前购买商品总价格。
概
要
设
计
(
整
体
流
程
)
4、概要设计:
系统结构示意图:
图1.系统结构示意图
概
要
设
计
(
整
体
流
程
)
具体解释:
(1)浏览器中打开首页login.jsp用户登录页面;
(2)点击创建新用户按钮,进入register.jsp用户注册页面;
(3)注册失败则停留在register.jsp原页面;注册成功则跳转到register_success.jsp注册成功提示页面,点击返回按钮,返回到登陆首页login.jsp页面
(4)在首页login.jsp页面输入用户名和密码,请求发送到login_action.jsp登陆处理脚本页,数据匹配成功跳转到welcome.jsp购物首页页面,否则跳转到登陆视频login_Fail.jsp页面;
(5)进入welcome.jsp购物首页页面后,点击下一页和上一页按钮,可以查看当前商品信息;同一商品点击一次购买按钮实现购买一件商品,点击多次则实现购买多件商品;点击查看购物车按钮,实现内部跳转到Cart.jsp购物车页面,可以产看当前购买商品编号、名称、价格、购买数目以及所有商品总价格信息,并提供删除已购买商品和添加已购买商品数目功能;
(6)购物首页welcom.jsp页面由header.jsp、main_shop.jsp、bottom.jsp三个页面组成,具体如下图二所示:
图2.购物首页welcome.jsp页面
详
细
设
计
(
算
法
实
现
五、详细设计:
(1)MongoDB数据库简介及环境部署:
MongoDB是NoSQL家族的一员,和当前普遍使用的关系型数据库(例如,mysql、SQLserver等)相比来说,舍弃了其中复杂的关系及实体间的关联。
换句话说,MongoDB是一种文档型数据库,就和我们日常写文档一样,不用去担心各类文档的具体内容也不用仔细分类整理,均可以存放在自己电脑的硬盘里。
下面请看一张MongoDB与关系型数据库名词概念对照表:
关系型数据库
MongoDB
database(数据库)
database(数据库)
table(表)
collection(集合)
row(行)
document(文档)
column(列)
filed(域)
index(索引)
index(索引)
tablejoins(表关系)
无
primarykey(主键)
自动将_id字段设置为主键
由上表可知,在我们熟悉的关系型数据库中,具体的实体表对应MongoDB中的集合,表中的行对应MongoDB集合中的文档,表中的列对应MongoDB文档中的域,最关键的主键在MongoDB中是系统自动生成,MongoDB自动的生成的主键是按照特定的方法来生成,具体有12个字节,12字节按照如下方式生成:
0|1|2|3 | 4|5|6 | 7|8 | 9|10|11
时间戳 | 机器 | PID | 计数器
MongoDB中存入和读取的数据格式均为BSON格式,BSON格式是一种类似JSON格式的数据,其具体样式如下所示:
/*8createdAt:
2016/11/22下午3:
53:
19*/
{
"_id":
ObjectId("5833f96fe9d60125601a8c8c"),
"sid":
"8",
"sname":
"平凡的世界",
"sprice":
"99"
},
当我们从MongoDB数据库查询获取数据后,其格式为BSON格式,不能直接与客户端获取的数据进行匹配。
在这里,我们在获取数据库中BSON格式数据后,调用MongoDB驱动包中BSON.toMap()方法,把BSON格式转换为Map键值对格式的字符串,然后调用Map中Map.get(“name”)方法,获取其中具体键值对的值,从而实现与客户端页面中数据的匹配。
最后,最关键的一点就是,在新建项目中导入MongoDB驱动包,方便客户端和业务层操作数据库。
这里我使用的是mongo-java-driver-3.3.0.jar包。
详
细
设
计
(
算
法
实
现
(2)用户登录功能:
实现用户登录,主要是由login_action.jsp脚本中代码来实现,代码中已给出具体注释,核心代码如下:
<%
response.setContentType("text/html;charset=utf-8");//确保显示的汉字信息以正确编码方式显示
request.setCharacterEncoding("utf-8");//确保获取的汉字信息以正确编码方法获取
StringuserName=(String)request.getParameter("username");//获取登录页面用户名
StringpassWord=(String)request.getParameter("password");//获取登陆页面密码
StringcheckBox=request.getParameter("save_password");//获取登陆页面记住密码选择框属性值
booleanlogin_test=false;//设定登陆布尔值,若用户名和密码成功匹配,则为true
try{
//连接到mongodb服务
MongoClientmongoClient=newMongoClient("localhost",27017);
//此处采用无用户名和密码验证方式登陆
@SuppressWarnings("deprecation")
DBdb=mongoClient.getDB("library");//连接到数据库library
DBCollectioncoll=db.getCollection("userInfo");//获取library数据库中集合userInfo
System.out.println("CollectionuserInfoselectedsuccessfully");
DBCursorcursor=coll.find();//查询集合userInfo中文档信息
inti=1;
while(cursor.hasNext()){//检索集合userInfo中所有文档信息
System.out.println("userInfoDocument:
"+i);
DBObjectshow=cursor.next();
System.out.println(show);
@SuppressWarnings("rawtypes")
Mapshow1=show.toMap();//将检索结果show(Bson类型)转换为Map类型
{
详
细
设
计
(
算
法
实
现
Stringtoname=(String)show1.get("username");//提取Map中字段名为username的属性值
Stringtopassword=(String)show1.get("password");//提取Map中字段名为password的属性值
if(toname.equals(userName)&&topassword.equals(passWord))
//将从数据库中获取的用户名和密码与表单中获取的数据进行验证,匹配成功则使login_test值为true
System.out.println("登陆成功!
!
!
!
!
"+"username:
"+toname+"password:
"+topassword);
//request.getRequestDispatcher("welcome.jsp").forward(request,response);
login_test=true;
}
System.out.println(show1.get("username"));
i++;
}
用户登录页面如下图三所示:
图3.用户登录首页
详
细
设
计
(
算
法
实
现
(3)用户注册功能:
用户注册功能实现原理基本和用户登录一致,唯一的区别在于用户登录是查询数据库,而用户注册是写入数据库,此处就不贴具体代码,直接看用户注册相关界面:
用户注册界面如下图四所示:
图4.用户注册界面
注册成功后提示界面如下图五所示:
图5.注册成功后界面
详
细
设
计
(
算
法
实
现
(4)记住密码功能:
实现记住密码,此处使用两个Cookie,当用户正确登录时,Cookie_one获取用户名,并添加到当前浏览器Cookie中,Cookie_two获取密码,也添加到当前浏览器Cookie中。
在登录首页用户名和密码两个输入框中的value值填写系统从Cookie中获取的用户名和密码,从而实现记住密码功能。
核心代码如下:
if(login_test){
if("save".equals(checkBox)){
//Cookie存取时用URLEncoder.encode进行编码(PS:
读取时URLDecoder.decode进行解码)
Stringname1=.URLEncoder.encode(userName,"UTF-8");
//创建两个Cookie对象
CookienameCookie=newCookie("username",name1);
//设置Cookie的有效期为3天
nameCookie.setMaxAge(60*60*24*3);
Stringpwd=.URLEncoder.encode(passWord,"UTF-8");
CookiepwdCookie=newCookie("password",pwd);
pwdCookie.setMaxAge(60*60*24*3);
response.addCookie(nameCookie);
response.addCookie(pwdCookie);
}
//request.getRequestDispatcher("welcome.jsp").forward(request,response);
response.sendRedirect("welcome.jsp");
}
else{
response.sendRedirect("login_Fail.jsp");
//request.getRequestDispatcher("loginFail.jsp").forward(request,response);
}
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
Stringusername="";
Stringpassword="";
//获取当前站点的所有Cookie
Cookie[]cookies=request.getCookies();
详
细
设
计
(
算
法
实
现
for(inti=0;i//对cookies中的数据进行遍历,找到用户名、密码的数据
if("username".equals(cookies[i].getName())){
//读取时URLDecoder.decode进行解码(PS:
Cookie存取时用URLEncoder.encode进行编码)
username=.URLDecoder.decode(cookies[i].getValue(),"UTF-8");
}elseif("password".equals(cookies[i].getName())){
password=.URLDecoder.decode(cookies[i].getValue(),"UTF-8");
}
}
%>
未登录前用户界面如下图六所示:
图6.用户登录首页
详
细
设
计
(
算
法
实
现
用户登录成功后,再次打开登录界面如下图七所示:
图7.重新打开登陆首页页面
(5)查询商品和购买商品:
此处功能主要是操作MongoDB数据库,返回商品的具体信息,只要弄懂用户登录功能后,此处的功能代码就会很快弄明白,此处展示一下具体界面。
用户登录成功后,查看商品的界面如下图八所示:
图8.产看商品和购物页面
详
细
设
计
(
算
法
实
现
(6)购物车:
此处的功能也是主要操作MongoDB数据,通过和客户端的用户交互,实现购物车相关功能,具体功能实现和操作数据库有比较大的关联,此处就不讲具体如何操作数据库,具体看一下相关功能界面:
用户购买商品,点击查看购物车,如下图九所示:
图9.购物车未购买商品页面
用户查看购物车,删除已有商品和添加已购买商品的数量,结果如下图十所示:
图10.购物车已购买商品页面
实
验
结
果
及
分
析
通过本次实验,首先,让我们对JSP和Servlet之间的关联和区别有了一个基本的了解,对于JSP的内部指令以及页面跳转有了全新的认识和了解,对于JSP技术的基本框架和原理也更加清楚;其次,让我们对于JSP连接数据库的方法有了认识和基本运用,以及如何操作数据库进行增删改查,通过调用数据库,让我们对于一个系统的重要组成成分有了全新的认识,对于专业知识的学习和架构也更加清晰;最后,最重要的一点是让我们对于MongoDB数据库的应用更加熟悉,对MongoDB数据库有了全新的认识和了解,在当前分布式数据库飞速发展的今天,学习和使用MongoDB是最佳的学习的途径和实践方案。
组
内
分
工
(1):
张浩东负责编写登录页面代码;
(2):
吴超负责编写登录成功和失败两个页面;(3):
柳真编写购物车功能界面及处理请求以及页面记住密码功能(并使用Cookie实现记住用户登录用户名和密码功能),成功则跳转到welcome.jsp,失败则跳转到loginFail.jsp;(4):
陈初相和刘仁杰负责编写查看商品和购买商品界面以及相关逻辑实现类。
心
得
体
会
柳真:
吴超:
刘仁杰:
张浩东:
陈初相:
成
绩
评
定
教师签名:
年月日