淘先锋技术网

首页 1 2 3 4 5 6 7

基于JAVA的网上商城系统的开发与实现

 

 

摘要网上商城系统是基于JAVA的一个电子商务系统,其主要作用就是实现商城的一些功能,如:买卖商品,计算积分,查看产品的具体信息,与卖家联系,交友等功能!

最后对整个网上商城系统作了一个简要的总结并附录上了一些功能模块的主要源代码。

 

关键词:网上商城系统;B/S模式;JSP技术;mysql数据库。

 

 

 

 

 

 

 

 

 

       Based on JAVA online mall system development and implementation

 

Abstract:Online mall system is based on JAVA a e-commerce system, the main function is to realize mall of some functions, such as: buying and selling goods, calculated integral, check product specific information, contact the seller, the function such as friends!

The last of the whole online mall system gives a brief summary and appendix on some function module's main source code.

 

Keywords:online mall system; The B/S mode; JSP technology; Mysql database.

 

 

 

 

 

摘要... 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.2 Client/Server模式... 4

4.1.3 Brower/Server模式... 4

4.1.4 系统采用B/S三层体系结构模式的优越性... 4

4.2 JSP 技术... 4

4.2.2  JSP内建对象... 6

4.3 mysql数据库... 9

4.3.1 mysql概述... 9

4.3.2 mysql常用命令... 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.1 JSP主要网页代码... 15

6.2 mysql数据库表单截图... 22

6.3 Java语言控制主要类代码... 23

7 系统试运行结果与评价... 26

 

 

 

1 引言    

随着计算机的普及以及网络技术的应用,网上商城已经成为一个新的工具和一个新兴的市场,网上商城类似于现实世界当中的商店,差别是利用电子商务的各种手段,达成从买到卖的过程的虚拟商店,从而减少中间环节,消除运输成本和代理中间的差价,造就对普通消费,和加大市场流通带来巨大的发展空间。尽能的还消费者以利益,带动公司发展和企业腾飞,引导国民经济稳定快速发展,推动国内生产总值。

2 高校教材管理系统的需求分析  

本网上商城构建初始目标主要是面向广大消费者,由于不同人群对商品的需求不同,因而购物网站应在具有自己特色的同时应适合不同人士的需要。

2.1 用户需求分析          

用户主要是买家和卖家以及网站的管理人员:

2.1.1 普通用户主要需要: 

卖家:上传商品、注册用户、更改商品、删除商品、增加商品、管理已有商品等   

买家:查看所有商品、搜索某一商品、查看具体的产品以及厂家信息等

2.1.2 系级管理员主要需要:

主要是维护网站秩序,比如说终止某一买家或者卖家的使用权限等

2.2 数据字典的描述

数据字典是关于数据的信息的集合,也就是对数据流图包含的所有元素的定义的集合。任何字典最重要的用途都是供人查阅对不了解的条目的解释,数据字典的作用也正是在软件分析和设计的过程中给人提供关于数据的描述信息。

限于篇幅,下面给出本系统的部分数据字典描述:

⑴ 买家信息的数据字典的描述:

  表名:mall_Buyers

  表内元组:

  BuyId  BuyName  BuySex  BuyPass  BuyLevel  BuyAddress  BuyAge      

⑵ 卖家信息的数据字典的描述:

表名:mall_Sellers

  表内元组:

SeId  SeName  SeSex  SePass  SeLevel  SeAddress  SeAge

⑶ 商品信息的数据字典的描述:

表名:mall_Goods

  表内元组:

  GoodId  GoodName  GoodPrice  Goodintroduction  SeId   Goodkinds   Goodinventory

 

 

 

 

 

2.3 教材管理系统的数据流图

下面简要介绍部分需求的数据流图:

 
  

 

 

 

 

 

 

 

 

 

 

 

 

 

2.3.1 教材库存查询的数据流图(DFD)

用户操作数据流程图:

 
  

 

 

 

 

 

 

 

 

 

图2-1商品库查询的数据流图

2.3.5 用户信息管理的数据流图(DFD)

⑴增加、修改和删除用户资料,具体的过程的数据流图(DFD)表示如下::

