南阳理工学院课程设计课程设计名称:课程设计专业班级:数据库一班****:***学号:**********指导教师:网络购物车一:需求分析利用html、jsp、java、servlet、数据库等知识点,结合相关设计模式、以及软件工程的相关知识,设计一个网站购物车,用于记录不同客户的购物订单,并能对购物车中商品信息进行查询、修改、删除、清空、下载等操作,商品信息存储在数据库中。
具体要实现的功能如下:1:显示商品展示界面、操作成功界面、购物车展示界面等界面。
2:商品信息存储在数据库中。
3:对商品信息能够进行查询、修改、删除、清空、下载等操作。
4:使用MVC设计模式(View(jsp)、Model(javaBean)、Controller(servlet))。
5:在浏览器中输入访问信息进行访问。
6:购物车信息分页显示。
二:概要设计本次课程设计中使用了MVC设计模式,jsp作为View,javaBean作为Model,servlet作为controller,实现界面与逻辑的分离,模块之间松耦合,通过传递参数进行调用。
Jsp页面通过发送一个操作类型变量,从而使得controller获知应当进行的操作,并通过调用javabean进行实际的执行,这样页面与逻辑就得到了分离,互不干涉和影响。
使用数据库存储购物信息,在数据库中对商品信息进行增、删、改、查等操作,此外控制器通过调用writeexcel类,在每次查看信息之前把当前的商品信息写入到xls文件中进行保存,并供用户下载。
具体的设计模块及系统流程如下图所示:三:运行环境、开发语言运行环境:Windows XP 浏览器 开发语言:html 、jsp 、java四:详细设计1:程序清单Java 课程设计网络购物车文件功能对应表2:主要代码1:显示商品信息界面用jsp 来显示主界面<%@page contentType="text/html;charset=gb2312"%> <html> <head><title>登录主页面</title> </head> <body> <br><h1 align="center">欢迎光临百味书屋!</h1><br><br><br></p><p align="center"><table width="80%" align=center>//用表格来排列显示信息<tr><td><form method="post" action="controloperate?operatetype=add&booknum=0001"><image src="./image/11.jpg" align=left>书名:货币战争<br>书号:0001<br>作者:王一<br>价格:23<br><input type="submit" value="购买"><br></image></form></td><td><form method="post" action="controloperate?operatetype=add&booknum=0002"><image src="./image/12.jpg" align=left>书名:我的抗战<br>书号:0002<br>作者:王二<br>价格:33<br><input type="submit" value="购买"><br></image></form></td><td><form method="post" action="controloperate?operatetype=add&booknum=0003"><image src="./image/13.jpg" align=left>书名:你猫叔了没<br>书号:0003<br>作者:王三<br>价格:43<br><input type="submit" value="购买"><br></image></form></td></tr><tr><td><form method="post" action="controloperate?operatetype=add&booknum=0004"><image src="./image/21.jpg" align=left>书名:赞美你<br>书号:0004<br>作者:王四<br>价格:53<br><input type="submit" value="购买"><br></image></form></td><td><form method="post" action="controloperate?operatetype=add&booknum=0005"><image src="./image/22.jpg" align=left>书名:刀尖<br>书号:0005<br>作者:王五<br>价格:63<br><input type="submit" value="购买"><br></image></form></td><td><form method="post" action="controloperate?operatetype=add&booknum=0006"><image src="./image/23.jpg" align=left>书名:人脉是设计出来的<br>书号:0006<br>作者:王六<br>价格:73<br><input type="submit" value="购买"><br></image></form></td></tr><tr><td><form method="post" action="controloperate?operatetype=add&booknum=0007"><image src="./image/31.jpg" align=left>书名:龙年运程<br>书号:0007<br>作者:王七<br>价格:83<br><input type="submit" value="购买"><br></image></form></td><td><form method="post" action="controloperate?operatetype=add&booknum=0008"><image src="./image/32.jpg"align=left>书名:最好的时光在路上<br>书号:0008<br>作者:王八<br>价格:93<br><input type="submit" value="购买"><br></image></form></td><td><form method="post" action="controloperate?operatetype=add&booknum=0009"><image src="./image/33.jpg" align=left>书名:七日谈<br>书号:0009<br>作者:王九<br>价格:103<br><input type="submit" value="购买"><br></image></form></td></tr></table><br><br><br><h1 align="center"><form method="post" action="controloperate?operatetype=scan"><input type="submit" value="查看购物车"></form></h1></p></body></html>2:显示购物车信息界面用jsp分页显示购物车中的商品信息<%@page import="java.sql.*" import="java.util.*" contentType="text/html;charset=gb2312"%><html><head><title>购物车界面</title></head><body><br><br><h2 align="center">您的购物车列表:</h2><br><br><br><%request.setCharacterEncoding("gb2312");ArrayList[] rs;rs=(ArrayList[])session.getAttribute("rs");//获取从数据库的查询结果集int onepagecount=3;int totalcount=0;int pagecount=0;if(rs[0]!=null){totalcount=rs.length;//获取分页显示需要的相关变量if(totalcount%onepagecount==0){pagecount=totalcount/onepagecount;}else{pagecount=totalcount/onepagecount+1;}if(request.getParameter("nowpage")!=null)//如果不是第一次登录查询界面的处理{request.setCharacterEncoding("gb2312");int nowpage=Integer.parseInt(request.getParameter("nowpage"));//rs.absolute(nowpage*onepagecount+1);%><h2 align="center"><table align="center"><tr><td>书名</td><td></td><td>书号</td><td></td><td>作者</td><td></td><td>价格</td><td></td><td>数量</td></tr><%if((nowpage+1)*onepagecount>=totalcount)//当前页面为最后一页{for(int i=0;i<(totalcount-nowpage*onepagecount);i++){%><tr><td><%=rs[nowpage*onepagecount+i].get(0)%></td><td></td><td><%=rs[nowpage*onepa gecount+i].get(1)%></td><td></td><td><%=rs[nowpage*onepagecount+i].get(2)%></td><td></td><td><%=rs[nowpage* onepagecount+i].get(3)%></td><td></td><td><%=rs[nowpage*onepagecount+i].get(4)%></td><td></td><td><form method="post" action="alter.jsp?booknum=<%=rs[nowpage*onepagecount+i].get(1)%>"><input type="submit" value="修改"></form></td><td></td><td><form method="post" action="controloperate?operatetype=delete&booknum=<%=rs[nowpage*onepagecount+i].get(1) %>"><input type="submit" value="删除"></form></td><td></td></tr><%}%></table><br></h2><h2 align="center"><form method="post" action="controloperate?operatetype=deleteall"><input type="submit" value="清空购物车"></form><br><h2 align="center"><a href="shoppingcarmessage.xls">下载购物信息</a><br><a href="default.jsp">返回主页</a><br><br></h2><h3 align="right"><a href="shoppingcarplay.jsp?nowpage=<%=nowpage-1%>">上一页</a>  第<%=nowpage+1%>页  共<%=pagecount%>页</h3><%}Else//不是最后一页{for(int i=0;i<onepagecount;i++){%><tr><td><%=rs[nowpage*onepagecount+i].get(0)%></td><td></td><td><%=rs[nowpage*onepa gecount+i].get(1)%></td><td></td><td><%=rs[nowpage*onepagecount+i].get(2)%></td><td></td><td><%=rs[nowpage* onepagecount+i].get(3)%></td><td></td><td><%=rs[nowpage*onepagecount+i].get(4)%></td><td></td><td><form method="post" action="alter.jsp?booknum=<%=rs[nowpage*onepagecount+i].get(1)%>"><input type="submit" value="修改"></form></td><td></td><td><form method="post" action="controloperate?operatetype=delete&booknum=<%=rs[nowpage*onepagecount+i].get(1) %>"><input type="submit" value="删除"></form></td><td></td></tr><%//rs.next();}if((nowpage-1)==-1)//第一页{%></table><br></h2><h2 align="center"><form method="post" action="controloperate?operatetype=deleteall"><input type="submit" value="清空购物车"></form><br><h2 align="center"><a href="shoppingcarmessage.xls">下载购物信息</a><br><a href="default.jsp">返回主页</a><br><br></h2><h3 align="right"><a href="shoppingcarplay.jsp?nowpage=<%=nowpage+1%>">下一页</a>  第<%=nowpage+1%>页  共<%=pagecount%>页</h3><%}if((nowpage+1)==pagecount){ //最后一页{%></table><br></h2><h2 align="center"><form method="post" action="controloperate?operatetype=deleteall"><input type="submit" value="清空购物车"></form><br><h2 align="center"><a href="shoppingcarmessage.xls">下载购物信息</a><br><a href="default.jsp">返回主页</a><br><br></h2><h3 align="right"><a href="shoppingcarplay.jsp?nowpage=<%=nowpage-1%>">上一页</a>  第<%=nowpage+1%>页  共<%=pagecount%>页</h3><%}if(((nowpage-1)!=-1)&&((nowpage+1)!=pagecount))//中间页面{%></table><br></h2><h2 align="center"><form method="post" action="controloperate?operatetype=deleteall"><input type="submit" value="清空购物车"></form><br><h2 align="center"><a href="shoppingcarmessage.xls">下载购物信息</a><br><a href="default.jsp">返回主页</a><br><br></h2><h3 align="right"><a href="shoppingcarplay.jsp?nowpage=<%=nowpage-1%>">上一页</a>  <a href="shoppingcarplay.jsp?nowpage=<%=nowpage+1%>">下一页</a>  第<%=nowpage+1%>页  共<%=pagecount%>页</h3><%}}}Else//第一次登录查询页面{%><h2 align="center"><table align="center"><tr><td>书名</td><td></td><td>书号</td><td></td><td>作者</td><td></td><td>价格</td><td></td><td>数量</td></tr><%if(totalcount<=3)//总页面=1{for(int i=0;i<totalcount;i++){%><tr><td><%=rs[i].get(0)%></td><td></td><td><%=rs[i].get(1)%></td><td></td><td><%=rs[i].get(2)%></td><td></td><td><%=rs[i].get(3)%></td><td></td><td><%=rs[i].get(4)%></td><td></td><td><form method="post" action="alter.jsp?booknum=<%=rs[i].get(1)%>"><input type="submit" value="修改"></form></td><td></td><td><form method="post" action="controloperate?operatetype=delete&booknum=<%=rs[i].get(1)%>"><input type="submit" value="删除"></form></td><td></td></tr><%//rs.next();}%></table><br></h2><h2 align="center"><form method="post" action="controloperate?operatetype=deleteall"><input type="submit" value="清空购物车"></form><br><h2 align="center"><a href="shoppingcarmessage.xls">下载购物信息</a><br><a href="default.jsp">返回主页</a></h2><%}Else//总页面>1{for(int i=0;i<onepagecount;i++){%><tr><td><%=rs[i].get(0)%></td><td></td><td><%=rs[i].get(1)%></td><td></td><td><%=rs[i].get(2)%></td><td></td><td><%=rs[i].get(3)%></td><td></td><td><%=rs[i].get(4)%></td><td></td><td><form method="post" action="alter.jsp?booknum=<%=rs[i].get(1)%>"><input type="submit" value="修改"></form></td><td></td><td><form method="post" action="operate?operatetype=delete&booknum=<%=rs[i].get(1)%>"><input type="submit" value="删除"></form></td><td></td></tr><%}%></table><br></h2><h2 align="center"><form method="post" action="controloperate?operatetype=deleteall"><input type="submit" value="清空购物车"></form><br><h2 align="center"><a href="shoppingcarmessage.xls">下载购物信息</a><br><a href="default.jsp">返回主页</a><br><br></h2><h3 align="right"><a href="shoppingcarplay.jsp?nowpage=1">下一页</a>  第一页  共<%=pagecount%>页</h3><%}}}Else//结果集为空{%><br><br><h2 align="center">您的购物车是空的!</h2><br><br><br><br><h2 align="center"><a href="default.jsp">返回主页</a></h2><%}%></body></html>3:显示修改商品界面用jsp显示修改商品信息的界面<%@page contentType="text/html;charset=gb2312"%><html><head><title>修改购物车界面</title></head><body><br><br><br><br><br><br><br><%request.setCharacterEncoding("gb2312");String booknum=(String)request.getParameter("booknum");%><h2 align="center">//用form来提交修改的变量及书号<form action="controloperate?operatetype=alter&booknum=<%=booknum%>" method="post">您要订购的数量:<input type="text" name="count"><input type="submit" value="提交"></h2><%%></body></html>4:显示成功添加商品用jsp显示成功添加操作<%@page contentType="text/html;charset=gb2312"%><html><head><title>添加成功界面</title></head><body><br><br><h3 align="center">已成功加入购物车!</h3><br><br><br><br><br><h1 align="center"><a href="default.jsp">返回主页</a></h1></body></html>5:显示成功更新商品用jsp显示成功更新操作<%@page contentType="text/html;charset=gb2312"%><html><head><title>更新成功界面</title></head><body><br><br><h3 align="center">已成功更新您的购物车!</h3><br><br><br><br><br><h1 align="center"><form method="post" action="controloperate?operatetype=scan"><input type="submit" value="返回购物车"></form></h1></body></html>6:控制进行各种操作功能用java servlet实现控制器控制进行各种操作以及决定返回何种界面package shoppingcar;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.sql.*;public class controloperate extends HttpServlet{//重写dopost方法对jsp请求进行处理public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{request.setCharacterEncoding("gb2312");//获取相关变量String operatetype=(String)request.getParameter("operatetype");shoppingcar.operate ope=new shoppingcar.operate();shoppingcar.writeexcel we=new shoppingcar.writeexcel();HttpSession session = request.getSession();if(operatetype.equals("add"))//添加操作的处理{request.setCharacterEncoding("gb2312");String booknum= (String)request.getParameter("booknum");String ip=(String)request.getRemoteAddr();ope.addbook(booknum,ip);response.sendRedirect("addsuccess.jsp");}if(operatetype.equals("scan"))//查询操作的处理{ArrayList[] rs=ope.getbook();session.setAttribute("rs",rs);if(rs[0]!=null){we.write(rs);}response.sendRedirect("shoppingcarplay.jsp");}if(operatetype.equals("alter"))//修改操作的处理{request.setCharacterEncoding("gb2312");String booknum= (String)request.getParameter("booknum");String count=(String)request.getParameter("count");ope.updatebook(booknum,count);response.sendRedirect("updatesuccess.jsp");}if(operatetype.equals("delete"))//删除操作的处理{request.setCharacterEncoding("gb2312");String booknum= (String)request.getParameter("booknum");ope.deletebook(booknum);response.sendRedirect("updatesuccess.jsp");}if(operatetype.equals("deleteall"))//清空购物车操作的处理{request.setCharacterEncoding("gb2312");ope.deleteallbook();response.sendRedirect("updatesuccess.jsp");}}}7:对数据库进行操作功能用javabean通过多个函数实现对数据库的多种操作package shoppingcar;import java.sql.*;import java.util.*;public class operate{ArrayList[] a;public void addbook(String booknum,String ip)//对数据库进行添加记录操作{try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //连接数据库Connection conn = DriverManager.getConnection("jdbc:odbc:shoppingcar","sa","111111");Statement stmt = conn.createStatement();String sql1="select * from 购物车where 书号='"+booknum+"' and ip地址='"+ip+"'";ResultSet rs=stmt.executeQuery(sql1);String sql2="insert into 购物车(ip地址,书号,数量) values('"+ip+"','"+booknum+"',1)";if(!rs.next())//当前不存在该条记录直接插入{stmt.executeUpdate(sql2);}Else//否则进行更新操作{int newcount=rs.getInt("数量");newcount+=1;String sql3="update 购物车set 数量="+newcount+" where 书号='"+booknum+"' and ip地址='"+ip+"'";stmt.executeUpdate(sql3);}stmt.close();conn.close();}catch(Exception e){}}public void get(){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection conn1 = DriverManager.getConnection("jdbc:odbc:shoppingcar","sa","111111");Statement stmt1 = conn1.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//创建支持游标滚动的statementString sql="select 书名, 书籍.书号, 作者, 价格, 数量from 书籍, 购物车where 书籍.书号=购物车.书号";//获取结果的sql语句ResultSet rs=stmt1.executeQuery(sql);if(rs.next()){st();Integer rows = rs.getRow();rs.beforeFirst();this.a=new ArrayList[rows];int l =0;while (rs.next()) //将结果集转换为数组对象{this.a[l] = new ArrayList();this.a[l].add(0,rs.getString(1));this.a[l].add(1,rs.getString(2));this.a[l].add(2,rs.getString(3));this.a[l].add(3,rs.getString(4));this.a[l].add(4,rs.getInt(5));l++;//System.out.println("success5");//判断该语句是否执行成功}}else{this.a=new ArrayList[100];}stmt1.close();conn1.close();}catch(Exception e){}}public ArrayList[] getbook(){get();return this.a;//返回数组对象}public void updatebook(String booknum,String count)//对数据库执行修改操作作{try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection conn1 = DriverManager.getConnection("jdbc:odbc:shoppingcar","sa","111111");Statement stmt1 = conn1.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//创建支持游标滚动的statementint bookcount=Integer.parseInt(count);if(bookcount<=0){deletebook(booknum);}else{String sql="update 购物车set 数量="+bookcount+" where 书号='"+booknum+"'";stmt1.executeUpdate(sql);stmt1.close();conn1.close();}}catch(Exception e){}}public void deletebook(String booknum)//对数据库执行删除操作{try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection conn1 = DriverManager.getConnection("jdbc:odbc:shoppingcar","sa","111111");Statement stmt1 = conn1.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//创建支持游标滚动的statementString sql="delete 购物车where 书号='"+booknum+"'";stmt1.executeUpdate(sql);stmt1.close();conn1.close();}catch(Exception e){}}public void deleteallbook()//清空购物车{try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection conn1 = DriverManager.getConnection("jdbc:odbc:shoppingcar","sa","111111");Statement stmt1 = conn1.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//创建支持游标滚动的statementString sql="truncate table 购物车";stmt1.executeUpdate(sql);stmt1.close();conn1.close();}catch(Exception e){}}}8:生成excel信息文件用java application引入poi包后,生成exceel文件,生成表格,循环添加行数据,最终生成购物车信息。