基于JAVA的网上商城系统的开发与实现
摘要:网上商城系统是基于JAVA的一个电子商务系统,其主要作用就是实现商城的一些功能,如:买卖商品,计算积分,查看产品的具体信息,与卖家联系,交友等功能!
最后对整个网上商城系统作了一个简要的总结并附录上了一些功能模块的主要源代码。
关键词:网上商城系统;B/S模式;JSP技术;mysql数据库。
BasedonJAVAonlinemallsystemdevelopmentandimplementation
Abstract:OnlinemallsystemisbasedonJAVAae-commercesystem,themainfunctionistorealizemallofsomefunctions,suchas:buyingandsellinggoods,calculatedintegral,checkproductspecificinformation,contacttheseller,thefunctionsuchasfriends!
Thelastofthewholeonlinemallsystemgivesabriefsummaryandappendixonsomefunctionmodule'smainsourcecode.
Keywords:onlinemallsystem;TheB/Smode;JSPtechnology;Mysqldatabase.
摘要...I
目录:...1
1引言...2
2高校教材管理系统的需求分析...2
2.1用户需求分析...2
2.1.1普通用户主要需要:...2
2.1.2系级管理员主要需要:...2
2.2数据字典的描述...2
2.3教材管理系统的数据流图...2
3网上商城系统分析与设计...3
3.1系统设计总体思想、目标...3
3.2网上商城系统的ER模型...3
3.3网上商城系统结构、功能设计...3
3.3.1系统结构设计...3
3.3.2系统功能模块设计...3
3.4网上商城系统的数据库设计...3
4系统平台、计算模式及技术...3
4.1计算模式的进化及本系统选用的模式优越性...3
4.1.1集中式管理——主机/终端模式...4
4.1.2Client/Server模式...4
4.1.3Brower/Server模式...4
4.1.4系统采用B/S三层体系结构模式的优越性...4
4.2JSP技术...4
4.2.2JSP内建对象...6
4.3mysql数据库...9
4.3.1mysql概述...9
4.3.2mysql常用命令...9
5系统实现...11
5.1用户登陆流程...11
5.2买家登陆流程...11
5.3卖家登陆流程...13
5.4用户注册流程...14
5.4.1用户注册流程图...14
5.5数据库表单创建语句...15
6网上商城系统设计的技术关键...15
6.1JSP主要网页代码...15
6.2mysql数据库表单截图...22
6.3Java语言控制主要类代码...23
7系统试运行结果与评价...26
随着计算机的普及以及网络技术的应用,网上商城已经成为一个新的工具和一个新兴的市场,网上商城类似于现实世界当中的商店,差别是利用电子商务的各种手段,达成从买到卖的过程的虚拟商店,从而减少中间环节,消除运输成本和代理中间的差价,造就对普通消费,和加大市场流通带来巨大的发展空间。尽能的还消费者以利益,带动公司发展和企业腾飞,引导国民经济稳定快速发展,推动国内生产总值。
本网上商城构建初始目标主要是面向广大消费者,由于不同人群对商品的需求不同,因而购物网站应在具有自己特色的同时应适合不同人士的需要。
用户主要是买家和卖家以及网站的管理人员:
卖家:上传商品、注册用户、更改商品、删除商品、增加商品、管理已有商品等
买家:查看所有商品、搜索某一商品、查看具体的产品以及厂家信息等
2.1.2系级管理员主要需要:
主要是维护网站秩序,比如说终止某一买家或者卖家的使用权限等
数据字典是关于数据的信息的集合,也就是对数据流图包含的所有元素的定义的集合。任何字典最重要的用途都是供人查阅对不了解的条目的解释,数据字典的作用也正是在软件分析和设计的过程中给人提供关于数据的描述信息。
限于篇幅,下面给出本系统的部分数据字典描述:
⑴买家信息的数据字典的描述:
表名:mall_Buyers
表内元组:
BuyIdBuyNameBuySexBuyPassBuyLevelBuyAddressBuyAge
⑵卖家信息的数据字典的描述:
表名:mall_Sellers
SeIdSeNameSeSexSePassSeLevelSeAddressSeAge
⑶商品信息的数据字典的描述:
表名:mall_Goods
GoodIdGoodNameGoodPriceGoodintroductionSeIdGoodkindsGoodinventory
下面简要介绍部分需求的数据流图:
2.3.1教材库存查询的数据流图(DFD)
用户操作数据流程图:
图2-1商品库查询的数据流图
2.3.5用户信息管理的数据流图(DFD)
⑴增加、修改和删除用户资料,具体的过程的数据流图(DFD)表示如下::
经过对网上商城系统的分析,我们将系统划分出了买家用户、卖家用户、商品信息三个实体,其各个实体的属性如下:
本系统的具体ER模型如下:
网上商城系统结构主要是JAVA代码用作控制语句、JSP用于数据接收及显示、mysql用于术语的存储,采用常用的Brower/Server模式。
由于此网上商城属于网上商城的简易模式,所以基本数据库表的建立有mall_Goods、mall_Buyers、mall_Sellers。
⑴系统的硬件平台:普通PC机
⑵系统的软件平台:MyEclipse、mysql、NavicatforMySQL、tomcat
回顾计算机的发展史,计算模式有过三次质的飞跃:
以主机为中心的计算环境,数据管理,事务处理高度集中,起始成本高,系统维护升级只涉及主机,管理成本低,但用户端缺乏个人定置,无任何处理功能。适用于大规模集中式应用,具有较高的效率和安全性,但存在执行效率及容量不足问题。
它把集中管理模式转化为一种服务器与客户机负荷均衡的分布式计算模式,解决了执行效率及容量不足的问题。该结构以PC为主,适合部门级应用。初级成本低,但随着应用规模扩展,网络上异种资源类型的增多,开发、管理、维护的复杂程度加大,频繁的软硬件升级,后期成本骤升,缺乏关键事物处理的安全性与并发处理能力。
以网络中心计算为特征的BPS结构恰到好处地取长补短,兼容并蓄,使计算体系真正成为企业生存发展的生命力。BPS结构使数据及应用可通过不同平台、不同网络存取,与平台无关,伸缩性大,为企业、行业提供了开放的基于标准的综合性服务计算环境,它将处理、储存、通讯能力移入网络,集中主机P终端和CPS的优点,管理集中,只涉及网络服务器,NC通过下载获得升级功能;同时信息高度分散,通过HTTP、JAVA可访问联接任何URL资源和应用,共享程度高,可伸缩扩展性强,具有高度开放性和灵活性,同时具备高速率和安全性,使用户真正投资于应用而不是计算机本身。
1、开放的标准2、分布计算的基础结构3、较低的开发和维护成本4、使用简单,界面友好5、系统灵活6、保障系统的安全性7、信息共享度高
4.2.1JSP概述
JSP(JavaServerPages)是一种基于Java的脚本技术。在JSP的众多优点之中,其中之一是它能将HTML编码从Web页面的业务逻辑中有效地分离出来。用JSP访问可重用的组件,如Servlet、JavaBean和基于Java的Web应用程序。JSP还支持在Web页面中直接嵌入Java代码。可用两种方法访问JSP文件:浏览器发送JSP文件请求、发送至Servlet的请求。1.JSP文件访问Bean或其它能将生成的动态内容发送到浏览器的组件。图5-1说明了该JSP访问模型。当Web服务器接收到一个JSP文件请求时,服务器将请求发送至WebSphere应用服务器。WebSphere应用服务器对JSP文件进行语法分析并生成Java源文件(被编译和执行为Servlet)。Java源文件的生成和编译仅在初次调用Servlet时发生,除非已经更新了原始的JSP文件。在这种情况下,WebSphere应用服务器将检测所做的更新,并在执行它之前重新生成和编译Servlet。
图5-1:浏览器发送JSP文件请求
2.发送至Servlet的请求生成动态内容,并调用JSP文件将内容发送到浏览器。图5-2说明了该访问模型。该访问模型使得将内容生成从内容显示中分离出来更为方便。WebSphere应用服务器支持HttpServiceRequest对象和HttpServiceResponse对象的一套新方法。这些方法允许调用的Servlet将一个对象放入(通常是一个Bean)请求对象中,并将该请求传递到另一个页面(通常是一个JSP文件)以供显示。调用的页面从请求对象中检索Bean,并用JSP来生成客户机端的HTML。
图5-2:发送至Servlet的请求
C.被调用的JSP文件为DisplayData.jsp,其内容如下:
ThevalueofBeanproperty2is<%=dataBean.getProp2()%>
ThevalueofBeanproperty3is
1.request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
序号方法说明
1objectgetAttribute(Stringname)返回指定属性的属性值
2EnumerationgetAttributeNames()返回所有可用属性名的枚举
3StringgetCharacterEncoding()返回字符编码方式
4intgetContentLength()返回请求体的长度(以字节数)
5StringgetContentType()得到请求体的MIME类型
6ServletInputStreamgetInputStream()得到请求体中一行的二进制流
7StringgetParameter(Stringname)返回name指定参数的参数值
8EnumerationgetParameterNames()返回可用参数名的枚举
9String[]getParameterValues(Stringname)返回包含参数name的所有值的数组
10StringgetProtocol()返回请求用的协议类型及版本号
12StringgetServerName()返回接受请求的服务器主机名
13intgetServerPort()返回服务器接受此请求所用的端口号
14BufferedReadergetReader()返回解码过了的请求体
15StringgetRemoteAddr()返回发送此请求的客户端IP地址
16StringgetRemoteHost()返回发送此请求的客户端主机名
17voidsetAttribute(Stringkey,Objectobj)设置属性的属性值
18StringgetRealPath(Stringpath)返回一虚拟路径的真实路径
2.response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
1StringgetCharacterEncoding()返回响应用的是何种字符编码
2ServletOutputStreamgetOutputStream()返回响应的一个二进制输出流
3PrintWritergetWriter()返回可以向客户端输出字符的一个对象
4voidsetContentLength(intlen)设置响应头长度
5voidsetContentType(Stringtype)设置响应的MIME类型
6sendRedirect(java.lang.Stringlocation)重新定向客户端的请求
3.session对象
session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
2publicStringgetId()返回SESSION创建时JSP引擎为它设的惟一ID号
5String[]getValueNames()返回一个包含此SESSION中所有可用属性的数组
6voidinvalidate()取消SESSION,使SESSION不可用
7booleanisNew()返回服务器创建的一个SESSION,客户端是否已经加入
8voidremoveValue(Stringname)删除SESSION中指定的属性
4.out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
1voidclear()清除缓冲区的内容
2voidclearBuffer()清除缓冲区的当前内容
3voidflush()清空流
4intgetBufferSize()返回缓冲区以字节数的大小,如不设缓冲区则为0
5intgetRemaining()返回缓冲区还剩余多少可用
6booleanisAutoFlush()返回缓冲区满时,是自动清空还是抛出异常
7voidclose()关闭输出流
5.page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
1classgetClass返回此Object的类
2inthashCode()返回此Object的hash码
3booleanequals(Objectobj)判断此Object是否与指定的Object对象相等
4voidcopy(Objectobj)把此Object拷贝到指定的Object对象中
5Objectclone()克隆此Object对象
6StringtoString()把此Object对象转换成String类的对象
7voidnotify()唤醒一个等待的线程
8voidnotifyAll()唤醒所有等待的线程
9voidwait(inttimeout)使一个线程处于等待直到timeout结束或被唤醒
10voidwait()使一个线程处于等待直到被唤醒
11voidenterMonitor()对Object加锁
12voidexitMonitor()对Object开锁
6.application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
1ObjectgetAttribute(Stringname)返回给定名的属性值
3voidsetAttribute(Stringname,Objectobj)设定属性的属性值
4voidremoveAttribute(Stringname)删除一属性及其属性值
5StringgetServerInfo()返回JSP(SERVLET)引擎名及版本号
6StringgetRealPath(Stringpath)返回一虚拟路径的真实路径
7ServletContextgetContext(Stringuripath)返回指定WebApplication的application对象
8intgetMajorVersion()返回服务器支持的ServletAPI的最大版本号
9intgetMinorVersion()返回服务器支持的ServletAPI的最大版本号
10StringgetMimeType(Stringfile)返回指定文件的MIME类型
11URLgetResource(Stringpath)返回指定资源(文件及目录)的URL路径
12InputStreamgetResourceAsStream(Stringpath)返回指定资源的输入流
13RequestDispatchergetRequestDispatcher(Stringuripath)返回指定资源的RequestDispatcher对象
14ServletgetServlet(Stringname)返回指定名的Servlet
15EnumerationgetServlets()返回所有Servlet的枚举
16EnumerationgetServletNames()返回所有Servlet名的枚举
17voidlog(Stringmsg)把指定消息写入Servlet的日志文件
18voidlog(Exceptionexception,Stringmsg)把指定异常的栈轨迹及错误消息写入Servlet的日志文件
19voidlog(Stringmsg,Throwablethrowable)把栈轨迹及给出的Throwable异常的说明信息写入Servlet的日志文件
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
1StringgetMessage()返回描述异常的消息
2StringtoString()返回关于异常的简短描述消息
3voidprintStackTrace()显示异常及其栈轨迹
4ThrowableFillInStackTrace()重写异常的执行栈轨迹
8.pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
1JspWritergetOut()返回当前客户端响应被使用的JspWriter流(out)
2HttpSessiongetSession()返回当前页中的HttpSession对象(session)
3ObjectgetPage()返回当前页的Object对象(page)
4ServletRequestgetRequest()返回当前页的ServletRequest对象(request)
5ServletResponsegetResponse()返回当前页的ServletResponse对象(response)
6ExceptiongetException()返回当前页的Exception对象(exception)
7ServletConfiggetServletConfig()返回当前页的ServletConfig对象(config)
8ServletContextgetServletContext()返回当前页的ServletContext对象(application)
9voidsetAttribute(Stringname,Objectattribute)设置属性及属性值
10voidsetAttribute(Stringname,Objectobj,intscope)在指定范围内设置属性及属性值
11publicObjectgetAttribute(Stringname)取属性的值
12ObjectgetAttribute(Stringname,intscope)在指定范围内取属性的值
13publicObjectfindAttribute(Stringname)寻找一属性,返回起属性值或NULL
14voidremoveAttribute(Stringname)删除某属性
15voidremoveAttribute(Stringname,intscope)在指定范围删除某属性
16intgetAttributeScope(Stringname)返回某属性的作用范围
17EnumerationgetAttributeNamesInScope(intscope)返回指定范围内可用的属性名枚举
18voidrelease()释放pageContext所占用的资源
19voidforward(StringrelativeUrlPath)使当前页面重导到另一页面
20voidinclude(StringrelativeUrlPath)在当前位置包含另一文件
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
2StringgetInitParameter(Stringname)返回初始化参数的值
3EnumerationgetInitParameterNames()返回Servlet初始化所需所有参数的枚举
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内。这样就增加了速度并提高了灵活性。MySQL的SQL“结构化查询语言”。SQL是用于访问数据库的最常用标准化语言。MySQL软件采用了GPL(GNU通用公共许可证)。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql>SHOWDATABASES;2:2、创建一个数据库MYSQLDATAmysql>CREATEDATABASEMYSQLDATA;3:选择你所创建的数据库mysql>USEMYSQLDATA;(按回车键出现Databasechanged时说明操作成功!)4:查看现在的数据库中存在什么表mysql>SHOWTABLES;5:创建一个数据库表mysql>CREATETABLEMYTABLE(nameVARCHAR(20),sexCHAR(1));6:显示表的结构:mysql>DESCRIBEMYTABLE;7:往表中加入记录mysql>insertintoMYTABLEvalues(”hyq”,”M”);8:用文本方式将数据装入数据库表中(例如D:/mysql.txt)mysql>LOADDATALOCALINFILE“D:/mysql.txt”INTOTABLEMYTABLE;9:导入.sql文件命令(例如D:/mysql.sql)mysql>usedatabase;mysql>sourced:/mysql.sql;10:删除表mysql>dropTABLEMYTABLE;11:清空表mysql>deletefromMYTABLE;12:更新表中数据mysql>updateMYTABLEsetsex=”f”wherename=’hyq’;
图5-2买家登陆界面
查询结果:
图5-3买家商品查看界面
图5-4买家商品具体信息界面
图5-5买家商品卖家具体信息界面
图5-6卖家登陆界面
图5-7卖家商品管理界面
图5-8卖家新增商品信息界面
图5-9卖家商品信息修改界面
其具体的流程如图5-10,界面如图:
图5-10用户注册界面
5.5.1一个卖家表存储卖家信息
createtablemall_Sellers(
SeIdintprimarykeyauto_incrementnotnull,
SeNamevarchar(30),
SeSexvarchar(10),
SePassvarchar(20),
SeLevelint,
SeAddress
varchar(50),
SeAgeint
);
5.5.2一个买家表存储买家信息
createtablemall_Buyers(
BuyIdintprimarykeyauto_incrementnotnull,
BuyNamevarchar(30),
BuySexvarchar(10),
BuyPassvarchar(20),
BuyLevelint,
BuyAddress
BuyAgeint
5.5.3一个商品表存储所有卖家的商品信息
createtablemall_Goods(
GoodIdintprimarykeyauto_incrementnotnull,
GoodNamevarchar(30),
GoodPricefloat,
Goodintroduction
varchar(100),
SeIdint,
Goodkinds
varchar(20),
Goodinventory
int,
foreignkey(SeId)referencesmall_sellers(SeId)
6.1.1买家登陆主页BuyerMallList.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@tagliburi="WEB-INF/c.tld"prefix="c"%>
<%@pageimport="online.mall.DTO.*"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
${good.goodId}
${good.goodName}
${good.goodPrice}
${good.goodkinds}
${good.goodinventory}
${good.goodintroduction}
${good.goodSeId}
<%//}%>
当前第
跳转第
function$(id){
returndocument.getElementById(id);
}
functionchck(){
varform=document.getElementById("form1");
varones=document.getElementsByName("one");
varn=0;
for(vari=0;i if(ones[i].checked){ n++; if(n==0){ alert("请勾选"); }else{ form.action="DoDeleteServlet"; form.submit(); functiongotoo(){ varpageno=$("pageno").value; varform=$("form1"); if(pageno.match(/[0-9]*/)==pageno&&pageno!=""){ form.action="BuyerListServelet"; alert("必须为整型数字"); 6.1.2卖家登陆主页SellerMallList.jsp
functiongetAll(){
varallObj=document.getElementById("all");
if(allObj.checked){
ones[i].checked=true;
ones[i].checked=false;
form.action="SelrDeleteServlet";
form.action="SellerListServlet";
6.1.3网页扩展网页OhterWebSites.jsp
6.2.1数据库截图
6.2.2数据库截图mall_buyers表
6.2.3数据库截图mall_sellers表
6.2.3数据库截图mall_goods表
6.3.1DoLoginServelet登陆判断
packageonline.mall.Servelet;
importjava.io.IOException;
importjava.sql.Connection;
importjava.sql.SQLException;
importjavax.servlet.ServletException;
importonline.mall.DAO.BuyersDao;
importonline.mall.DAO.SellersDao;
importonline.mall.DAOFactory.DaoFactory;
importonline.mall.DTO.BuyersDto;
importonline.mall.DTO.SellersDto;
importonline.mall.Datautil.DataSourceFactory;
publicclassDoLoginServeletextendsHttpServlet{
publicvoiddestroy(){
super.destroy();//Justputs"destroy"stringinlog
//Putyourcodehere
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.process(request,response);
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
publicvoidprocess(HttpServletRequestrequest,HttpServletResponseresponse)
//定义一个连接
Connectionconn=null;
//获得Login.JSP上的一些属性值
StringBuyerORSeller=request.getParameter("ra")==null"":request.getParameter("ra").toString();
Stringusername=request.getParameter("userName")==null"":request.getParameter("userName").toString();
Stringuserpass=request.getParameter("userName")==null"":request.getParameter("userName").toString();
try{
conn=DataSourceFactory.getDataSource().getConnection();
//判断用户是买家还是卖家并进入相应买家或卖家页面
if(BuyerORSeller.equals("A")){
BuyersDaobuyerA=DaoFactory.getBuyer(conn);
BuyersDtobuyerT=buyerA.checkLogin(username,userpass);
if(buyerT!=null){
HttpSessionsession=request.getSession();
request.getSession().setAttribute("buyers",buyerT);
request.getSession().setAttribute("mark",BuyerORSeller)request.getRequestDispatcher("BuyerListServelet").forward(request,response);
response.sendRedirect("Login.jsp");
}elseif(BuyerORSeller.equals("B")){
SellersDaosellera=DaoFactory.getSeller(conn);
SellersDtosellerT=sellera.checkLogin(username,userpass);
if(sellerT!=null){
request.getSession().setAttribute("sellers",sellerT);
request.getSession().setAttribute("mark",BuyerORSeller);request.getRequestDispatcher("SellerListServlet").forward(request,response);
}catch(SQLExceptione){
e.printStackTrace();
publicvoidinit()throwsServletException{
System.out.println("init被调用");
6.3.2BuyerListServelet买家登陆主页
importjava.util.ArrayList;
importjava.util.List;
importonline.mall.DAO.GoodsDao;
importonline.mall.DTO.GoodsDto;
publicclassBuyerListServeletextendsHttpServlet{
super.destroy();
intnum=0;
intlastpage=1;
Stringcpage=request.getParameter("currentpage")==null"1":request.getParameter("currentpage");
intcurrentpage=Integer.parseInt(cpage);
List
GoodsDaobDao=DaoFactory.getGood(conn);
num=bDao.getRecordNum();
if(num%10==0){
lastpage=num/10;
lastpage=num/10+1;
if(currentpage<1){
currentpage=1;
if(currentpage>lastpage){
currentpage=lastpage;
//可以购买的物品清单
bGoodList=bDao.canBuyfindByPage(currentpage);
request.setAttribute("bGoodThisPageList",bGoodList);
request.setAttribute("currentpage",currentpage);
request.setAttribute("lastpage",lastpage);
request.getRequestDispatcher("BuyerMallList.jsp").forward(request,response);
经过半个月的系统设计和开发,网上商城开发完毕。经测试和试运行,其功能运行良好。