3网上商城系统分析与设计

3.1 系统设计总体思想、目标

 

 

3.2 网上商城系统的ER模型

经过对网上商城系统的分析,我们将系统划分出了买家用户、卖家用户、商品信息三个实体,其各个实体的属性如下:

本系统的具体ER模型如下:

 

 
  

 

 

 

 

 

 

 

 

 

3.3 网上商城系统结构、功能设计

3.3.1 系统结构设计

      网上商城系统结构主要是JAVA代码用作控制语句、JSP用于数据接收及显示、mysql用于术语的存储,采用常用的Brower/Server模式。

3.3.2 系统功能模块设计

       功能模块主要有:登录验证模块、登陆显示模块、数据库操作模块、信息显示模块等

3.4 网上商城系统的数据库设计

       由于此网上商城属于网上商城的简易模式,所以基本数据库表的建立有mall_Goods、mall_Buyers、mall_Sellers。

4 系统平台、计算模式及技术

⑴  系统的硬件平台:普通PC机

⑵  系统的软件平台:MyEclipse、mysql、Navicat for MySQL、tomcat

4.1 计算模式的进化及本系统选用的模式优越性

回顾计算机的发展史,计算模式有过三次质的飞跃:

 

4.1.1 集中式管理——主机/终端模式

以主机为中心的计算环境 ,数据管理 ,事务处理高度集中 ,起始成本高 ,系统维护升级只涉及主机,管理成本低 ,但用户端缺乏个人定置 ,无任何处理功能。适用于大规模集中式应用 ,具有较高的效率和安全性 ,但存在执行效率及容量不足问题。

4.1.2 Client/Server模式

    它把集中管理模式转化为一种服务器与客户机负荷均衡的分布式计算模式 ,解决了执行效率及容量不足的问题。该结构以 PC为主 ,适合部门级应用。初级成本低 ,但随着应用规模扩展 ,网络上异种资源类型的增多,开发、管理、维护的复杂程度加大,频繁的软硬件升级 ,后期成本骤升,缺乏关键事物处理的安全性与并发处理能力。

4.1.3 Brower/Server模式

    

以网络中心计算为特征的 BPS结构恰到好处地取长补短 ,兼容并蓄 ,使计算体系真正成为企业生存发展的生命力。 BPS结构使数据及应用可通过不同平台、不同网络存取 ,与平台无关 ,伸缩性大 ,为企业、行业提供了开放的基于标准的综合性服务计算环境 ,它将处理、储存、通讯能力移入网络 ,集中主机 P终端和 CPS的优点 ,管理集中 ,只涉及网络服务器 ,NC通过下载获得升级功能 ;同时信息高度分散 ,通过 HTTP、JAVA可访问联接任何 URL资源和应用 ,共享程度高 ,可伸缩扩展性强 ,具有高度开放性和灵活性 ,同时具备高速率和安全性 ,使用户真正投资于应用而不是计算机本身。

4.1.4 系统采用B/S三层体系结构模式的优越性

1、开放的标准2、分布计算的基础结构3、较低的开发和维护成本4、使用简单 ,界面友好5、系统灵活6、保障系统的安全性7、信息共享度高

4.2 JSP 技术

4.2.1 JSP概述

