版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/摘要互联网技术发展到现在已经相当成熟,互联网已经成为一个全世界最大最全的信息中心,越来越多的人在利用互联网来完成他们的工作,同时也有越来越多的人利用互联网来解放他们的生活,他们利用互联网来完成几乎所有所有现实生活中的事物。由于所有的领域都在利用互联网,传统商业也是,现在已经有越来越多的商家将他们的生意搬上了互联网,他们小一点的可以开个小的网店。大一点的可以开个。本次毕业设计的题目就是设计和实现一个网上售书的电子商务。为一个传统的书店提供一个网上展览和销售的平台。本系统主要以Struts和Hibernate加Mysql为开发基础,以JSP为前台表现手段。在功能上面基本实现一个电子商务应该有的功能模块,包括前台和后台两个层面。前台方面主要功能有:用户注册,登录,注销,添加收货人信息,修改收货人信息,删除收货人信息,浏览商品。添加商品进购物车,修改购物车中商品,删除购物车中商品,清空购物车,将购物车中商品生成定单,查看定单,查看定单明细。后台方面主要功能有:查看管理员列表,添加管理员,删除管理员,修改管理员,查看用户列表,添加用户,删除用户,修改用户,查看商品列表,添加商品,删除商品,修改商品,查看定单列表,删除定单等。关键字:StrutsHibernateB/SAbstractInternettechnologyhasbeendevelopedtoamature,theInternethasbecomeaworld-widelargestandmostoftheinformationcenter,anincreasingnumberofpeopleusingtheInternettocompletetheirwork,andalsomoreandmorepeopleusetheInternettotheliberationoftheirlivesTheyusetheInternettocompletealmostallofallthethingsinreallife.SinceallthefieldsintheuseoftheInternet,traditionalbusinessisalsonowagrowingnumberofbusinessmenwillbetheirbusinessontotheInternet,thesmallertheycanopenasmallshop.Thebigpointcanopenawebsite.ThegraduationprojectisthesubjectofDesignandImplementationofanon-lineBooksellersofe-commercesites.Foratraditionalonlinebookstoretoprovideaplatformforexhibitionandsale.ThissystemismainlytoStrutsandHibernatebasisforthedevelopmentandMysqltoJSPforthefutureperformanceofmeans.Intheabovebasicrealizationofafunctionale-commercesitesshouldhavefunctionalmodules,includingtheprospectsandthebackgroundlevel.Prospectsinthemainfeaturesare:userregistration,signin,write-off,addtheconsignee,theconsigneetoamendtheinformation,deletetheconsigneeinformation,visitthemerchandise.Addgoodsintotheshoppingcart,shoppingcartofgoodsamendedtodeletetheshoppingcartofgoods,emptyshoppingcart,thecartwillgenerategoodsorders,vieworders,ordersDetailsview.Backgroundinthemainfeaturesare:Showthelistadministrators,managersadd,deleteadministrator,modifyadministratortoviewthelistofusers,addusers,deleteusers,modifytheusertoviewthelistofgoods,addedcommodities,commoditiesdelete,modifyMerchandise,vieworderslist,deleteandsoonorders.Keyword:StrutsHibernateB/S目录TOC\o"1-3"\h\u摘要 1Abstract 2目录 31绪论 52开发环境与开发工具的介绍 62.1Java语言介绍 62.2JavaBean介绍 62.3Servlet/Jsp介绍 72.4Eclipse介绍 72.5Tomcat介绍 72.6MySql介绍 83开源框架介绍 93.1Hibernate介绍 93.1.1Hibernate的工作方式 93.1.2使用Hibernate的场合 93.1.3Hibernate的两中类型的配置文件 103.2Struts介绍 113.2.1模型(Model) 113.2.2视图(View) 113.2.3控制器(Controller) 114需求分析 134.1系统主要功能详细描述 134.2系统角色与其功能分析 135系统总体设计 145.1DB层设计 175.2DAO层设计 215.3SERVICE层设计 215.4WEB层设计 215.4.1控制器(Controller) 215.4.2模型(Model) 225.4.3表现(View) 225.5系统数据流图(产品模块,定单模块,购物车模块) 226详细设计 246.1系统的数据库设计 246.1.1Product表 245.1.2Order表 255.1.3OrderItem表 255.2系统模块的划分 265.2.1产品模块主要子模块 265.3.2购物车模块主要子模块 265.3.3定单模块主要子模块 265.3系统模块的具体实现 265.3.1产品模块主要子模块 26增加产品 265.3.2购物车模块主要子模块 305.3.3定单模块主要子模块 33总结与体会 35致 36参考文献 37绪论
近年来,随着Internet的迅速崛起,互联网已日益成为收集提供信息的最佳渠道并进入传统的流通领域。于是电子商务开始流行起来,一种全新的购物理念开始形成并逐步发展。网上购物是一种具有交互功能的商业信息系统。它向用户提供静态和动态两类信息资源。所谓静态信息是指那些比经常变动或更新的资源,如公司简介等;动态信息是指随时变化的商务,是通过电子化的手段来完成商业贸易活动的一种方式。等等。那么究竟什么是电子商务?
电子商务,顾名思义是指在互联网上进行的电子化的商务活动。从狭义上看,电子商务也就是电子交易,主要指利用Web提供的通信手段在网上进行交易活动,包括通过Internet买卖产品和提供服务。产品可以是实体化的,如汽车、电视,也可以是数字化的,如新闻、录像、软件等基于比特的产品。此外,还可以提供各类服务,如安排旅游、远程教育等。总之,电子商务并不仅仅局限于在线买卖,它将从的信息,如商品报价,会议安排和培训信息等。网上购物系统具有强大的交互功能,可使商家和用户方便的传递信息,完成电子贸易或EDI交易。这种全新的交易方式实现了公司间文档与资金的无纸化交换。今天,我们已经可以确信电子商务毋庸置疑是未来的发展方向。但是电子商务却还没有一个标准的定义。Intel公司认为:电子商务=电子市场+电子交易+电子服务;IBM认为:电子商务=web;HP公司则说:“电子生产到消费各个方面影响进行商务活动的方式。除了网上购物,电子商务还大大改变了产品的定制、分配和交换的手段。而对于顾客,查找和购买产品乃至服务的方式也大为改进。
而从广义上讲,电子商务还包括企业部商务活动,如生产、管理、财务等以与企业间的商务活动,它不仅仅是硬件和软件的结合,更是把买家、卖家、厂家和合作伙伴在Internet、Intranet和Extranet上利用Internet技术与现有的系统结合起来开展的业务活动。从最初的、电报到电子以与20多年前开始的EDI,都可以说是电子商务的某种形式;发展到今天,人们已提出了包括通过网络来实现从原材料的查询、采购、产品的展示、定购到出品、储运以与电子支付等一系列贸易活动在的完整电子商务的概念。在发达国家,电子商务已发展迅速,通过Internet进行交易已成为潮流。
2开发环境与开发工具的介绍2.1Java语言介绍Java语言是一门高级程序设计语言.它在各个重要的行业部门得到了广泛的应用,Java技术的通用性、高效性、平台移植性和安全性,使之成为网络计算的理想技术.除上面的技术之外还有其他的特点:Java语言是面向对象的语言,主要集中在对象和接口的设计。Java将具有一样特性的数据封装成一个类,实现了对现实实体的抽象,也就是对对象的总体描述;Java可以实现模块化和信息隐藏,Java将数据和操作数据的方法封装在一起,使得数据全都隐藏起来,暴露给外面程序的仅是对数据操作的方法;一个类提供了一类对象的原型,通过Java的继承机制,子类可以使用父类所提供的方法,从而实现了代码的复用;多态就是一个实体多种形态,在Java中表现的最突出的就是一个类实现了多个接口,从而可以有多个功能。另外Java语言是安全的,Java不支持指针,一切对存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用"特洛伊"木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。Java程序是可移植的,与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。同时Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java系统本身也具有可移植性。Java语言和其它解释执行的语言如BASIC不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。2.2JavaBean介绍简单地说,JavaBean是用Java语言描述的软件组件模型,其实际上是一个类。这些类遵循一个接口格式,以便于使函数命名、底层行为以与继承或实现的行为,可以把类看作标准的JavaBean组件进行构造和应用。JavaBean有以下特点:易于维护、使用、编写。可实现代码的重用性。可移植性强,但仅限于Java工作平台。便于传输,不限于本地还是网络。可以以其他部件的模式进行工作。Java程序中往往有重复使用的段落,JavaBean就是为了能够重复使用而设计的程序段落,而且这些段落并不只服务于某一个程序,而且每个JavaBean都具有特定功能,当需要这个功能的时候就可以调用相应的JavaBean。从这个意义上来讲,JavaBean大大简化了程序的设计过程,也方便了其他程序的重复使用。2.3Servlet/Jsp介绍Jsp(JavaServerPage)是在普通Html中嵌入了Java代码的一个脚本,在这一点上,它与其它的脚本语言一样,但它与其它语言不同的是:其它脚本语言由服务器直接解释这个脚本,而Jsp则由Jsp容器(如Tomcat)首先将其转化为Servlet,然后再调用Javac将Servlet编译为Class文件.最终,服务器解释的是Class文件.那么什么是Servlet呢?Servlet其实是一个特殊的Java类,Servlet类一般从Servlet类继承而来,在这个类中至少要实现doGet或者doPost函数,在这两个函数中处理来自客户的请求,然后将结果返回.2.4Eclipse介绍
Eclipse是一种可扩展的开放源代码IDE.,业界厂商合作创建了Eclipse平台.Eclipse允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显著改变了项目工作流程,使开发者可以专注在实际的业务上.
利用Eclipse,我们可以将高级设计(也许是采用UML)与低级开发工具(如应用调试器等)结合在一起.如果这些互相补充的独立工具采用Eclipse扩展点彼此连接,那么当我们用调试器逐一检查应用时,UML对话框可以突出显示我们正在关注的器件.事实上,由于Eclipse并不了解开发语言,所以无论Java语言调试器、C/C++调试器还是汇编调试器都是有效的,并可以在一样的框架同时瞄准不同的进程或节点.
Eclipse的最大特点是它能接受由Java开发者自己编写的开放源代码插件,这类似于微软公司的Visual
Studio和Sun微系统公司的NetBeans平台.Eclipse为工具开发商提供了更好的灵活性,使他们能更好地控制自己的软件技术。2.5Tomcat介绍Tomcat是一个免费的开源的Serlvet容器,是一个开源的服务器,里面可以装载WAR的类似于JAR的压缩文件,这个文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要.通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压.你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译.编译以后,访问将会很快2.6MySql介绍MySQL是一个真正的多用户、多线程SQL数据库服务器,它是一个客户机/服务器结构的实现。MySQL是现在流行的关系数据库中其中的一种,相比其它的数据库管理系统(DBMS)来说,MySQL具有小巧、功能齐全、查询迅捷等优点。MySQL主要目标是快速、健壮和易用。关键的是它是免费的,可以在Internet上免费下载到,并可免费使用。MySQL对于一般中小型,甚至大型应用都能够胜任。MySQL是开源的,开源意味着任何人都可以使用和修改该软件,任何人都可以从Internet上下载和使用MySQL而不需要支付任何费用.如果你愿意,你可以研究其源代码,并根据你的需要修改它3开源框架介绍3.1Hibernate介绍3.1.1Hibernate的工作方式使用Hibernate惟一需要做的就是创建一份XML“映射文档”,告诉Hibernate希望保存在数据库中的类,以与它们如何关联到该数据库中的表和列,然后就可以要求Hibernate以对象的形式获取数据,或者把对象保存为数据.Hibernate在运行时,Hibernate首先读取映射文档,然后动态构建Java类,以便管理数据库与Java之间的转换.在Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询.要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉Hibernate保存修改即可.类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉Hibernate有关它们的信息,这样就能在数据库中保存它们.HibernateAPI学习起来很简单,而且它与程序流的交互相当自然.在适当的位置调用它,就可以达成目的.它带来了很多自动化和代码节省方面的好处,所以花一点时间学习它是值得的.而且还可以获得另一个好处,即代码不用关心要使用的数据库种类.借助于Hibernate,只需要简单地修改Hibernate配置文件即可.3.1.2使用Hibernate的场合如果应用对于数据存储的需要十分简单——例如,您只想管理一组用户优先选择——就根本不需要数据库,更不用说一个优秀的对象-关系映射系统了对于熟悉使用关系数据库和了解如何执行完美的SQL查询与企业数据库交互的人来说,Hibernate似乎有些碍手碍脚,这就像带有动力和自动排挡的快艇车会使注重性能的赛车驾驶员不耐烦一样.如果您属于这种人,如果您所在的项目团队拥有一个强大的DBA,或者有一些存储过程要处理,您可能想研究一下iBATIS.当然,还有其他的外部原因会导致采用另外的方法.比如,在一个企业环境中,必须使用成熟的E架构(或者其他的一些非普通对象映射系统).可以为提供自己的数据存储工具的平台量身定做代码,比如MacOSX'sCoreData.使用的可能是像XMLDTD这样的存储规,而它根本不涉与关系数据库.但是,如果您使用的是富对象模型,而且想要灵活、轻松且高效地保存它,那么Hibernate很可能就是您理想的选择.您可能会惊讶于节省的时间之多,以与您将会多么地喜欢使用它.3.1.3Hibernate的两中类型的配置文件首先创建系统的Hibernate配置文件hibernate.cfg.xml,该文件中存放着数据库连接驱动程序类、登录数据库的用户名/密码、映射持久化类配置文件的位置等,Hibernate初始化时会自动在classes路径中寻找这个文件,并读取其中的配置信息,为后期数据库操作做准备,其完整代码如下。<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configuration
PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN"
"/hibernate-configuration-3.0.dtd"><hibernate-configuration>
<session-factory>
<propertyname="connection.driver_class"><!--指定连接数据库用的驱动-->
.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<propertyname="connection.url"><!--指定连接数据库的路径-->
jdbc:microsoft:sqlserver://:1433;databaseName=db_Material
</property>
<propertyname="connection.username">sa</property><!--指定连接数据库的用户名-->
<propertyname="connection.password"></property><!--指定连接数据库的密码-->
<propertyname="show_sql">true</property><!--当show_sql属性为true时表示在程序运行时在控制台输出SQL语句,默认为false,建议在调试程序时设为true,发布程序之前再改为false,因为输出SQL语句会影响程序的运行速度-->
<mappingresource="/actionForm/GoodsForm.hbm.xml"/><!--指定持久化类映射文件-->
……
<!--此处省略了指定其他持久化类映射文件的代码-->
</session-factory></hibernate-configuration>创建持久化类的映射文件<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC "-//Hibernate/HibernateMappingDTD3.0//EN" "/hibernate-mapping-3.0.dtd"><hibernate-mappingpackage=".tarena.bookshop.entity"> <classname="Catalog"table="e_catalog"> <idname="catalogid"column="catalogid"type="integer"> <generatorclass="identity"></generator> </id><--此处省略属性配置--> </class></hibernate-mapping>3.2Struts介绍Struts是一个基于SunJ2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的这段时间里.Struts把Servlet、JSP、自定义标签和信息资源(messageresources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架.Struts主要有三个部分组成,首先是支持MVC模式的的三个部分,其次是关于Struts的配置文件struts-config.xml。下面来介绍下他们。3.2.1模型(Model)本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config.xml文件描述的配置信息的.3.2.2视图(View)View是由与控制器Servlet配合工作的一整套JSP定制标签库构成,利用她们我们可以快速建立应用系统的界面.3.2.3控制器(Controller)本质上是一个Servlet,将客户端请求转发到相应的Action类.struts-config.xml配置文件是整个框架的主心骨.web.xml文件定义了一个请求到来应向何处转发后,后面的工作就全权由struts-config.xml管理控制了.可以说struts-config.xml就是整个Struts框架的核心,只有它清楚所有请求与动作的映射关系。如今的应用系统,XML形式的配置文件越来越多,如果整个系统只使用一个这样的配置文件的话,那么保持整个系统的模块化和可维护性都非常的轻松.使用配置文件来描述请求-动作的控制过程和相互关系,而不是在代码中将对象之间的调用关系写死,那么当应用系统有变动时,我们只用修改配置文件就行了,而不是再重新编译发布程序了.Controller通过struts-config.xml文件的配置信息确定当有请求时应该调用那个对象来处理,从效率的角度出发,这些信息都是在系统启动时读入并存在存中的.4需求分析4.1系统主要功能详细描述()用户可以注册,登录。()登录用户可以查看用户资料,修改密码,添加收货人,删除收货人。(1)所有用户可以浏览商品列表与每个商品的详细信息。(2)所有用户可以进行查询本站所拥有的自己需要的物品。(3)所有用户可以查看用户留言列表,登录用户可以留言。(3)登录用户可以进行购物,并会像超市的购物车一样放入自己需要的物品以便后面的下单。()登录用户可以对自己的购物车进行相关操作。(4)登录用户可以在进行购物后,进行下单,可以对定单进行处理。(5)用户只能查看自己已经有的定单,并能看到每个定单的详细信息。(6)后台管理员可以对用户进行添加,删除,修改和查询操作。(6)后台管理员可以对商品进行添加,删除,修改和查询操作。(7)后台管理员可以查看所有的用户对应的定单。并能对每个定单进行删除操作。(6)后台管理员可以对用户留言进行删除操作。4.2系统角色与其功能分析系统主要用户有三类:游客,登陆用户,管理员。游客主要可以用的功能是:查看所有商品,搜索商品,查看商品详细信息,查看用户留言列表。登录用户主要可以用的功能:查看修改自己的资料,查看所有商品,搜索商品,查看商品详细信息,购买商品,下定单,查看定单,查看用户留言列表,留言。管理员主要功能:操作普通管理员信息,操作用户信息,操作产品信息,操作定单信息,操作用户留言信息。5系统总体设计网上书城系统是基于B/S架构。实现网上售书的电子商务。系统使用Java语言开发,利用到Hibernate和Struts等开源框架,整个系统分成多层,有效实现了系统各部分的低偶合.整个系统主要有:表现层.业务层.数据访问层。利用软件分层把系统偶合度降低。在数据访问层,使用接口和和实现分离。上层的服务只依赖于底层的接口,底层的实现方式改变不会影响到上层的服务。这样就会最大程度的降低了软件各部分之间的偶合。便于以后修改底层的实现。在分层的基础上。有将软件分模块,从而使系统横向上面分模块,纵向上面分层次。整个软件的层次是:表现层业务层数据访问层DB整个软件根据系统需求分析,可得出系统两种用户的业务流程图。前台用户操作业务流程为:开始浏览用户留言信息览商品列表登录浏览商品详细信息登录NN登录YY添加商品进购物车用户留言购物车生成定单退出结束在用户业务流里面,首先用户连接到主界面,主界面显示所有商品,并且提供商品的搜索服务,在主界面可以直接连接到用户留言列表界面,在主界面还可以连接到用户登录界面。用户在主界面可以浏览所有的商品,也可以查看商品的详细信息,在用户主界面和商品详细信息界面,用户可以将商品添加进购物车,此操作只有登录用户可以使用,非登录用户选自添加进购物车会被拦截到未登录界面。用户在留言主界面可以进行留言。非登录用户不能留言。用户可以点击购物车,进入购物车界面,在购物车界面,用户可以对购物车里的商品进行删除操作,也可以将购物车中的商品修改数量,还可以清空购物车。也可以在购物车界面选择继续购物,连接到主界面继续选择商品。用户还可以在购物车界面进行下单操作。将购物车里的商品生成定单。生成定单后,用户可以查看自己的定单。后台管理员的业务流程为:开始登录管理员主界面有权限N权限出错页面Y管理员管理用户管理产品管理定单管理留言管理退出结束在后台中,管理员可以直接进入管理员入口登录管理员管理界面。在管理员管理的主界面显示的是管理员所有的操作。管理员可直接选择操作进入不同的管理界面,对管理员管理主要有超级管理员来实现,其他管理员没有此操作。用户管理界面直接显示所有用户的列表,在用户管理界面。管理员可以选择添加和删除用户,在产品管理界面,管理员可以添加和删除产品。定单管理界面。管理员可以删除定单。留言管理界面。管理员可以删除留言。5.1DB层设计DB主要是保存实体与实体之间关系的,这里只些关于此次系统中作者设计的几个模块的E-R图:4.4.1User于Order关系图createtimeorderItemsorderstatepayinfototalpriceorderiduseruserItemOrdernhave1UserUseridusernameCreatetimestateordersrolePassworduserItems用户与定单之间是一对多的关系,每个用户可以同时有多个定单,每个定单却只能属于一个用户。这样在定单的实体类中就会有一个对用户的引用,在用户的实体类中就会有一个集合用来保存用户当前所有的定单。在数据库中,用户和定单是两表,定单表中的外键是用户表中的主键,在这里要注意一点。在查找用户的时候会同时把用户所有的定单都拿到,所以要在用户实体类的hibernate配置文件中将定单集合的延迟加载设置为false;这样就能在查出的用户中直接拿到用户所有的定单.4.4.2Order与OrderItemcreatetimeorderItemsorderstatepayinfototalpriceorderiduseruserItemOrder1 OrderbynOrderItem OrderOrder_item_id product quality定单与定单条目之间是一对多的关系,每个定单可以同时有多个定单条目,每个定单条目却只能属于一个定单。这样在定单条目的实体类中就会有一个对定单的引用,在定单的实体类中就会有一个集合用来保存用户当前所有的定单条目。在数据库中,定单和定单条目是两表,定单条目表中的外键是定单表中的主键,在这里要注意一点。在查找定单的时候要同时把定单所有的定单条目都拿到,所以要在定单实体类的hibernate配置文件中将定单条目集合的延迟加载设置为false;这样就能在查出的定单时直接拿到定单所有的定单条目.4.4.3OrderItem与ProductnameorderItemspriceothers...Product1 hasnOrderItem OrderOrder_item_id product quality产品与定单条目之间是一对多的关系,每个定单条目只包含一中产品。每个产品对应多个定单条目,这里多个定单条目不是属于同一个定单。这样在定单条目大实体类中就会有哟个属性用来保存产品的引用,产品中也相应的有一个结合来保存所有包含此产品的定单条目。在数据库中,产品和定单条目是两表,定单条目表中的外键是产品表中的主键。这里不需要在得到产品的时候就拿到定单条目的集合,所以使用默认的hibernate配置就可以了。4.4.4Order与UserItemcreatetimeorderItemsorderstatepayinfototalpriceorderiduseruserItemOrdernTo1UserItemuser_item_iduserItem_nameordersitem_address收货人与定单之间是一对多的关系,每个收货人可以同时有多个定单,每个定单却只能属于一个收货人。这样在定单的实体类中就会有一个对收货人的引用,在收货人的实体类中就会有一个集合用来保存用户当前所有的定单。在数据库中,收货人和定单是两表,定单表中的外键是定收货人表中的主键。5.2DAO层设计在数据访问层,将全部使用接口和实现分离,这样便于以后更换数据库等工作。在这层中,主要是对数据库的表操作。我们利用的是Hibernate技术。这是一种ORM技术,可以将关系数据库中存的每条记录都对应成一个实体,由于所有数据库中的表都只通过DAO来访问,所以在DAO中要有每个表的入口。因此,要为每和实体类对应一个DAO。5.3SERVICE层设计Service主要是系统的业务逻辑,也就是系统的实际的业务逻辑活动,是系统的真正的核心,这一层主要都是一些业务。同时这一层中应该加上事务,因为,对数据库的操作可能出现异常,而Service完全依赖于DAO,所以当数据库出现异常后,这里可以对未完成的事务进行回滚。5.4WEB层设计WEB层主要是用来接收用户请求,并通过请求的不同选择相应的服务来处理请求,再把结果表现给用户。这样在WEB中把请求,服务和表现分开。我们在Java的开源框架中选择Struts来做WEB层,我们首先利用Action来接收请求,在Action中有不同的方法来处理不同的请求,再在Action中调用相应的Service来处理请求。对执行结果进行判断后,选择不同的JSP来进行表现。Struts中这种开发我们成为MVC模式,下面是MVC模式的图解,以与在本系统中的具体作用: C控制层 ActionnewRequestreturnM模型层浏览器forward/redirectResponseV视图层Jsp5.4.1控制器(Controller)Controller是这个框架中扮演“交通警察”的角色,当客户端与服务器有交互动作时,都由她来控制.Controller将请求封包并转发到框架中相应的对象,这些对象可能是一个JSP页面或一个Action.Controller在web.xml中设置为org.apache.struts.action.ActionServlet的一个实例。在一个完整的控制过程中,也就是处理一个请求时,在控制过程之初,这个Servlet会从求情的路径中解析出具体的Struts的路径,再从配置文件struts-config.xml中获取请求与控制动作向对应的配置信息,Controller通过这些配置信息来决定请求该往何处转发,而这些Action在接收到转发来的请求后,再实现真正的商业逻辑。5.4.2模型(Model)所谓Model就是在对用户请求的整个控制过程中,真正处理用户请求并保存处理结果的对象,在整个过程中,我们一般利用JavaBean来把一些信息保存起来以便在各个对象之间传递.因为在框架中,Model对象是真正处理商业逻辑功能的对象,因此也就是框架中应用需现相关性最大的部分.在Struts的实现里,Model的具体表现形式就是ActionForm对象和与其对应的Action对象了.对用户提交表单的数据进行校验,甚至对数据进行预处理都能在ActionForm中完成.通常的应用中,一般是一个Model对象和一个请求页面对应的关系,但也可以一个Model对象对应多个页面请求.如果struts-config.xml配置文件没有指定一个Model对象对应的Action,那么控制器将直接把(通过Model对象完成数据封装的)请求转到一个View对象.5.4.3表现(View)View只是用来向用户表现信息。不进行业务处理。这里主要是一些JSP页面5.5系统数据流图(产品模块,定单模块,购物车模块)登陆访问数据库 用户和管理员 购物系统 数据库中的 显示信息 返回结果 各种资源 0层图数据库中的定单定单模块表与定单条目表用户购物车模块数据库中的产品模块产品表1层图数据库中的定单定单管理表与定单条目表管理员数据库中的产品管理产品表1层图6详细设计6.1系统的数据库设计6.1.1Product表Product表是用来存储产品信息的.应有的字段是:Productidnumbernamevarcharisbnvarcharprintervarcharauthorvarcharpricenumberbooknumvarchardescriptionvarcharimagepathvarcharcetatetimedatestatenumbercatalog(fid)numberProduct表的建表语句为:CREATETABLEe_product(productidint(10)NOTNULLauto_increment,namevarchar(50)NOTNULL,isbnvarchar(100)defaultNULL,printervarchar(50)defaultNULL,authorvarchar(50)defaultNULL,pricedoubledefaultNULL,booknumint(4)defaultNULL,catalogidint(10)NOTNULL,descriptionvarchar(1000)defaultNULL,imagepathvarchar(100)defaultNULL,createtimedatedefaultNULL,stateint(2)default'0',PRIMARYKEY(productid),KEYcatalogid(catalogid))DEFAULTCHARACTERSETutf8;6.12Order表Order表主要用来存储定单的一些信息.主要有下面一些字段:orderidnumbertotalpricenumberorderstatenumberpayinfonumbercreatetimedateusernumberuserItemnumberOrder对应表的建表语句为:CREATETABLEe_order(orderidint(11)NOTNULLauto_increment,totalpricedoubledefault'0',orderstateint(11)default'0',payinfoint(11)defaultNULL,createtimedatedefaultNULL,useridint(11)NOTNULL,user_item_idint(11)NOTNULL,PRIMARYKEY(orderid),KEYuser_item_id(user_item_id),KEYuserid(userid))DEFAULTCHARACTERSETutf8;6.1.3OrderItem表OrderItem表主要记录定单条目信息,有两个外键分别是Orderid和productid,具体字段为:Order_item_idnumberqualitynumberproductnumberordernumberOrderItem对应表的建表语句是:CREATETABLEe_order_item(order_item_idint(11)NOTNULLauto_increment,productidint(11)NOTNULL,orderidint(11)NOTNULL,qualityint(11)NOTNULL,PRIMARYKEY(order_item_id),KEYproductid(productid),KEYorderid(orderid))DEFAULTCHARACTERSETutf8;6.2系统模块的划分6.2.1产品模块主要子模块产品模块主要子模块有:(1).增加产品;(2).删除产品;(3).修改产品(4).查看产品列表;(5).查看产品详细信息6.2.2购物车模块主要子模块购物车模块主要子模块有:(1).生成购物车;(2).删除购物车;(3).删除购物车中的商品;(4).清空购物车中的商品;(5).修改购物车中商品数量;(6).向购物车中添加商品;6.2.3定单模块主要子模块定单模块主要子模块有:(1).创建定单;(2).删除定单;(3).查看定单列表;(4).查看定单中的详细条目;6.3系统模块的具体实现6.3.1产品模块主要子模块增加产品添加产品只能有管理员来操作,管理员由浏览器输入产品信息,通过Request的参数形式,传到服务器端,浏览器端和服务器端主要代码有:JSP中接收用户输入的代码段是:<formaction="<%=request.getContextPath()%>/admin/addProduct.do"method="post"> <tablecellpadding=3cellspacing=1align=centerclass=tableborder1> <tr> <tdclass=tablebody1valign=middlealign=centerwidth="20%">[书 名] </td> <tdclass=tablebody1valign=middlewidth="80%"> <inputtype="text"name="name"/><fontcolor="#FF0000"> *</font> </td> </tr> <--此处省略了部分JSP代码--> <tr> <tdclass=tablebody2valign=middlealign=centercolspan="2"> <inputtype="submit"name="Submit"value="提交"/> <inputtype="button"value="返 回"class="button" onclick="javascript:history.go(-1)"/> </td> </tr> </table></form>Action中主要用来接收用户信息来进行业务操作,主要代码为:publicActionForwardaddProduct(ActionMappingmapping,ActionFormform, ServletRequestrequest,ServletResponseresponse) throwsException{ ActionForwardforward=mapping.findForward("error"); try{ Stringname=request.getParameter("name"); //省略部分定义几个用来接收用户输入的变量 Catalogcatalog=productService.getCatalog(catalogid); Productproduct=newProduct(); product.setCatalog(catalog); //省略部分将接收到的信息包装成一个Product; product.setState(0); productService.addProduct(product);//将Product保存到DB中 Collectionproducts=productService.getProducts(); request.getSession().setAttribute("products",products); //查找产品生成集合.再将集合放到Session中; intsize=products.size(); request.setAttribute("size",size); request.setAttribute("products",products); forward=mapping.findForward("success"); }catch(Exceptione){ e.printStackTrace(); } returnforward; } 在此Action中,调用了服务层的ProductService的addProduct()方法;addProduct()方法有调用DAO层的addProduct()方法;在Service层中加了事物处理;在DAO层有对数据库的操作;对数据库的操作如下:publicvoidaddProduct(Productproduct){ Sessionsession=null; try{ session=HbnUtil.getSession(); session.save(product); }catch(Exceptionex){ thrownewStoreException(ex); }} 这里直接对数据库操作,直接调用session的save()方法;删除产品;删除产品只能由管理员俩进行,管理员选择要删除的产品,然后由request参数的形式将productid传给服务器,在服务器端将产品删除,JSP主要代码有:<inputtype="checkbox"name="checkbox"value="${ductid}"/>在服务器端,Action接收到的chochbox的String数组,利用循环将数组中的productid拿到并且根据productid来删除product,代码为:String[]productIds=request.getParameterValues("checkbox");if(productIds==null) returnforward=mapping.findForward("success");for(inti=0;i<productIds.length;i++){ IntegerproductId=Integer.parseInt(productIds[i]); productService.removeProduct(productId);}此处仍然调用service中的removeProduct()方法来处理数据;在removeProduct()中又调用拉DAO中的deleteProduct()方法;DAO中的主要实现代码为:Sessionsession=null;try{ session=HbnUtil.getSession(); session.delete(product);}catch(Exceptionex){ thrownewStoreException(ex);}这里直接调用了session.delete()方法;修改产品修改产品只能由管理员俩进行,管理员选择要修改的产品,然后由get请求参数的形式将productid传给服务器,在服务器端将产品修改,JSP主要代码有:<td><ahref="<%=request.getContextPath()%>/admin/getProduct.do?productId=${ductid}">修改</a></td>//这里就是通过这个连接来修改产品的;在服务器端接收到get请求后,拿到productid在从数据库里查出此product放入request中,转向修改页面,修改各属性后,在通过Form表单的形式将参数传给服务器,在服务器端,先拿到各属性值,在通过productid在数据库中将product查出,再将得到的各属性放到查出的product中.在将product保存入数据库.这里Action中的代码断为:Stringname=request.getParameter("name");intcatalogid=Integer.valueOf(request.getParameter("catalog"));//上面省略部分为获得请求中参数的过程;Catalogcatalog=productService.getCatalog(catalogid);IntegerproductId=Integer.valueOf(request.getParameter("productId"));Productproduct=productService.getProductById(productId);//通过productid来从数据库中得到product;product.setCatalog(catalog);product.setImagepath(imagepath);//上面省略将属性值放入product中的部分代码;productService.modifyProduct(product);//将product放入数据库;查看产品列表;查看产品列表是所有的用户都可以作的一向操作;用户在登陆首页后就可看到所有产品的列表,此请求先对数据库进行查询;将查询到的产品生成一个collect,在将collect传给JSP去进行表现.这里主要有一个实现分页查询的方法:intpage=1;try{//第一次因为没有设置page属性,所以会抛个空指针异常,捕获之后将page设置为1; page=Integer.parseInt(request.getParameter("page"));}catch(Exceptionex){ page=1;}PageHelperpageHelper=newPageHelper();//这里PageHelper为一个辅助pageHelper.setPageSize(Globals.PAGE_SIZE);//类用来实现分页.pageHelper.setCurrentPage(page);pageHelper.setMaxCount(productService.getProudctCount());Collection<Product>products=productService.getProductsByPages(page);request.setAttribute("navigation",pageHelper.showNavigation("listAll"));request.setAttribute("products",products);在此过程的DAO中用到了hibernate的分页查询;List<Product>products=newArrayList<Product>();Sessionsession=null;try{session=HbnUtil.getSession(); products=session.createQuery( "fromProductporderbyductid") .setFirstResult((1)*Globals.PAGE_SIZE) .setMaxResults(Globals.PAGE_SIZE) .list(); returnproducts;}catch(Exceptionex){ thrownewStoreException(ex);}这里首先设置了从什么地方开始放到结果集中,在设置了结果集的长度.从而实现了分页查询;查看产品详细信息;此操作也是用户可以操作.而且不需要登陆的情况下就可以查看了,用户只需要在首页点下查看详细信息的超连接,就可以看到产品的详细信息了.在JSP中有这样的一个连接:<ahref='<%=request.getContextPath()%>/page/product.do?method=listDetail&productid=${ductid}'>${}</a>在服务器接收到这个请求后从数据库中把product查出来,在将product放进request中,在将request转向显示产品详细信息的页面.从而在显示详细信息的页面将产品的所有信息显示出来.6.3.2购物车模块主要子模块生成购物车;此过程有两个地方要用到.第一是在第会话空间一创建的时候就创建一个购物车放到session空间中.此动作是有一个监听器来实现的.具体实现过程是:publicvoidsessionCreated(SessionEventarg0){ Sessionsession=arg0.getSession(); Cartcart=newCart(); session.setAttribute("cart",cart); }这个方法在session被创建时自动执行,这个方法是将创建的session中放入一个空的购物车.第二个用到的地方是在清空购物车后,再加商品进购物车时,session中没有Cart,从而创建一个新的购物车.此过程在Action中实现:Cartcart=(Cart)session.getAttribute("cart");if(cart==null){ cart=newCart();}删除购物车;在session被销毁的时候,既用户推出时,或者session过期时候,有监听器自动实现.publicvoidsessionDestroyed(SessionEventarg0){Sessionsession=arg0.getSession();Cartcart=(Cart)session.getAttribute("cart");session.removeAttribute("cart");cart=null;Useruser=(User)session.getAttribute("user");session.removeAttribute("user");user=null;}删除购物车中的商品;此操作需要登陆用户才可操作,登陆用户在对购物车主界面中.点击删除按钮.<inputtype="button"value="删除"class="button" onclick="javascript:window.location='<%=request.getContextPath()%>/biz/cart.do?method=remove&productid=${ductid}';">在服务器端拿到要删除的商品的prodictid,进行删除;此操作不进行数据库的操作.所以不用调DAO;在Action中直接对Cart对象操作;Action中代码片段为:Sessionsession=request.getSession();Integerproductid=Integer.parseInt(request.getParameter("productid"));Cartcart=(Cart)session.getAttribute("cart");cart.removeCart(productid);session.setAttribute("cart",cart);returnmapping.findForward("removecartsuccess");这里先拿到购物车,再通过productid来从购物车中删除商品.在将删除后的购物车从新放到session中;通过productid删除商品是这样来进行的:publicvoidremoveCart(Integerid){ ducts.remove(id);}这里的products是一个以productid为key的Map;清空购物车中的商品;清空购物车操作在Action中是直接将购物车删除来进行清空.在Action中代码片段为:Sessionsession=request.getSession();Cartcart=(Cart)session.getAttribute("cart");session.removeAttribute("cart");returnmapping.findForward("success");这里直接调用session的removeAttribute()方法实现删除购物车.修改购物车中商品数量;修改购物车中商品的数量是在JSP中利用from表单的隐藏域来实现的.在隐藏域中定义了修改后商品的数量.定义拉方法名,定义了productid;代码如下:<formmethod="post" action="<%=request.getContextPath()%>/biz/cart.do"name="f1"> <inputtype="hidden"name="productid"value="${ductid}"> <inputtype="hidden"name="number"value="${carproducts.num}"> <inputtype="hidden"name="method"value="modify"> <tdclass=tablebody1valign=middlealign=centerwidth=""> <inputtype="text"name="num"value="${carproducts.num}"size="4" onblur="javascript:if(this.value<1){alert('对不起,产品数量不能小于1');this.focus();}else{number.value=this.value;}"/> </td> <td> <inputtype="submit"value="保存修改"class="button"> </td></form>这里在进行了javascript拦截; 通过隐藏域中的参数,Action就可以修改商品的数量了;Integerproductid=Integer.parseInt(request.getParameter("productid"));intnum=Integer.parseInt(request.getParameter("num"));Sessionsession=request.getSession();Cartcart=(Cart)session.getAttribute("cart");cart.modifyNum(productid,num);此处先将productid拿到,在将商品数量拿到,在修改购物车中的商品数量.此处用的方法是:modufyN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公租房换房协议
- 工程装修合同补充协议
- 2024年度汽车4S店装修设计与施工合同2篇
- 门诊劳动合同
- 合租租房合同电子版本范文
- 5-Hydroxymethyl-7-methoxybenzofuran-生命科学试剂-MCE
- 3-Galloylquercitrin-生命科学试剂-MCE
- 3-4-4-7-Tetrahydroxyflavan-生命科学试剂-MCE
- 物业公司2024年度门卫绩效考核合同
- 2024年度环保设备销售代理合同2篇
- 解热镇痛药在儿童发热对症治疗中的合理用药专家共识课件
- 5Why分析法(经典完整版)课件
- 2022年高校教师资格证(高校教师职业道德)考试题库点睛提升300题含答案下载(陕西省专用)
- 马工程西方经济学(第二版)教学课件-1
- 小学英语家长会课件(完整版)
- 小学数学西南师大五年级上册七总复习小数乘除法复习课教案
- 医疗期告知书、督促回岗通知书、劳动能力鉴定通知书
- 机动车检测站安全生产责任书(3篇)
- 《认识射线、直线和角》公开课课件
- TSG Z7002-2022 特种设备检测机构核准规则-高清正版
- 新员工网络信息安全意识培训ppt
评论
0/150
提交评论