使用MongoDB和JSP实现一个简单的购物车系统实例
本文介绍了jsp编程技术实现一个简单的购物车程序,具体如下:
1 问题描述
利用jsp编程技术实现一个简单的购物车程序,具体要求如下。
(1)用jsp编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息。
(2)编写一个jsp程序来获取用户提交的登录信息并查询数据库,如果用户名为本小组成员的名字且密码为对应的学号时,采用jsp内置对象的方法跳转到订购页面(显示店中商品的种类和单价等目录信息);否则采用jsp动作提示用户重新登录(注:此页面上要包含前面的登录界面)。
(3)当顾客填好所需商品的数量并点击提交按钮时,将前面订购的商品放入购物车中并显示购物车里的相关信息,包括商品的名称和数量以及所有商品的总价格。
(4)将商品信息写入数据库,计算价格时通过查找数据库来完成。
以下功能选做:
(5) 实现一个简单的注册功能,使新用户能够将自己的信息(姓名和学号)写进数据库,以供后面登录时使用
(6)将数据库的相关操作改写成一个javabean
2 解决方案
2.1 实现功能
(1)用户登录。(通过查询mongodb数据库,完成登录认证)
(2)用户注册。(通过写入mongodb数据库,完成用户注册)
(3)记住密码。(通过使用cookie,实现记住首页用户名和密码功能)
(4)查看商品。(通过查询mongodb数据库,返回商品具体信息,并显示在客户端界面)
(5)购买商品。
(6)购物车。(显示用户购买商品具体信息,删除已购买商品或添加已购买商品数量,计算用户当前购买商品总价格)
2.2 最终运行效果图
2.3 系统功能框架示意图
图一:系统功能框架示例图
具体解释:
(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三个页面组成,具体如下图二所示:
图二:购物首页welcome.jsp页面
2.4 有关mongodb简介及系统环境配置
mongodb是nosql家族的一员,和当前普遍使用的关系型数据库(例如,mysql、sqlserver等)相比来说,舍弃了其中复杂的关系及实体间的关联。换句话说,mongodb是一种文档型数据库,就和我们日常写文档一样,不用去担心各类文档的具体内容也不用仔细分类整理,均可以存放在自己电脑的硬盘里。下面请看一张mongodb与关系型数据库名词概念对照表:
关系型数据库 |
mongodb |
database(数据库) |
database(数据库) |
table(表) |
collection(集合) |
row(行) |
document(文档) |
column(列) |
filed(域) |
index(索引) |
index(索引) |
table joins(表关系) |
无 |
primary key(主键) |
自动将_id字段设置为主键 |
由上表可知,在我们熟悉的关系型数据库中,具体的实体表对应mongodb中的集合,表中的行对应mongodb集合中的文档,表中的列对应mongodb文档中的域,最关键的主键在mongodb中是系统自动生成,mongodb自动的生成的主键是按照特定的方法来生成,具体有12个字节,12字节按照如下方式生成:
0|1|2|3 | 4|5|6 | 7|8 | 9|10|11
时间戳 | 机器 | pid | 计数器
以上是个人初步学习mongodb的介绍,如有错误,欢迎各位圆友指正。
说完了概念,就要到具体运用,mongodb中存入和读取的数据格式均为bson格式,bson格式是一种类似json格式的数据,其具体样式如下所示:
/* 7 createdat:2016/11/22 下午3:52:51*/ { "_id" : objectid("5833f953e9d60125601a8c8b"), "sid" : "7", "sname" : "红米note4", "sprice" : "899" }, /* 8 createdat:2016/11/22 下午3:53:19*/ { "_id" : objectid("5833f96fe9d60125601a8c8c"), "sid" : "8", "sname" : "平凡的世界", "sprice" : "99" }, /* 9 createdat:2016/11/22 下午3:53:43*/ { "_id" : objectid("5833f987e9d60125601a8c8d"), "sid" : "9", "sname" : "斗罗大陆", "sprice" : "199" },
当我们从mongodb数据库查询获取数据后,其格式为bson格式,不能直接与客户端获取的数据进行匹配。在这里,我在获取数据库中bson格式数据后,调用mongodb驱动包中bson.tomap()方法,把bson格式转换为map键值对格式的字符串,然后调用map中map.get(“name”)方法,获取其中具体键值对的值,从而实现与客户端页面中数据的匹配。
最后,最关键的一点就是,在新建项目中导入mongodb驱动包,方便客户端和业务层操作数据库。这里我使用的是mongo-java-driver-3.3.0.jar包,其各版本驱动包下载链接:http://central.maven.org/maven2/org/mongodb/mongo-java-driver/
2.5 核心功能代码讲解
(1)用户登录功能
实现用户登录,主要是由login_action.jsp脚本中代码来实现,代码中已给出具体注释,具体如下:
<%@ page language="java" import="java.util.*,com.mongodb.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>my jsp 'login_action.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <% response.setcontenttype("text/html;charset=utf-8"); //确保显示的汉字信息以正确编码方式显示 request.setcharacterencoding("utf-8"); //确保获取的汉字信息以正确编码方法获取 string username=(string)request.getparameter("username"); //获取登录页面用户名 string password=(string)request.getparameter("password");//获取登陆页面密码 string checkbox = request.getparameter("save_password");//获取登陆页面记住密码选择框属性值 boolean login_test = false; //设定登陆布尔值,若用户名和密码成功匹配,则为true try{ // 连接到 mongodb 服务 mongoclient mongoclient = new mongoclient( "localhost" , 27017 ); //此处采用无用户名和密码验证方式登陆 @suppresswarnings("deprecation") db db = mongoclient.getdb( "library" ); //连接到数据库library dbcollection coll = db.getcollection("userinfo"); //获取library数据库中集合userinfo system.out.println("collection userinfo selected successfully"); dbcursor cursor = coll.find(); //查询集合userinfo中文档信息 int i=1; while (cursor.hasnext()) { //检索集合userinfo中所有文档信息 system.out.println("userinfo document: "+i); dbobject show = cursor.next(); system.out.println(show); @suppresswarnings("rawtypes") map show1 = show.tomap(); //将检索结果show(bson类型)转换为map类型 string toname = (string)show1.get("username"); //提取map中字段名为username的属性值 string topassword = (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++; } }catch(exception e){ system.err.println( e.getclass().getname() + ": " + e.getmessage() ); } if(login_test) { if ("save".equals(checkbox)) { //cookie存取时用urlencoder.encode进行编码(ps:读取时urldecoder.decode进行解码) string name1 = java.net.urlencoder.encode(username,"utf-8"); //创建两个cookie对象 cookie namecookie = new cookie("username", name1); //设置cookie的有效期为3天 namecookie.setmaxage(60 * 60 * 24 * 3); string pwd = java.net.urlencoder.encode(password,"utf-8"); cookie pwdcookie = new cookie("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); } %> </body> </html>
(2)用户注册功能
用户注册功能实现原理基本和用户登录一致,唯一的区别在于用户登录是查询数据库,而用户注册是写入数据库,此处就不贴具体代码,在下面具体编码中展示。
(3)记住密码功能
实现记住密码,此处使用两个cookie,当用户正确登录时,cookie_one获取用户名,并添加到当前浏览器cookie中,cookie_two获取密码,也添加到当前浏览器cookie中。在登录首页用户名和密码两个输入框中的value值填写系统从cookie中获取的用户名和密码,从而实现记住密码功能。具体如下:
if(login_test) { if ("save".equals(checkbox)) { //cookie存取时用urlencoder.encode进行编码(ps:读取时urldecoder.decode进行解码) string name1 = java.net.urlencoder.encode(username,"utf-8"); //创建两个cookie对象 cookie namecookie = new cookie("username", name1); //设置cookie的有效期为3天 namecookie.setmaxage(60 * 60 * 24 * 3); string pwd = java.net.urlencoder.encode(password,"utf-8"); cookie pwdcookie = new cookie("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); }
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; string username = ""; string password = ""; //获取当前站点的所有cookie cookie[] cookies = request.getcookies(); for (int i = 0; i < cookies.length; i++) { //对cookies中的数据进行遍历,找到用户名、密码的数据 if ("username".equals(cookies[i].getname())) { //读取时urldecoder.decode进行解码(ps:cookie存取时用urlencoder.encode进行编码) username = java.net.urldecoder.decode(cookies[i].getvalue(),"utf-8"); } else if ("password".equals(cookies[i].getname())) { password = java.net.urldecoder.decode(cookies[i].getvalue(),"utf-8"); } } %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>登陆页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="description" content="this is my page"> <link rel="stylesheet" type="text/css" href="css/login.css"> </head> <body> <div class="content"> <div class="head"> <h1>简单购物车</h1> </div> <!-- 登录面板 --> <div class="panel"> <form action="login_action.jsp" method="post"> <!-- 账号和密码组 --> <div class="group"> <label>账号</label> <input type="text" placeholder="请输入账号" name="username" value="<%=username%>"> </div> <div class="group"> <label>密码</label> <input type="password" placeholder="请输入密码" name="password" value="<%=password%>"> </div> <div> <input type="checkbox" value="save" name="save_password"> <label>记住密码</label> </div> <div class="group"> <label></label> </div> <!-- 登录按钮 --> <div class="login"> <button type="submit" name="login">登陆</button> <button type="reset" name="reset">重置</button> </div> </form> </div> <!-- 注册按钮 --> <div class="register"> <button onclick="window.location.href='register.jsp'">创建新账号</button> </div> </div> </body> </html>
(4)查询商品和购买商品
此处功能主要是操作mongodb数据库,返回商品的具体信息,只要弄懂用户登录功能后,此处的功能代码就会很快弄明白,具体代码在后面展示。
(5)购物车
此处的功能也是主要操作mongodb数据,通过和客户端的用户交互,实现购物车相关功能,具体代码在后面展示。
2.6 具体编码
具体编码的讲解,就按照实现功能大致顺序来介绍,具体如下:
2.6.1用户登录和记住密码
首先看是登录首页login.jsp页面,为了显示美观,此物使用一个login.css文件(后面多个页面均是使用login.css文件)。login.css具体代码如下:
@charset "utf-8"; /*按照样图要求,添加一个浅灰色背景*/ body{ background-color: #f2f2f2; } /*设置内容模块距离顶部一个有一段距离100px*/ .content { margin-top: 80px; } /*登录和注册按钮的整体样式*/ .content button { height: 30px;/*登录和注册按钮的高度*/ color: white;/*登录和注册按钮字体颜色为白色*/ font-size: 18px;/*登录和注册按钮的字体大小*/ border: 0px;/*无边框*/ padding: 0px;/*无内边距*/ cursor: pointer;/*登录和注册按钮的选择时为手形状*/ } /*头部名称*/ .content .head { text-align: center;/*子内容居中*/ } /*登录面板*/ .content .panel { background-color: white;/*登录面板背景颜色为白色*/ width: 302px;/*宽度为302px*/ text-align: center;/*子内容居中*/ margin: 0px auto;/*自身居中*/ padding-top: 10px;/*顶部的内边距为20px*/ padding-bottom: 10px;/*底部的内边距为20px*/ border: 1px solid #ddd;/*边框颜色为灰色*/ border-radius: 5px;/*边框边角有5px的弧度*/ } /*购物主页购物面板*/ .content .panel1 { background-color: white;/*购物主页面板背景颜色为白色*/ width: 1000px;/*宽度为600px*/ text-align: center;/*子内容居中*/ margin: 0px auto;/*自身居中*/ border: 1px solid #ddd;/*边框颜色为灰色*/ border-radius: 5px;/*边框边角有5px的弧度*/ } /*登录和密码组*/ .content .panel .group { text-align: left;/*子内容居中*/ width: 262px;/*宽度为262px*/ margin: 0px auto 20px;/*自身居中,并距离底部有20px的间距*/ } .content .panel .group label { line-height: 30px;/*高度为30px*/ font-size: 18px;/*字体大小为18px*/ } .content .panel .group input { display: block;/*设置为块,是为了让输入框独占一行*/ width: 250px;/*宽度为250px*/ height: 30px;/*高度为30px*/ border: 1px solid #ddd;/*输入框的边框*/ padding: 0px 0px 0px 10px;/*左边内边距为10px,显得美观*/ font-size: 16px;/*字体大小*/ } .content .panel .group input:focus{ border-left: 1px solid #cc865e;/*当输入框成为焦点时,左边框颜色编程褐色*/ } .content .panel .login button { background-color: #cc865e;/*按钮的背景颜色*/ width: 130px;/*按钮的宽度*/ } .content .panel .login button:hover { background-color: white;/*按钮选中后背景颜色为白色*/ color: #cc865e;/*按钮选中后字体颜色为褐色*/ border: 1px solid #cc865e;/*按钮选中后边框颜色为褐色*/ } /*注册按钮*/ .content .register { text-align: center;/*子内容居中*/ margin-top: 20px;/*顶部的内边距为20px*/ } .content .register button { background-color: #466baf;/*按钮的背景颜色为蓝色*/ width: 180px;/*按钮的宽度*/ } .content .register button:hover { background-color: white;/*按钮选中后背景颜色为白色*/ color: #466baf;/*按钮选中后字体颜色为蓝色*/ border: 1px solid #466baf;/*按钮选中后边框颜色为蓝色*/ }
login.jsp具体代码如下:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; string username = ""; string password = ""; //获取当前站点的所有cookie cookie[] cookies = request.getcookies(); for (int i = 0; i < cookies.length; i++) { //对cookies中的数据进行遍历,找到用户名、密码的数据 if ("username".equals(cookies[i].getname())) { //读取时urldecoder.decode进行解码(ps:cookie存取时用urlencoder.encode进行编码) username = java.net.urldecoder.decode(cookies[i].getvalue(),"utf-8"); } else if ("password".equals(cookies[i].getname())) { password = java.net.urldecoder.decode(cookies[i].getvalue(),"utf-8"); } } %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>登陆页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="description" content="this is my page"> <link rel="stylesheet" type="text/css" href="css/login.css"> </head> <body> <div class="content"> <div class="head"> <h1>简单购物车</h1> </div> <!-- 登录面板 --> <div class="panel"> <form action="login_action.jsp" method="post"> <!-- 账号和密码组 --> <div class="group"> <label>账号</label> <input type="text" placeholder="请输入账号" name="username" value="<%=username%>"> </div> <div class="group"> <label>密码</label> <input type="password" placeholder="请输入密码" name="password" value="<%=password%>"> </div> <div> <input type="checkbox" value="save" name="save_password"> <label>记住密码</label> </div> <div class="group"> <label></label> </div> <!-- 登录按钮 --> <div class="login"> <button type="submit" name="login">登陆</button> <button type="reset" name="reset">重置</button> </div> </form> </div> <!-- 注册按钮 --> <div class="register"> <button onclick="window.location.href='register.jsp'">创建新账号</button> </div> </div> </body> </html>
登录处理脚本login_action.jsp代码如下:
<%@ page language="java" import="java.util.*,com.mongodb.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>my jsp 'login_action.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <% response.setcontenttype("text/html;charset=utf-8"); //确保显示的汉字信息以正确编码方式显示 request.setcharacterencoding("utf-8"); //确保获取的汉字信息以正确编码方法获取 string username=(string)request.getparameter("username"); //获取登录页面用户名 string password=(string)request.getparameter("password");//获取登陆页面密码 string checkbox = request.getparameter("save_password");//获取登陆页面记住密码选择框属性值 boolean login_test = false; //设定登陆布尔值,若用户名和密码成功匹配,则为true try{ // 连接到 mongodb 服务 mongoclient mongoclient = new mongoclient( "localhost" , 27017 ); //此处采用无用户名和密码验证方式登陆 @suppresswarnings("deprecation") db db = mongoclient.getdb( "library" ); //连接到数据库library dbcollection coll = db.getcollection("userinfo"); //获取library数据库中集合userinfo system.out.println("collection userinfo selected successfully"); dbcursor cursor = coll.find(); //查询集合userinfo中文档信息 int i=1; while (cursor.hasnext()) { //检索集合userinfo中所有文档信息 system.out.println("userinfo document: "+i); dbobject show = cursor.next(); system.out.println(show); @suppresswarnings("rawtypes") map show1 = show.tomap(); //将检索结果show(bson类型)转换为map类型 string toname = (string)show1.get("username"); //提取map中字段名为username的属性值 string topassword = (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++; } }catch(exception e){ system.err.println( e.getclass().getname() + ": " + e.getmessage() ); } if(login_test) { if ("save".equals(checkbox)) { //cookie存取时用urlencoder.encode进行编码(ps:读取时urldecoder.decode进行解码) string name1 = java.net.urlencoder.encode(username,"utf-8"); //创建两个cookie对象 cookie namecookie = new cookie("username", name1); //设置cookie的有效期为3天 namecookie.setmaxage(60 * 60 * 24 * 3); string pwd = java.net.urlencoder.encode(password,"utf-8"); cookie pwdcookie = new cookie("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); } %> </body> </html>
登录失败login_fail.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>登陆失败</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <link rel="stylesheet" type="text/css" href="css/login.css"> </head> <body> <div class="content"> <div class="panel1"> <h1>输入用户名和密码不正确,请重新登陆!!!</h1> </div> <div class="register"> <button onclick="window.location.href='login.jsp'">返回</button> </div> </div> </body> </html>
2.6.2用户注册
注册首页register.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>注册页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="description" content="this is my page"> <link rel="stylesheet" type="text/css" href="css/login.css"> <script language="javascript"> function check() { var tmp,str; str=document.myform.password1.value; tmp=document.myform.password2.value; if(str != tmp) alert("两次密码输入不一致,请重新确认密码!!!"); } </script> </head> <body> <div class="content"> <div class="head"> <h1>欢迎来到简单购物车系统注册页面</h1> </div> <!-- 注册面板 --> <div class="panel"> <form name="myform" action="register_action.jsp" method="post"> <!-- 账号和密码组 --> <div class="group"> <label></label> <input type="text" placeholder="请输入注册账号" name="username1"> </div> <div class="group"> <label></label> <input type="password" placeholder="请输入注册密码" name="password1"> </div> <div class="group"> <label></label> <input type="password" placeholder="请确认注册密码" name="password2"> </div> <!-- 注册按钮 --> <div class="login"> <button type="submit" name="register" onclick="check()">注册</button> <button type="reset" name="reset1">重置</button> </div> </form> <div class="register"> <button onclick="window.location.href='login.jsp'">返回</button> </div> </div> </div> </body> </html>
注册处理脚本register_action.jsp代码如下;
<%@ page language="java" import="java.util.*,com.mongodb.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; string text_change = "等待注册"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>my jsp 'register_action.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <meta http-equiv="description" content="this is my page"> </head> <body> <% response.setcontenttype("text/html;charset=utf-8"); //确保显示的汉字信息以正确编码方式显示 request.setcharacterencoding("utf-8"); //确保获取的汉字信息以正确编码方法获取 string username1=(string)request.getparameter("username1"); //获取页面用户名 string password1=(string)request.getparameter("password1");//获取注册页面密码1 string password2=(string)request.getparameter("password2");//获取注册页面密码2 if(!password1.equals(password2)){ //如果用户两次输入密码不一致,则跳转到注册原页面register.jsp,即实现未跳转效果 response.sendredirect("register.jsp"); } try{ // 连接到 mongodb 服务 mongoclient mongoclient = new mongoclient( "localhost" , 27017 ); //此处采用无用户名和密码验证方式登陆 @suppresswarnings("deprecation") db db = mongoclient.getdb( "library" ); //连接到数据库library dbcollection coll = db.getcollection("userinfo"); //获取library数据库中集合userinfo system.out.println("collection userinfo selected successfully"); dbobject user = new basicdbobject();//定义一个bson变量,用于存储注册的用户名和密码 user.put("username", username1); user.put("password", password1); coll.insert(user); //向集合userinfo中插入注册用户信息 response.sendredirect("register_success.jsp"); //注册成功后,自动跳转到注册成功提示页面 }catch(exception e){ system.err.println( e.getclass().getname() + ": " + e.getmessage() ); } %> </body> </html>
成功注册提示页面register_success.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>注册成功</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <link rel="stylesheet" type="text/css" href="css/login.css"> </head> <body> <div class="content"> <div class="panel1"> <h1>恭喜您,您已经成功注册简单购物车系统</h1> </div> <div class="register"> <button onclick="window.location.href='login.jsp'">返回</button> </div> </div> </body> </html>
2.6.3查看商品
首先看一下购物首页welcome.jsp页面代码:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>购物页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <frameset rows="30%,60%,10%" cols="*" frameborder="no" border="0" framespacing="0"> <frame src="header.jsp"> <frame src="main_shop.jsp"> <frame src="bottom.jsp"> </frameset> <body> </body> </html>
首页头部header.jsp页面代码:
<%@ page language="java" import="java.util.*" contenttype="text/html;charset=gb2312" pageencoding="gb2312"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html;charset=gb2312"> </head> <body topmargin="0" leftmargin="0" rightmargin="0" style="background-color: #f2f2f2;overflow-x:hidden;overflow-y:hidden"> <form action=""> <table width="100%" height="79" border="0" cellpadding="0" cellspacing="0" align=center> <tr> <td bgcolor="f9a859" valign="top"> <table width="100%" height="100" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#466baf"> <tr> <td align="center" style="font-size:60px;color: white;"> 简单购物车系统 </td> </tr> </table> </td> </tr> <tr> <td bgcolor="f9a859" valign="top"> <table width="100%" height="50" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#cc865e"> <tr> <td align="center" style="font-size:20px;color: white;"> 欢迎你访问!</td> </tr> </table> </td> </tr> </table> </form> </body> </html>
尾部bottom.jsp页面代码:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>my jsp 'bottom.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> </head> <body style="background-color: #f2f2f2;overflow-x:hidden;overflow-y:hidden"> <hr> <h4 style="width:100%;text-align:center">copyright @2016 舞动的心</h4> </body> </html>
首页中间主体main_shop.jsp页面代码;
<%@ page contenttype="text/html;charset=gbk" import="java.util.*,com.liuzhen.shop.mongodbbean" %> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; string cp=request.getparameter("cp");//cp为分页数 //int page_number = dbbean.gettotalpage(); //int currpage = page_number; int currpage=(cp==null||cp=="")?1:integer.parseint(cp); string[][] ss = mongodbbean.getgoodlist(currpage); int n = mongodbbean.getlength(ss); %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>购物页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <link rel="stylesheet" type="text/css" href="css/login.css"> </head> <body style="overflow-x:hidden;overflow-y:hidden"> <div class="content"> <div class="panel1"> <table border="1" align="center"> <tr> <th width="30%" align="center">物品编号</th> <th width="30%" align="center">物品名</th> <th width="30%" align="center">定价</th> <th width="50%" align="center">求购</th> </tr> <% for(int i=0;i<n;i++) { %> <tr> <td height="30%" align="center"><%= ss[i][0] %></td> <td height="30%" align="center"><%= ss[i][1] %></td> <td height="30%" align="center"><%= ss[i][2] %></td> <td height="30%" align="center"><a href="buy.jsp?sid=<%= ss[i][0] %>&action=buy">购买</a></td> </tr> <% } %> </table> <% int tp=mongodbbean.gettotalpage(); if(currpage!=1) { %> <a href="main_shop.jsp?cp=<%=currpage-1%>">上一页</a> <% } if(currpage!=tp) { %> <a href="main_shop.jsp?cp=<%=currpage+1%>">下一页</a> <% } %> <form action="main_shop.jsp" name="myform"> <select name="cp" onchange="document.myform.submit()"> <% for(int i=1;i<=tp;i++) { %> <option value="<%=i%>" <%= (i==currpage)?"selected":"" %>>第<%=i%>页</option> <% } %> </select> </form> </div> <div class="register"> <button onclick="window.location.href='cart.jsp'">查看购物车</button> </div> </div> </body> </html>
实现查看商品的功能,主要是通过调用mongodbbean.java类来实现,其具体代码如下:
package com.liuzhen.shop; import java.util.map; import java.util.vector; import com.mongodb.*; public class mongodbbean { static int span=5; //设定jsp页面表单单页显示物品信息行数为5行 //返回数据库中全部货物编号sid public static string[] getgood_sid(){ string[] good_sid_temporary = new string[100]; //定义一个长度为100的暂时存放货物编号的一维数组 // 连接到 mongodb 服务 mongoclient mongoclient = new mongoclient( "localhost" , 27017 ); //此处采用无用户名和密码验证方式登陆 @suppresswarnings("deprecation") db db = mongoclient.getdb( "library" ); //连接到数据库library dbcollection coll = db.getcollection("good"); //获取library数据库中集合good system.out.println("collection userinfo selected successfully"); dbcursor cursor = coll.find(); //查询集合good中文档信息 int i=0; while (cursor.hasnext()) { //检索集合good中所有文档信息 dbobject show = cursor.next(); @suppresswarnings("rawtypes") map show1 = show.tomap(); //将检索结果show(bson类型)转换为map类型 string tosid = (string)show1.get("sid"); //提取map中字段名为sid的属性值 good_sid_temporary[i] = tosid; //将数据库中查询的货物编号存储入数组good_sid i++; } string[] good_sid = new string[i]; //根据查询数据遍历集合中文档信息i值来确定最终返回数组长度 for(int j=0;j<i;j++){ good_sid[j] = good_sid_temporary[j]; } return good_sid; } //返回数据库中全部货物名称sname public static string[] getgood_sname(){ string[] good_sname_temporary = new string[100]; //定义一个长度为100的暂时存放货物名称的一维数组 // 连接到 mongodb 服务 mongoclient mongoclient = new mongoclient( "localhost" , 27017 ); //此处采用无用户名和密码验证方式登陆 @suppresswarnings("deprecation") db db = mongoclient.getdb( "library" ); //连接到数据库library dbcollection coll = db.getcollection("good"); //获取library数据库中集合good system.out.println("collection userinfo selected successfully"); dbcursor cursor = coll.find(); //查询集合good中文档信息 int i=0; while (cursor.hasnext()) { //检索集合good中所有文档信息 dbobject show = cursor.next(); @suppresswarnings("rawtypes") map show1 = show.tomap(); //将检索结果show(bson类型)转换为map类型 string tosname = (string)show1.get("sname"); //提取map中字段名为sname的属性值 good_sname_temporary[i] = tosname; //将数据库中查询的货物名称存储入数组good_sname i++; } string[] good_sname = new string[i]; //根据查询数据遍历集合中文档信息i值来确定最终返回数组长度 for(int j=0;j<i;j++){ good_sname[j] = good_sname_temporary[j]; } return good_sname; } //返回数据库中全部货物价格sprice public static string[] getgood_sprice(){ string[] good_sprice_temporary = new string[100]; //定义一个长度为100的暂时存放货物价格的一维数组 // 连接到 mongodb 服务 mongoclient mongoclient = new mongoclient( "localhost" , 27017 ); //此处采用无用户名和密码验证方式登陆 @suppresswarnings("deprecation") db db = mongoclient.getdb( "library" ); //连接到数据库library dbcollection coll = db.getcollection("good"); //获取library数据库中集合good system.out.println("collection userinfo selected successfully"); dbcursor cursor = coll.find(); //查询集合good中文档信息 int i=0; while (cursor.hasnext()) { //检索集合good中所有文档信息 dbobject show = cursor.next(); @suppresswarnings("rawtypes") map show1 = show.tomap(); //将检索结果show(bson类型)转换为map类型 string tosprice = (string)show1.get("sprice"); //提取map中字段名为sname的属性值 good_sprice_temporary[i] = tosprice; //将数组库中查询的货物价格存储入数组good_sprice i++; } string[] good_sprice = new string[i]; //根据查询数据遍历集合中文档信息i值来确定最终返回数组长度 for(int j=0;j<i;j++){ good_sprice[j] = good_sprice_temporary[j]; } return good_sprice; } //根据分页当前page数,从数据库中获取当前单个页面货物种类的具体信息,并以二维数据返回具体信息 public static string[][] getgoodlist(int page) { string[][] result=null; vector<string[]> v=new vector<string[]>(); //定义一个vector集合,一个记录存放一个货物的具体信息 string[] good_sid = getgood_sid(); //获取货物编号 string[] good_sname = getgood_sname(); //获取货物名称 string[] good_sprice = getgood_sprice(); //获取货物价格 int len = good_sid.length; for(int i=0;i<span;i++){ int t = (page-1)*span+i; //获取货物编号 if(t >= len){ //如果当前货物编号大于数据库中已有编号,则跳出循环 break; } string[] good_temp=new string[3]; //定义一个长度为3的数组,用于存放一个物品的编号、名称、价格信息 good_temp[0]=good_sid[t]; good_temp[1]=good_sname[t]; good_temp[2]=good_sprice[t]; v.add(good_temp); //将1个物品的信息存入vector集合中 } int size = v.size(); result=new string[size][]; //根据vercotr大小,给result指定行数大小 for(int j=0;j<size;j++) { //返回vector中一个值(其中即表示一个物品的sid,名称和价格),并赋值给result[j],即result二维数组一行表示一个物品具体信息 result[j]=(string[])v.elementat(j); } return result; } //根据货物sid,返回其价格信息 public static double getprice(string sid) { double price = 0; //定义返回物品的价格 string[] good_sprice = getgood_sprice(); //获取全部物品的价格 int i = integer.parseint(sid); //将string类型的物品编号sid转换为int型 string sprice = good_sprice[i]; //根据sid获取物品的价格 price = double.parsedouble(sprice); //将string类型的价格信息转换为double型,并赋值给price return price; } //根据货物sid,返回货物的名称和价格,一一个长度为2的数组返回 public static string[] getdetail(string sid) { string[] good_detail=null; good_detail = new string[2]; string[] good_sname = getgood_sname(); //获取全部物品名称 string[] good_sprice = getgood_sprice(); //获取全部物品价格 int i = integer.parseint(sid); //将string类型的物品编号sid转换为int型 good_detail[0] = good_sname[i]; //根据物品编号sid,得到名称存入数组good_detail中 good_detail[1] = good_sprice[i]; //根据物品编号sid,得到物品价格存入数组good_detail中 return good_detail; } //通过查询数据库中货物种类数目,以5行为一页,返回现有货物页数 public static int gettotalpage() { int page = 0; string[] good_sid = getgood_sid(); int len = good_sid.length; page = len/span+((len%span==0)?0:1); //以span(span值为5)行为一页,计算货物具有的页数page return page; } //返回一个二维数组的行数大小 public static int getlength(string[][] a){ return a.length; } public static void main(string args[]){ // string[] good_sid = getgood_sid(); //定义一个存放货物编号的一维数组 // string[] good_sname = getgood_sname(); //定义一个存放货物名称的一维数组 // string[] good_sprice = getgood_sprice(); //定义一个存放货物价格的一维数组 // // for(int j=0;j<10;j++){ // system.out.println("货物sid:"+good_sid[j]); // system.out.println("货物sname:"+good_sname[j]); // system.out.println("货物是price:"+good_sprice[j]); // system.out.println("**************************"); // system.out.println(); // } system.out.println("分页数目(测试):"+mongodbbean.gettotalpage()); string[][] ss=mongodbbean.getgoodlist(mongodbbean.gettotalpage()); for(int i=0;i<ss.length;i++) { system.out.println(ss[i][0]); system.out.println(ss[i][1]); system.out.println(ss[i][2]); system.out.println("***********"); } int n = ss.length; system.out.println("数组长度为:"+n); } }
2.6.4购买商品
实现购买商品,通过buy.jsp业务处理脚本调用shopcartbean.java类来实现。
shopcartbean.java类代码如下:
package com.liuzhen.shop; import java.util.hashmap; import java.util.iterator; import java.util.set; public class shopcartbean { //shopcartbean类构造函数 public shopcartbean(){ } //定义一个存储整形数值的键值对hashmap hashmap<string, integer> hm=new hashmap<string, integer>(); //定义购物车总物品总价格,初始值为0 double total=0; //添加购买的物品,存入哈希表hm中,并计算购买成功后的总价格 public void add(string sid) { if(hm.containskey(sid)) { //如果hm中包含键值对sid,则获取该键值对中的值,并加1 int xc=((integer)hm.get(sid)).intvalue()+1; //把上面获取的xc值存入hm中 hm.put(sid,new integer(xc));; } else { //如果hm中不包含键值对sid,则将该键值对存入hm中,并该键值对值为1 hm.put(sid,new integer(1)); } total=total+mongodbbean.getprice(sid); //购买物品后,计算物品总价格 } //获取购物车当前物品总价格 public double gettotal() { return total; } //根据物品编号sid,设定购买物品数目,并将购买数目存入哈希表hm中,并更新当前购物车物品总价格 public void setcount(int c,string sid) { int yc=((integer)hm.get(sid)).intvalue(); total=total+(c-yc)*mongodbbean.getprice(sid); hm.put(sid,new integer(c)); } //根据物品编号sid,从购物车中删除物品,并删除存入哈希表hm中物品的数目,以及当前购物车物品总价格 public void deletefromcart(string sid) { int yc=((integer)hm.get(sid)).intvalue(); total=total-yc*mongodbbean.getprice(sid); hm.remove(sid); } //判断当前哈希表hm是否为空 public boolean isempty() { return hm.isempty(); } //返回用户购买物品的详细信息(物品编号、物品名称、物品价格、物品购买数量) public string[][] getcart() { //定义一个set集合,存放哈希表hm中键值对的键名称 set<string> ks=hm.keyset(); //定义一个迭代器,用于遍历set集合 iterator<string> ii=ks.iterator(); //获取哈希表hm中键值对的个数 int size=hm.size(); //定义二维数组,存放购买物品的信息 string rs[][]=new string[size][]; for(int i=0;i<size;i++) { string sid=(string)ii.next(); //存放键值对的键名,即货物的编号sid string[] sa=new string[4]; sa[0]=sid; //获取购买货物sid string[] sat=mongodbbean.getdetail(sid); //根据货物sid,获取购买货物的名称和价格 sa[1]=sat[0]; //获取购买货物名称 sa[2]=sat[1]; //获取购买货物价格 sa[3]=((integer)hm.get(sid)).tostring(); //获取购买货物数量 rs[i]=sa; //将上述单个物品详细存入二维数组rs中 } return rs; } }
buy.jps购物处理脚本代码如下:
<%@ page language="java" import="java.util.*" contenttype="text/html;charset=utf-8" pageencoding="gb2312"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <jsp:usebean id="cart" scope="session" class="com.liuzhen.shop.shopcartbean"/> <% string action=request.getparameter("action"); if(action==null) { %> <jsp:forward page="main_shop.jsp"/> <% } else if(action.trim().equals("buy")) { string sid=request.getparameter("sid"); cart.add(sid.trim()); %> <jsp:forward page="main_shop.jsp"/> <% } else if(action.trim().equals("gc")) { string sid=request.getparameter("sid"); string count=request.getparameter("count"); cart.setcount(integer.parseint(count),sid); %> <jsp:forward page="cart.jsp"/> <% } else if(action.trim().equals("del")) { string sid=request.getparameter("sid"); cart.deletefromcart(sid); %> <jsp:forward page="cart.jsp"/> <% } %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> </body> </html>
2.6.5购物车
购物车功能,主要是用过cart.jsp页面调用shopcartbean.java类来实现,shopcartbean.java类代码在上面已给出,下面请看cart.jsp购物车页面代码:
<%@ page language="java" import="java.util.*" contenttype="text/html;charset=gb2312" import="com.liuzhen.shop.mongodbbean" pageencoding="gb2312"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/"; %> <jsp:usebean id="cart" scope="session" class="com.liuzhen.shop.shopcartbean"/> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <base href="<%=basepath%>"> <title>购物车</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html;charset=gb2312"> <link rel="stylesheet" type="text/css" href="css/login.css"> </head> <body> <div class="content"> <div class="panel1"> <% if(cart.isempty()) { %> <font color="red" size="20">购物车中没有任何商品!!!</font> <% } else { %> <h2>购物车</h2> <table border="1"> <tr> <td width="27%" align="center">物品编号</td> <td width="27%" align="center">物品名</td> <td width="27%" align="center">定价</td> <td width="27%" align="center">数量</td> <td width="27%" align="center">求购</td> </tr> <% string[][] ssa=cart.getcart(); for(int i=0;i<ssa.length;i++) { %> <tr> <td height="30%" align="center"><%= ssa[i][0] %></td> <td height="30%" align="center"><%= ssa[i][1] %></td> <td height="30%" align="center"><%= ssa[i][2] %></td> <td> <form action="buy.jsp" method="post"> <input type="text" name="count" value="<%= ssa[i][3] %>"> <input type="hidden" name="sid" value="<%= ssa[i][0] %>"> <input type="hidden" name="action" value="gc"> </form> </td> <td><a href="buy.jsp?sid=<%= ssa[i][0] %>&action=del">删除</a></td> </tr> <% } %> </table> <br> <br> 本订单总价为:<%= math.round(cart.gettotal()*100)/100.0%> <% } %> <br> <div class="register"> <button onclick="window.location.href='main_shop.jsp'">继续购物</button> </div> </div> </div> </body> </html>
附:源码下载:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: div+css在思路和流程上实现结构与表现的分离分析
下一篇: 简单实现jsp分页