JSP(JavaServer Pages)是一种基于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 的请求

  5.2 JSP示例
  浏览器通过一个Web 页面中的HTML表单请求一个servlet(PopulateBeanServlet),该servlet创建一个名为 dataBean 的DataBean 实例,并调用 JSP 文件将内容发送到浏览器。Servlet 示例和 JSP 文件示例说明了启用内容分离的 JSP 访问模型。
  A. Servlet 是由下列Web 页面中的 HTML 表单来调用的。
  <HTML>
  <BODY>
  <H1>运行 PopulateBeanServlet</H1>
  <P>您是否希望运行 PopulateBeanServlet?
  <FORM action="/servlet/PopulateBeanServlet" method="GET">
  <INPUT type="SUBMIT" value="Yes">
  <INPUT type="SUBMIT" value="No">
  </FORM>
  </BODY>
  </HTML>
  B. 被请求的servlet为PopulateBeanServlet, 其源代码如下:
  
  import java.io.*;
  import java.beans.Beans;
  import javax.servlet.*;
  import javax.servlet.http.*;
  import javax.ejb.CreateException;

  public class PopulateBeanServlet extends HttpServlet {
  public void Service(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  try {
  dataBean = (DataBean) Beans.instantiate(this.getClass().getClassLoader(), "DataBean");
  }
  catch (Exception ex) {
  throw new ServletException("Can't create BEAN of class DataBean: "
  metaData.setSQL(getSQLString());
  }
  // Set some Bean properties (content generation)
  dataBean.setProp1("Value1");
  dataBean.setProp2("Value2");
  dataBean.setProp3("Value3");
  // To send the Bean to a JSP file for content formatting and display
  // 1) 将dataBean放置在当前“请求”对象中,
  ((com.sun.server.http.HttpServiceRequest) req).setAttribute("dataBean", dataBean);
  // 2) 使用callPage 方法调用JSP文件,文件名为DisplayData.jsp,并把请求对象传递给JSP。
  ((com.sun.server.http.HttpServiceResponse) res).callPage("/DisplayData.jsp", req);
  } //end of service mehtod
  }

  C. 被调用的JSP文件为DisplayData.jsp,其内容如下:
  <!-- 该 JSP 文件获得在请求对象中传递的 dataBean,并显示该 Bean 的属性。 -->
  <html>
  <head>
  <title>Bean Data Display</title>
  </head>
  
  <!-- Get the Bean using the BEAN tag -->
  <bean name="dataBean" type="DataBean" introspect="no" create="no" scope="request">
  </bean>
  <body>
  <!-- There are three ways to access Bean properties -->
  <!-- Using a JSP scriptlet -->
  <% out.println("The value of Bean property 1 is " + dataBeans.getProp1());
  %>

  <!-- Using a JSP expression -->
  <p>The value of Bean property 2 is
  <%= dataBean.getProp2() %> </p>

  <!--Using the INSERT tag -->
  <p>The value of Bean property 3 is
  <insert bean=dataBean property=prop3 default="No property value" >
  </insert></p>

  </body>
  </html>

 

 

4.2.2  JSP内建对象

1.request对象

  客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。

  序号 方 法 说 明

  1 object getAttribute(String name) 返回指定属性的属性值

  2 Enumeration getAttributeNames() 返回所有可用属性名的枚举

  3 String getCharacterEncoding() 返回字符编码方式

  4 int getContentLength() 返回请求体的长度(以字节数)

  5 String getContentType() 得到请求体的MIME类型

  6 ServletInputStream getInputStream() 得到请求体中一行的二进制流

  7 String getParameter(String name) 返回name指定参数的参数值

  8 Enumeration getParameterNames() 返回可用参数名的枚举

  9 String[] getParameterValues(String name) 返回包含参数name的所有值的数组

  10 String getProtocol() 返回请求用的协议类型及版本号

  11 String getScheme() 返回请求用的计划名,如:http.https及ftp等

  12 String getServerName() 返回接受请求的服务器主机名

  13 int getServerPort() 返回服务器接受此请求所用的端口号

  14 BufferedReader getReader() 返回解码过了的请求体

  15 String getRemoteAddr() 返回发送此请求的客户端IP地址

  16 String getRemoteHost() 返回发送此请求的客户端主机名

  17 void setAttribute(String key,Object obj) 设置属性的属性值

  18 String getRealPath(String path) 返回一虚拟路径的真实路径

  2.response对象

  response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。

  序号 方 法 说 明

  1 String getCharacterEncoding() 返回响应用的是何种字符编码

  2 ServletOutputStream getOutputStream() 返回响应的一个二进制输出流

  3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象

  4 void setContentLength(int len) 设置响应头长度

  5 void setContentType(String type) 设置响应的MIME类型

  6 sendRedirect(java.lang.String location) 重新定向客户端的请求

  3.session对象

  session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.

  序号 方 法 说 明

  1 long getCreationTime() 返回SESSION创建时间

  2 public String getId() 返回SESSION创建时JSP引擎为它设的惟一ID号

  3 long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间

  4 int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms)

  5 String[] getValueNames() 返回一个包含此SESSION中所有可用属性的数组

  6 void invalidate() 取消SESSION,使SESSION不可用

  7 boolean isNew() 返回服务器创建的一个SESSION,客户端是否已经加入

  8 void removeValue(String name) 删除SESSION中指定的属性

  9 void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms)

  4.out对象

  out对象是JspWriter类的实例,是向客户端输出内容常用的对象

  序号 方 法 说 明

  1 void clear() 清除缓冲区的内容

  2 void clearBuffer() 清除缓冲区的当前内容

  3 void flush() 清空流

  4 int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0

  5 int getRemaining() 返回缓冲区还剩余多少可用

  6 boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常

  7 void close() 关闭输出流

  5.page对象

  page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例

  序号 方 法 说 明

  1 class getClass 返回此Object的类

  2 int hashCode() 返回此Object的hash码

  3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等

  4 void copy(Object obj) 把此Object拷贝到指定的Object对象中

  5 Object clone() 克隆此Object对象

  6 String toString() 把此Object对象转换成String类的对象

  7 void notify() 唤醒一个等待的线程

  8 void notifyAll() 唤醒所有等待的线程

  9 void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒

  10 void wait() 使一个线程处于等待直到被唤醒

  11 void enterMonitor() 对Object加锁

  12 void exitMonitor() 对Object开锁

  6.application对象

  

  application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。

  序号 方 法 说 明

  1 Object getAttribute(String name) 返回给定名的属性值

  2 Enumeration getAttributeNames() 返回所有可用属性名的枚举

  3 void setAttribute(String name,Object obj) 设定属性的属性值

  4 void removeAttribute(String name) 删除一属性及其属性值

  5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本号

  6 String getRealPath(String path) 返回一虚拟路径的真实路径

  7 ServletContext getContext(String uripath) 返回指定WebApplication的application对象

  8 int getMajorVersion() 返回服务器支持的Servlet API的最大版本号

  9 int getMinorVersion() 返回服务器支持的Servlet API的最大版本号

  10 String getMimeType(String file) 返回指定文件的MIME类型

  11 URL getResource(String path) 返回指定资源(文件及目录)的URL路径

  12 InputStream getResourceAsStream(String path) 返回指定资源的输入流

  13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象

  14 Servlet getServlet(String name) 返回指定名的Servlet

  15 Enumeration getServlets() 返回所有Servlet的枚举

  16 Enumeration getServletNames() 返回所有Servlet名的枚举

  17 void log(String msg) 把指定消息写入Servlet的日志文件

  18 void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件

  19 void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件

  7.exception对象

  exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象

  序号 方 法 说 明

  1 String getMessage() 返回描述异常的消息

  2 String toString() 返回关于异常的简短描述消息

  3 void printStackTrace() 显示异常及其栈轨迹

  4 Throwable FillInStackTrace() 重写异常的执行栈轨迹

  8.pageContext对象

  pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。

  序号 方 法 说 明

  1 JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)

  2 HttpSession getSession() 返回当前页中的HttpSession对象(session)

  3 Object getPage() 返回当前页的Object对象(page)

  4 ServletRequest getRequest() 返回当前页的ServletRequest对象(request)

  5 ServletResponse getResponse() 返回当前页的ServletResponse对象(response)

  6 Exception getException() 返回当前页的Exception对象(exception)

  7 ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config)

  8 ServletContext getServletContext() 返回当前页的ServletContext对象(application)

  9 void setAttribute(String name,Object attribute) 设置属性及属性值

  10 void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值

  11 public Object getAttribute(String name) 取属性的值

  12 Object getAttribute(String name,int scope) 在指定范围内取属性的值

  13 public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL

  14 void removeAttribute(String name) 删除某属性

  15 void removeAttribute(String name,int scope) 在指定范围删除某属性

  16 int getAttributeScope(String name) 返回某属性的作用范围

  17 Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举

  18 void release() 释放pageContext所占用的资源

  19 void forward(String relativeUrlPath) 使当前页面重导到另一页面

  20 void include(String relativeUrlPath) 在当前位置包含另一文件

  9.config对象

  config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

  序号 方 法 说 明

  1 ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象

  2 String getInitParameter(String name) 返回初始化参数的值

  3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举     

