基于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, 其源代码如下:
  /******************************************************************
  *Servlet 示例:PopulateBeanServlet.java
  *这个servlet创建一个名为 dataBean 的DataBean 实例,设置dataBean的若干个属性,
  *将dataBean放置在当前“请求”对象中,
  *调用 JSP 文件(DisplayData.jsp)来格式化并显示dataBean的数据
  ********************************************************************/
  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
  } /* end of class PopulateBeanServlet */

  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" border="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" border="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" border="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

基于JAVA与JSP下的网上商城设计相关推荐

  1. 基于JAVA+Servlet+JSP+MYSQL的网上书城

    软件架构说明 本项目是基于javaee运用jsp,ajax,servlet,mysql等技术编写,由个人独立完成 使用说明 本项目包含图书资源等数据 sql文件位于web-inf/sql下 项目前台页 ...

  2. 基于JAVA+Servlet+JSP+MYSQL的网上心理咨询系统

    技术:java.jsp.jdbc 数据库:mysql web服务器:Tomcat 集成开发工具:myeclipse

  3. 基于Java、JSP的美食网的设计

    技术:Java.JSP等 摘要: 越来越多的美食爱好者希望能够在网络平台上更多地了解到美食方面的信息以及如何更加健康地饮食性.随着计算机网络的飞速发展,美食网已经成为人们日常生活中必不可少的部分,也逛 ...

  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上商城系统

    项目功能: 商城功能包含前后台,前台用户登录注册.浏览商品.加入购物车.提交订单,后台管理员用户管理.商品分类管理.商品管理.属性管理.订单发货管理等 页面效果:

  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的网上商城系统

    项目功能: 前台: 登录注册 商品浏览 分类筛选 随机推荐 查看商品详情 加入购物车 提交订单 添加收货地址 后台: 管理员登录 商品管理 轮播图管理 热销产品管理 为你推荐配置 商品分类管理 订单管 ...

  6. 基于JAVA+Servlet+JSP+MYSQL的网上订餐管理系统

    项目功能: 系统包括用户登录注册,首页查看菜品,加入购物车,提交订单,订单查询(未消费.已消费),修改个人信息,修改密码,修改配送地址,管理员登录,添加管理员,删除管理员,添加菜品,修改菜品,推荐菜品 ...

  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上商城

    项目功能: 系统包括用户登录注册,首页商品列表展示,按分类筛选商品,搜索商品,查看商品详情,加入购物车,添加收货地址,提交订单,支付,查看我的订单,后台管理员登录,系统设置,用户管理,系统日志,订单管 ...

  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上试衣间设计

    项目功能: 目的能在系统上完成简单的试衣效果,传输身高体重数据,在系统上显示试穿衣服的视频效果.管理员先按照身高体重添加好试穿衣服的视频信息,然后用户登录后输入自己的身高体重,查询数据库对应的穿衣视频 ...

  9. 基于java+SSM+jsp的汽车维修系统的设计和实现(附源码)

最新文章

  1. 来了解下AbstractList
  2. python3 多进程共享变量实现方法
  3. 单片机蓝牙初始化_单片机程序那些事
  4. 窗口消息——Windows核心编程学习手札之二十六
  5. Java中如何将List拆分为多个小list集合
  6. java window linux_java环境变量配置(Windows Linux)
  7. NSFetchedResultsController和UITableView显示CoreData的数据时用relationship分组的方法
  8. java 关闭时_java – 活动关闭时服务停止
  9. 常见的运行时异常 java 1615309080
  10. CSS media queries
  11. Oracle存储过程介绍
  12. Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法
  13. python找不到指定文件夹_python找不到指定文件
  14. BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )
  15. C++ explicit关键字详解(用于构造函数)
  16. 测试对于list的sort与sorted的效率
  17. paip.session的调试in php
  18. 《千字文》 梁•周兴嗣
  19. blast2go mysql_blast2go本地化-2017教程
  20. 面试阿里,总结vue实现打印功能的两种方法,成功拿下offer!

热门文章

  1. 【2023计算机考研】985院校录取分数线汇总
  2. Scale up and Scale out
  3. Vscode配置js代码格式化失效问题,例如方法后面跟空格javascript.format.insertSpaceBeforeFunctionParenthesis
  4. jad环境变量配置_Java Jad 反编译
  5. 雷军20+年前作文:我会当一辈子程序员
  6. linux seq_file机制学习
  7. .NET应用程序--Helloworld(C#)
  8. Python剪刀、石头、布游戏
  9. 【STM32+cubemx】0007 HAL库开发:外部中断,优先级和中断向量表
  10. [生物工程与基因]安徒生童话-海的女儿