1、摘 要JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文描述了JAVA和JSP技术的特点以及在互联网上的使用情况,介绍这两种技术的重要编程方法和两者之关的联系,并完毕一个基于这种技术的网上书店系统。【关键字】JAVA, JavaBeans, Servlet, JSP, 网络编程, 电子商务, 网上书店 目 录前 言3第1章 概 述41.1 JSP简介和运营原理41.2 开发背景5第2章 需求分析62.1 系统组成:62.2 系统规定配置6第3章 系统设计73.1 数据库设计73.1.1 数据库需求分析73.1.2 数据库逻辑结构设计10第4章 具体设计1
2、24.1 系统概述12411用户界面部分12412 管理界面部分124.2 具体代码及说明124.2.1实现bookshop.run包124.2.2客户界面设计与实现20第5章 系统测试275.1 数据库连接275.2 检测网站运营速度27第6章 总结30参考文献31致 谢32前 言随着计算机、 网络 、通信技术的发展和日益融合,以及Internet的普及应用,涉及电子商务(EC)、视频会议、网上书店等在内的一些应用已开始引起社会的关注,并逐步走进人们的平常生活。JSP是Sun公司推出的一种网站开发技术,Sun公司借助自己在Java上的不凡造诣,又把人们引进JSP时代,JSP即Java Ser
3、ver Page,它可以在Servlet和JavaBean的支持下,完毕功能强大的Web应用程序。所以,在我的毕业设计中,我采用了JSP作为开发工具,构建了一个能实现简朴的电子商务的小型动态商务网站网上书店销售系统。通过这次的毕业设计,我了解了目前流行的动态商务网站的构成和运作原理,掌握了用JSP构建动态网站的相关知识和技术原理,锻炼了自己的动手实践能力。在这次毕业设计过程中,我得到了指导老师杜雪平老师的悉心指导。在此,我对你表达衷心的感谢!第1章 概 述1-1 JAVA语言简介Java是一种简朴易用、完全面向对象、具有平台无关性且安全可靠的重要面向Internet的开发工具。自从1995年正
4、式问世以来,Java的快速发展已经让整个Web世界发生了翻天覆地的变化。在初期,Java比较多的用在浏览器上,插入到网页中(即是Java Applet程序),成为最灵活、最强大的网页多媒体的载体,但由于Java虚拟机相对于个人电脑而言,有占用资源大,安全性相对较差等缺陷,Applet逐渐的被后起之秀Flash所替代,但随着Java Servlet的推出,Java在电子商务方面开始崭露头角,最新的JSP(Java Server Page)技术的推出,更是让Java成为基于Web的应用程序的首选开发工具,目前的Java技术已成为所有大型电子商务项目的必然选择。1-2 开发背景我国的网上书店虽然从数
5、量上取得了一定的进展,但从售量而言却不尽人意,目前,国内尚无一家在网上零售领域形成绝对领先优势的网上书店。发展比较好的寥寥无几,比较成功的有当当书店()。随着着电子商务技术的不断成熟,电子商务的功能也越来越强大,注册用户可以在网上搜索购买到自己想要的各种商品,初步让人们体会到了足不出户,便可随意购物的快感。我的毕业设计也就正是一个电子商务系统的开发-网上商品销售系统。第2章 JAVA技术简介2-1 在Windows平台下配置JSP运营环境为了使系统可以正常运营JSP和相关程序,必须先配置好可以使用JSP的WEB服务器。各种能使用Servlet技术的WEB服务器中,运用得最多的是Tomcat服务
6、器,假如仅是为了用于测试程序,Tomcat的配置则显得太复杂了,本文推荐使用Resin服务器,Resin据称是最快的Servlet运营平台,但是限于单站点,对传统的一些网关支持不是很好,因此对于商业网站而言,不是最佳的选择,但是假如仅是为了测试Servlet,这个Resin的安装可谓有点傻瓜化。Resin比较新的版本是3.x,但目前实际用的2.x版本的比较多,Resin可到官方站点下载:,文献位置:假如你的电脑上已装好JDK,直接把下载的resin包解压到D:盘根目录解压后即D:resin-2.1.13为服务器的目录,把本文的源程序jspweb文献夹也放在D:盘根目录,即是D:jspweb为网
7、站根目录,打开D:resin-2.1.13conf resin.conf(是一份XML形式的配置文献),找到doc这里改为D:jspweb,然后运营D:resin-2.1.13binhttpd.exe,在浏览器输入http:/localhost:8080/j1.jsp,看到了“我是JSP!”的字样了吧,你的Servlet服务器就这样配置成功了,为了能编译Servlet类,还需要做的事情是:把D:resin-2.1.13lib加入到windows的CLASSPATH的环境变量中。2-2 JSP、ASP和PHP技术之比较JSP与ASP、PHP技术都是目前网上最流行的在服务器端运营的脚本技术,JSP
8、能用JavaBeans技术封装,达成商业逻辑的目的,ASP相应之的是COM组件,因此两者都能用于开发商业逻辑,PHP则更像于一个纯脚本,仅适合于普通的网站开发,而不能用作商业逻辑而被冠以“Person Home Page”的名称,这是最贴切但是的了。JSP与ASP相比,JSP具有跨平台、安全、强大的可伸缩性的特点,而果硬要挑一些毛病,JSP相对别的脚本更加难掌握,由于精通JSP必须精通Java语言,对于中小型项目,我们要考虑开发人员、开发速度、开发成本等问题,在这方面ASP和PHP会比JSP更容易胜出。值得一提的是,ASP的最新版本ASP.NET与本来的ASP性质完全是不同的,它和JSP同样,
9、都是一种编译性的脚本,自身完全与强大的Net框架结合,完美的支持Xml的各种应用,与昔日的ASP不可同日而语,但是无论是ASP还是ASP.NET,它都摆脱不了Windows平台自身,这是ASP一个致命的缺陷。2-3 JSP语法基础2-3-1嵌入了JAVA语言的HTML文献把下面网页保存为:j1.jsp这就成了一个最简朴的JSP页面了,其中是声明输出的文献类型为text/html,字符编码是gb2312,在JSP中里的内容表达的是JSP编译时的一些选项或向客户端发送的头信息的JSP指令,里的内容就是Java语言,假如有必要,更改适当设定,还可以使用javascript作为脚本,但是实际应用中很少
10、有人这样做。2-3-2 request、out & response-与访问者的交互接受客户端的请求和向客户端返回信息是动态网页最常做的事情,在JSP中,重要通过request、response、out 三大对象实现这些功能。request 对象的作用是接受用户通过URL或通过表单向发服务器发送请求信息和与用户计算机相关的一些信息。response 对象用于网页传回用户端的回应。out 用于传送回应的输出,即向客户端返回信息。 把上面的例子稍作修改:保存为j2.jsp在浏览器上输入:“http:/localhost:8080/j1.jps?msg=我是JSP”看一下效果,这和j1.jsp的结果
11、同样吧?但它输出的是客户端返回的信息,这在意义上完全不同于前者。2-3-3 session-保持访问者的会话状态会话状态维持是 Web 应用开发者必须面对的问题。有多种方法可以用来解决这个问题,如使用 Cookies 、隐藏的表单输入域,或直接将状态信息附加到 URL 中。Java Servlet 提供了一个在多个请求之间连续有效的会话对象,该对象允许用户存储和提取会话状态信息,JSP也内置了这个对象。Session最基本的用法是:创建一个会话 session.putValue(名称,值);获得一个会话的值session.getValue(名称);2-3-4 JSP其它基本内置对象JSP有九大
12、内置对象,除了上述四种以外,还涉及:pageContext 网页的属性是在这里管理 application Servlet正在执行的内容 config Servlet的构架部件 page JSP网页自身 exception 针对错误网页,未捕获的例外这些基本的内置对象是构成JSP页面的重要因子。第3章 系统设计本系统采用三层架构设计,它的工作原理如图3-1所示。图3-1三层架构模型采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求解决之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。3.1数据库设计数据库在一个信息管理系统中占有非常
13、重要的地位,数据库结构设计的好坏将直接相应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。3.1.1 数据库需求分析针对一般在线书店的需求,得出如下需求信息。 用户分为游客和已注册用户。 订单分为单张具体订单和总订单。 一个用户可以购买多本图书。 一个用户相应一张订单。 一个列表相应多张订单。针对本系统功能分析,总结出如下的需求信息。 用户,涉及数据项:用户ID、用户名、密码。 图书,涉及数据项:图书编号、图书名、价格、图书介绍。 订单列表,涉及数据项:订单编号、图书编号、购书数量。 订单,涉及数据项:订单编号、用户编号、下单时间。从本系
14、统中规划出的实体有:用户实体、图书实体、订单实体、订单列表实体。订购用户订单列表订单图书实体之间关系的E-R图如图3-5所示。1 1NN 图3-5实体关系E-R图用户信息实体的E-R图如图3-6所示。图书实体的E-R图如图3-7所示。订单实体的E-R图如图3-8所示。订单列表实体的E-R图如图3-9所示。图书图书编号图书名称分类编号封面图3-6 图书实体E-R图用户用户名密码用户编号E-mail 图3-7 用户实体E-R图订单订单编号用户编号图书编号订购数量图3-8 订单实体E-R图订单列表订单号用户编号图书编号是否付款 图3-9 订单列表实体E-R图3.1.2 数据库逻辑结构设计 在线书店数
15、据库中各个表的设计结果如下面的标和所示。表3.1为图书信息列表book。表3.1图书信息表book字段名数据类型长度允许空说明IDint4自动编号,主键booknameint4书名bookclassvarchar255图书类别authorvarchar100yes图书作者publishfloat8yes出版社bookNovarchar100yes书号Contenttext16yes内容介绍pricetinyint1yes价格Amountint4yes总数量Leav_numberint4yes库存量pictureint4yes封面reg_timedatetime8yes入库时间表3.2为用户信息
16、列表shop_user。表3.2用户信息表shop_user字段名数据类型长度允许空说明IDint4自动编号,会员编号usernamevarchar4no用户名passwordvarchar100no密码Namesint4yes会员级别Sexvarchar50yes名字Addrvarchar50yes地址Phonevarchar25yes电话Postvarchar25yes邮编Emailvarchar25yes邮箱Retimedatetime8yes注册时间RegIpAddrvarchar20yes注册ip表3.3为订单表,记录订单信息orders。表3.3订单信息表orders字段名数据类型
17、长度允许空说明IDint4yes自动编号,订单编号order_idint4yes会员编号user_idint4yes图书编号quantityint4yes订购数量submit_timedatetime8yes提交订单时间consignmentTimedatetime8yes交货时间totalpricefloat8yes总价contentvarchar20yes备注ipAddrvarchar20yes用户ipisPayoffint11yes是否付款isSaleint11yes是否发货表3.4为订单列表,记录订单列表信息allorder。表3.4 订单列表allorder 字段名数据类型长度允许空
18、说明IDint4自动编号,卡类型编号orderIDint11yes订单号BookNoint11yes书号Amountint11yes数量表3.5书店管理员信息表,记录管理员信息bookadmin。表3.5 管理员信息表bookadmin字段名数据类型长度允许空说明AdminUservarchar20管理员用户名AdminPassvarchar50 yes管理员密码表3.6图书分类信息表,记录图书分类信息bookclass。表3.6 图书分类表 bookclass字段名数据类型长度允许空说明IDint4自动编号,卡类型编号Classnamevarchar30yes图书类别第4章 具体设计4.1
19、系统概述411用户界面部分图书选购(可按分类查找图书,或者通过关键字进行查询)。购物车功能。查看图书具体信息。用户注册。用户登录。查看用户的订单信息。修改用户个人信息。412 管理界面部分现有图书管理:修改,删除,查看。用户管理:查看,修改,删除。订单管理:查看订单清单,更新订单付款,出货状态,删除订单。添加新图书。添加图书分类。4.2 具体代码及说明4.2.1实现bookshop.run包1:login.java这是一个以客户为中心的交易平台,只有成为了系统的合法用户才可以使用这个系统,因此需要检查每个用户的合法性,管理用户登录的login.java正是要完毕这样的功能。类中定义了个priv
20、ate属性和他们相应的setX()/getX()方法和默认构造函数和execute() getSql() 操作。private属性分别是:private String username;/登录用户名 private String passwd;/登录密码 private boolean isadmin;/是否管理员登录 private long userid=0;/用户ID号 重要操作:重要介绍execute()execute()操作功能:从数据库中查询用户信息。返回值:boolean型,假如取值成功返回true,否则,返回false。设计思绪:获得数据库连接对象Connection 对象,R
21、esultSet对象和Statement对象 调用getSql()方法获得sql语句执行sql语句。程序主干部分代码:public boolean execute() throws Exception try con=DataBase.getConnection(); stmt=con.createStatement(); rs = stmt.executeQuery(getSql(); catch(Exception e) e.printStackTrace(); while (rs.next() if (!isadmin) userid = rs.getLong(id); flag = t
22、rue; 2:op_book.java该类重要负责图书的管理,涉及图书的修改,查询,删除和添加等。op_book类有以下属性: private book abooks = new book(); /新的图书类 private javax.servlet.http.HttpServletRequest request; /建立页面请求 private boolean sqlflag = true ; /对接受到的数据是否对的 private Vector booklist; /显示图书列表向量数组 private int page = 1; /显示的页码 private int pageSize
23、=5;/每页显示的图书数 private int pageCount =0;/页面总数 private long recordCount =0; /查询的记录总数 public String sqlStr=; op_book类有以下方法(省去了属性相应的getX()/setX()方法):book_search();完毕图书查询,涉及分类,关键字查询。 delete();负责图书的删除。 getOnebook();重要完毕图书的单本查询,用于支持页面的“查看具体信息”。 insert();负责图书的添加。 to_String();把字符串以“ISO 8859-1”编码形式输出,使页面正常显示。
24、update();负责修改图书信息。 getRequest();负责接受页面传递过来的参数,分解并将参数存放到abooks对象中。重要操作:重要介绍getRequest() getRequest()方法功能:负责从页面接受表单数据并分解,设立abooks对象相应属性。参数设计:页面传递的Request对象,其中涉及表单数据。 返回值:boolean型,true表达成功,否则返回false。 设计思想:获取页面传递的Request对象分解Request对象获取表单参数值把参数值设立成图书对象abooks相相应的属性值。 程序主干代码: public boolean getRequest(java
25、x.servlet.http.HttpServletRequest newrequest) request = newrequest; String BookName = request.getParameter(BookName); abooks.setBookName(to_String(BookName); String author = request.getParameter(author); abooks.setAuthor(to_String(author); String publish = request.getParameter(publish); abooks.setPu
26、blish(to_String(publish); String bookclass = request.getParameter(bookclass); abooks.setBookClass(bc); String bookno = request.getParameter(bookno); abooks.setBookNo(to_String(bookno); String picture = request.getParameter(picture); abooks.setPicture(to_String(picture); price =new Float(request.getP
27、arameter(price).floatValue(); abooks.setPrice(price); amount = new Integer(request.getParameter(amount).intValue(); abooks.setAmount(amount); String Content = request.getParameter(Content); abooks.setContent(to_String(Content); . 3:op_user.java: 为了使用上的方便,我们把对用户的管理,涉及用户的添加,删除,修改,查询等集合成一个管理类。 该类具有以下属性
28、: private user user = new user(); /新的用户对象 private javax.servlet.http.HttpServletRequest request; /建立页面请求 private Vector userlist;/显示用户列表向量数组 private int page = 1;/显示的页码 private int pageSize=8;/每页显示的图书数 private int pageCount =0;/页面总数 private long recordCount =0; /查询的记录总数 private String message = ; /犯
29、错信息提醒 private String username = ; /注册后返回的用户名 private long userid = 0; /注册后返回的用户ID该类具有的重要方法(省去了属性相关的getX()/setX()操作): add():负责用户的添加。 delete():负责删除指定ID的用户。 get_alluser():取出书店所有用户的信息。 getGbk():返回指定字符串的GBK编码。 getUserinfo():负责取得用户的具体信息。 update():负责修改用户资料。 getRequest():获取表单数据,并分解存储。4:op_buy.java我们把业务逻辑和对订
30、单以及和订单列表的管理集成到了该类当中。该类具有以下属性: private javax.servlet.http.HttpServletRequest request; /建立页面请求 private HttpSession session; /页面的session; private boolean sqlflag = true; /对接受到的数据是否对的 private Vector purchaselist; /显示图书列表向量数组 private Vector allorder; /订购单列表 private Vector order_list; /订单清单列表 private int
31、booknumber = 0; /购书总数量 private float all_price = 0; /购书总价钱 private boolean isEmpty = false; /库中的书数量是否够购买的数 private int leaveBook = 0; /库存数量 private String orderId = ; /用户订单号 private boolean isLogin = true; /用户是否登录! private int page = 1; /显示的页码 private int pageSize = 15; /每页显示的订单数 private int pageCou
32、nt = 0; /页面总数private long recordCount = 0; /查询的记录总数该类的重要操作(省去了属性相关的getX()/setX()操作)addnew():负责向购物车中添加新购买的图书。delete():负责从数据库中删除指定ID的订单。modiShoper():负责修改购物车中已选的图书。delShoper():负责删除购物车中的物品。getAllorder():负责从数据库中的订单列表中查询指定用户的订单列表。getGbk():获得指定字符串的GBK编码。getOrder():获得单个订单对象。payout():提交购物车,把订单插入到数据库中。update(
33、):该方法负责当用户付款后,把数据中相应订单的是否付款标记修改成已付状态。重要操作:重要介绍addnew() addnew()方法功能:负责向购物车中添加一条新记录。参数设计:页面传递的request对象。返回值:boolean类型,成功返回true,否则返回false。设计思绪:从页面获得表单数据(request对象中)-获得图书编号等参数值判断购买数量是否合法假如是可以操作,否则不能操作判断是否第一次购买假如是第一次购买,按第一次购买操作否则查询购买列表,找是否有相应项,有则直接修改数量否则添加新记录。函数代码: public boolean addnew(HttpServletReque
34、st newrequest) throws Exception request = newrequest; String ID = request.getParameter(bookid); String Amount = request.getParameter(amount); long bookid = 0; int amount = 0; try bookid = Long.parseLong(ID); amount = Integer.parseInt(Amount); catch (Exception e) return false; if (amount rs.getInt(1)
35、 leaveBook = rs.getInt(1); isEmpty = true; return false; DataBase.closeResultSet(rs); DataBase.closeStatement(stmt); DataBase.closeConnection(con); catch (SQLException e) return false; allorder iList = new allorder(); iList.setBookNo(bookid); iList.setAmount(amount); boolean match = false; /是否购买过该图书
36、 if (purchaselist = null) /第一次购买 purchaselist = new Vector(); purchaselist.addElement(iList); else / 不是第一次购买 for (int i = 0; i purchaselist.size(); i+) allorder itList = (allorder) purchaselist.elementAt(i); if (iList.getBookNo() = itList.getBookNo() itList.setAmount(itList.getAmount() + iList.getAm
37、ount(); purchaselist.setElementAt(itList, i); match = true; break; /if name matches结束 / for循环结束 if (!match) purchaselist.addElement(iList); session.setAttribute(shopcar, purchaselist); return true; 4.2.2客户界面设计与实现1:界面头和界面尾设计。 为了提高代码的重用性,我把客户界面部分相同的头和尾作成两个独立的块,分别命名为 head.inc和tail.inc。这两个文献是单纯的html代码,在jsp页面中只要通过以下语句就可以实现对两个文献的调用: 他们的效果如下图4-1:图4-1界面头和尾部分显示效果用户登录界面login.jsp代码如下: jsp:useBean id=login