4.3 mysql数据库

4.3.1 mysql概述

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内。这样就增加了速度并提高了灵活性。MySQL的SQL“结构化查询语言”。SQL是用于访问数据库的最常用标准化语言。MySQL软件采用了GPL(GNU通用公共许可证)。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

 

4.3.2 mysql常用命令

1:使用SHOW语句找出在服务器上当前存在什么数据库:
mysql> SHOW DATABASES;
2:2、创建一个数据库MYSQLDATA
mysql> CREATE DATABASE MYSQLDATA;
3:选择你所创建的数据库
mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的数据库中存在什么表
mysql> SHOW TABLES;
5:创建一个数据库表
mysql> CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
mysql> DESCRIBE MYTABLE;
7:往表中加入记录
mysql> insert into MYTABLE values (”hyq”,”M”);
8:用文本方式将数据装入数据库表中(例如D:/mysql.txt)
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE MYTABLE;
9:导入.sql文件命令(例如D:/mysql.sql)
mysql>use database;
mysql>source d:/mysql.sql;
10:删除表
mysql>drop TABLE MYTABLE;
11:清空表
mysql>delete from MYTABLE;
12:更新表中数据
mysql>update MYTABLE set sex=”f” where name=’hyq’;

以下是无意中在网络看到的使用MySql的管理心得,
在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqld start”命令,注意启动者应具有管理员权限。
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use mysql;
delete from User where User=”";
update User set Password=PASSWORD(’newpassword’) where User=’root’;
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令:
mysql -uroot -p;
mysql -uroot -pnewpassword;
mysql mydb -uroot -p;
mysql mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的数据库的名称。
在 进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技 术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用 户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by “password” ;
grant usage on *.* to NewUserName@HostName identified by “password”;
grant select,insert,update on mydb.* to NewUserName@HostName identified by “password”;
grant update,delete on mydb.TestTable to NewUserName@HostName identified by “password”;
若 要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段, 也可以使用REVOKE操作。
下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录–其它什么也不允许做。

5 系统实现

5.1 用户登陆流程

在浏览器上输入网址http://localhost:8080/online_mall/Login.jsp后会进入如下流程。

 
  

 

 

 

 

 

 

 

 

 

 

 

 

 

5.2  买家登陆流程

 

 图5-2买家登陆界面

查询结果:

 

 

 

图5-3买家商品查看界面

 

 

 

 

图5-4买家商品具体信息界面

 

图5-5买家商品卖家具体信息界面

 

 

5.3  卖家登陆流程

 

 

 图5-6卖家登陆界面

查询结果:

 

图5-7卖家商品管理界面

 

 

 

图5-8卖家新增商品信息界面

 

 

图5-9卖家商品信息修改界面

 

5.4 用户注册流程

5.4.1 用户注册流程图

   

其具体的流程如图5-10,界面如图:

 

 

图5-10用户注册界面

 

 

 

 

5.5 数据库表单创建语句

5.5.1一个卖家表  存储卖家信息

create table mall_Sellers(

   SeId int primary key auto_increment not null,

   SeName varchar(30),

   SeSex  varchar(10),

   SePass varchar(20),

   SeLevel  int,

   SeAddress

 varchar(50),

   SeAge int

);

 

 

5.5.2一个买家表  存储买家信息

create table mall_Buyers(

   BuyId int primary key auto_increment not null,

   BuyName varchar(30),

   BuySex  varchar(10),

   BuyPass varchar(20),

   BuyLevel  int,

   BuyAddress

 varchar(50),

   BuyAge int

);

5.5.3一个商品表   存储所有 卖家的商品信息

create table mall_Goods(

   GoodId int primary key auto_increment not null,

   GoodName varchar(30),

   GoodPrice  float,

   Goodintroduction

 varchar(100),

   SeId  int,

   Goodkinds

 varchar(20),

   Goodinventory

 int,

   foreign key(SeId) references mall_sellers(SeId)

);

6 网上商城系统设计的技术关键

6.1 JSP主要网页代码

 

6.1.1买家登陆主页BuyerMallList.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib uri="WEB-INF/c.tld" prefix="c" %>

<%@ page import="online.mall.DTO.*" %>

<%

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 'BuyerMallList.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>

  <form name="form1" action="" method="post">

       <table align="center" 1" bordercolor="red">

           <tr>

              <td colspan="6" align="center" >

           </tr>

           <tr>

              <td colspan="10" align="center" >

                  <font size="9" color="red" >产品列表 </font>                     

              </td>

           </tr>

           <tr>

              <td class="td" align="center">

                  <font  color="red" >产品ID   </font>                        

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品名称  </font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品价格  </font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品种类</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品库存</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品介绍</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >卖家信息</font>

              </td>

              <td class="td" colspan="2" align="center">

                  <font  color="red" >查看信息  </font>

              </td>

           </tr>

           <c:forEach var="good" items="${bGoodThisPageList}" >

           <tr>

              <td align="center" >

                  ${good.goodId }

              </td>

              <td align="center" >

                  ${good.goodName }                  

              </td>

              <td align="center" >

                  ${good.goodPrice }

              </td>

              <td align="center" >

                  ${good.goodkinds }

              </td>

              <td align="center" >

                  ${good.goodinventory }

              </td>

              <td align="center" >

                  ${good.goodintroduction }

              </td>

              <td align="center" >

                  ${good.goodSeId }

              </td>

               <td align="center" >

                  <a href="DoFindBygoodIdSer?id=${good.goodId }" >产品详情</a>

              </td>

              <td align="center" >

                  <a href="DoFindBySeIdSer?id=${good.goodSeId }" >卖家详情</a>

              </td>

           </tr>

           </c:forEach>

           <% //}%>

           <tr>

              <td colspan="10" align="center" >

              当前第 <font color="red" >${currentpage }</font>  页

                  <a href="BuyerListServelet?currentpage=1" >首页</a>

                  <a href="BuyerListServelet?currentpage=${currentpage-1 }" >上一页</a>

                  <a href="BuyerListServelet?currentpage=${currentpage+1 }" >下一页</a>

                  <a href="BuyerListServelet?currentpage=${lastpage }" >尾页</a>

                  跳转第<input type="text" id="pageno" name="currentpage" value="${currentpage }" size="1" > 页

                  <input type="button" id="go" value="GO" οnclick="gotoo();" >

              </td>

           </tr>

       </table>

   </form>

  </body>

  <script type="text/javascript">

    function $(id){

       return document.getElementById(id);

    }

    function chck(){

        var form = document.getElementById("form1");

       var ones = document.getElementsByName("one");

       var n = 0;

       for(var i = 0;i<ones.length;i++){

           if(ones[i].checked){

              n++;

           }

       }

       if(n==0){

           alert("请勾选");

       }else{

           form.action = "DoDeleteServlet";

           form.submit();

       }

    }

    function gotoo(){

       var pageno = $("pageno").value;

       var form = $("form1");

       if(pageno.match(/[0-9]*/)==pageno&&pageno!=""){

           form.action = "BuyerListServelet";

           form.submit();

       }else{

           alert("必须为整型数字");

       }

    }

  </script>

</html>

6.1.2卖家登陆主页SellerMallList.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib uri="WEB-INF/c.tld" prefix="c" %>

<%@ page import="online.mall.DTO.*" %>

<%

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 'SellerMallList.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>

  <form name="form1" action="" method="post">

       <table align="center" 1" bordercolor="red">

           <tr>

              <td colspan="9" align="center" >

                  <font size="9" color="red" >产品列表 </font>                     

              </td>

           </tr>

           <tr>

              <td  align="center">

                  <input type="checkbox" id="all" name="all" value="" οnclick="getAll();" >                 

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品ID   </font>                        

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品名称  </font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品价格  </font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品种类</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品库存</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >产品介绍</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >卖家 编号</font>

              </td>

              <td class="td" align="center">

                  <font  color="red" >操作  </font>

              </td>

           </tr>

           <c:forEach var="good" items="${sGoodThisPageList}" >

           <tr>

               <td  align="center">

                  <input type="checkbox" id="one" name="one" value="${good.goodId }" >                

              </td>

              <td align="center" >

                  ${good.goodId }

              </td>

              <td align="center" >

                  ${good.goodName }                  

              </td>

              <td align="center" >

                  ${good.goodPrice }

              </td>

              <td align="center" >

                  ${good.goodkinds }

              </td>

              <td align="center" >

                  ${good.goodinventory }

              </td>

              <td align="center" >

                  ${good.goodintroduction }

              </td>

              <td align="center" >

                  ${good.goodSeId }

              </td>

              <td align="center" >

                  <a href="DoFindBygoodIdSer?id=${good.goodId }" >修改产品信息</a>

              </td>

           </tr>

           </c:forEach>

           <% //}%>

           <tr>

              <td colspan="9" align="center" >

              当前第 <font color="red" >${currentpage }</font>  页

                  <a href="SellerListServlet?currentpage=1" >首页</a>

                  <a href="SellerListServlet?currentpage=${currentpage-1 }" >上一页</a>

                  <a href="SellerListServlet?currentpage=${currentpage+1 }" >下一页</a>

                  <a href="SellerListServlet?currentpage=${lastpage }" >尾页</a>

                  跳转第<input type="text" id="pageno" name="currentpage" value="${currentpage }" size="1" > 页

                  <input type="button" id="go" value="GO" οnclick="gotoo();" >

              </td>

           </tr>

           <tr>

              <td colspan="9" align="center" >

                  <input type="button" id="sbbut" value="删除" οnclick="chck();" > 

                  <input type="button" id="but" value="新增" οnclick="window.location='Goodadd.jsp';" >          

              </td>

           </tr> 

       </table>

   </form>

  </body>

  <script type="text/javascript">

    function $(id){

       return document.getElementById(id);

    }

 

    function getAll(){

       var allObj = document.getElementById("all");

       var ones = document.getElementsByName("one");

       for(var i = 0;i<ones.length;i++){

           if(allObj.checked){

              ones[i].checked = true;

           }else{

              ones[i].checked = false;

           }

       }

    }

 

    function chck(){

        var form = document.getElementById("form1");

       var ones = document.getElementsByName("one");

       var n = 0;

       for(var i = 0;i<ones.length;i++){

           if(ones[i].checked){

              n++;

           }

       }

       if(n==0){

           alert("请勾选");

       }else{

           form.action = "SelrDeleteServlet";

           form.submit();

       }

    }

 

    function gotoo(){

       var pageno = $("pageno").value;

       var form = $("form1");

       if(pageno.match(/[0-9]*/)==pageno&&pageno!=""){

           form.action = "SellerListServlet";

           form.submit();

       }else{

           alert("必须为整型数字");

       }

    }

  </script>

</html>

6.1.3网页扩展网页OhterWebSites.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 'OhterWebSites.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>

    <form name="form1" action="" method="post" >

    <table align="center" 0" bordercolor="red" >

        <tr>

           <td  align="center" >

               <input type="button" id="rebut" value="网站大全"

           </td>

        </tr>

        <tr>

           <td  align="center" >

               <input type="button" id="rebut" value="新浪" οnclick="window.location='http://www.sina.com.cn/'" > 

           </td>

        </tr>

        <tr>

           <td  align="center" >

               <input type="button" id="rebut" value="百度" οnclick="window.location='http://www.baidu.com/'" > 

           </td>

        </tr>

        <tr>

           <td  align="center" >

               <input type="button" id="rebut" value="搜狐" οnclick="window.location='http://www.sohu.com/'" > 

           </td>

        </tr>

        <tr>

           <td  align="center" >

               <input type="button" id="rebut" value="网易" οnclick="window.location='http://www.163.com/'" > 

           </td>

        </tr>

        <tr>

           <td  align="center" >

               <input type="button" id="rebut" value="优酷" οnclick="window.location='http://movie.youku.com/'" > 

           </td>

        </tr>

    </table>

    </form>

  </body>

</html>

 

6.2 mysql数据库表单截图

6.2.1数据库截图

 

6.2.2数据库截图mall_buyers表

 

 

6.2.3数据库截图mall_sellers表

 

 

6.2.3数据库截图mall_goods表

 

6.3 Java语言控制主要类代码

6.3.1 DoLoginServelet登陆判断

package online.mall.Servelet;

 

import java.io.IOException;

import java.sql.Connection;

import java.sql.SQLException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import online.mall.DAO.BuyersDao;

import online.mall.DAO.SellersDao;

import online.mall.DAOFactory.DaoFactory;

import online.mall.DTO.BuyersDto;

import online.mall.DTO.SellersDto;

import online.mall.Datautil.DataSourceFactory;

public class DoLoginServelet extends HttpServlet {

    public void destroy() {

       super.destroy(); // Just puts "destroy" string in log

       // Put your code here

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       this.process(request,response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       this.process(request,response);

    }

    public void process (HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

//     定义一个连接

       Connection conn = null;

//     获得Login.JSP上的一些属性值

       String BuyerORSeller =request.getParameter("ra")==null?"":request.getParameter("ra").toString();

       String username = request.getParameter("userName")==null?"":request.getParameter("userName").toString();

       String userpass = request.getParameter("userName")==null?"":request.getParameter("userName").toString();     

       try {

           conn = DataSourceFactory.getDataSource().getConnection();

//            判断用户是买家还是卖家并进入相应买家或卖家页面

           if(BuyerORSeller.equals("A")){

              BuyersDao buyerA = DaoFactory.getBuyer(conn);

              BuyersDto buyerT=buyerA.checkLogin(username, userpass);

              if(buyerT!=null){

                  HttpSession session = request.getSession();

                  request.getSession().setAttribute("buyers",buyerT); 

                  request.getSession().setAttribute("mark",BuyerORSeller)        request.getRequestDispatcher("BuyerListServelet").forward(request, response);

              }else{

                  response.sendRedirect("Login.jsp");

              }

           }else if(BuyerORSeller.equals("B")){

              SellersDao sellera = DaoFactory.getSeller(conn);

              SellersDto sellerT=sellera.checkLogin(username, userpass);

              if(sellerT!=null){

                  HttpSession session = request.getSession();

                  request.getSession().setAttribute("sellers",sellerT);

                  request.getSession().setAttribute("mark",BuyerORSeller);    request.getRequestDispatcher("SellerListServlet").forward(request, response);

              }else{

                  response.sendRedirect("Login.jsp");

              }

           }else{

              response.sendRedirect("Login.jsp");

           }

       } catch (SQLException e) {

           e.printStackTrace();

       }  

    }

    public void init() throws ServletException {

       System.out.println("init被调用");

    }

}

 

 

6.3.2 BuyerListServelet买家登陆主页

 

package online.mall.Servelet;

 

import java.io.IOException;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import online.mall.DAO.GoodsDao;

import online.mall.DAOFactory.DaoFactory;

import online.mall.DTO.GoodsDto;

import online.mall.Datautil.DataSourceFactory;

public class BuyerListServelet extends HttpServlet {

 

    public void destroy() {

       super.destroy();

    }

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       this.process(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       this.process(request, response);

    }  

    public void process(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

       int num = 0;

       int lastpage = 1;

       String cpage = request.getParameter("currentpage")==null?"1":request.getParameter("currentpage");

       int currentpage = Integer.parseInt(cpage);

       List<GoodsDto> bGoodList = new ArrayList<GoodsDto>();

       Connection conn = null;

       try {

           conn = DataSourceFactory.getDataSource().getConnection();

           GoodsDao bDao = DaoFactory.getGood(conn);

           num = bDao.getRecordNum();

           if(num%10==0){

              lastpage = num/10;

           }else{

              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);

          

       } catch (SQLException e) {

           e.printStackTrace();

       }

    }

    public void init() throws ServletException {

    }

}

7 系统试运行结果与评价

经过半个月的系统设计和开发,网上商城开发完毕。经测试和试运行,其功能运行良好。

转载于:https://www.cnblogs.com/qq1225467431/p/10217276.html