基于java图书销售管理系统设计与实现

news2024/11/17 14:43:56

1引言 

随着Internet国际互联网的发展,越来越多的企业开始建造自己的网站。基于Internet的信息服务,商务服务已经成为现代企业一项不可缺少的内容。很多企业都已不满足于建立一个简单的仅仅能够发布信息的静态网站。现代企业需要的是一个功能强大的,能提供完善的电子商务服务的动态商务网站。同时人们的生活方式也在随着发生改变,传统的购物方式已不能满足人们的需求。  

JSP是Sun公司推出的一种网站开发技术,Sun公司借助自己在Java上的不凡造诣,又把人们引进JSP时代,JSP即Java Server Page,它可以在Servlet和JavaBean的支持下,完成功能强大的Web应用程序。所以,在我的毕业设计中,我采用了JSP作为开发工具,构建了一个能实现基本的电子商务的小型动态商务网站——网上图书销售系统。该系统能实现用户的注册、登录功能;能够实现商品的查询,订购等功能。该系统基本上具备一个网上商品销售系统应该具备的常用功能,该设计项目基本上体现了构建一个动态商务网站所需要的技术,可以说,目前的大型商务网站也就是我们这个小型网站在内容上的扩充和完善。

2 概述 

随着时代的发展,信息技术、Internet/Intranet技术、数据库技术的不断发展完善,网络进程的加快,传统的购物方式也越来越不能满足人们快节奏的生活需求,使得企业的IT部门已经认识到Internet的优势,电子商务就是在这样一个背景下产生发展起来的。伴随着电子商务技术的不断成熟,电子商务的功能也越来越强大,注册用户可以在网上搜索购买到自己想要的各种商品,初步让人们体会到了足不出户,便可随意购物的快感。我的毕业设计也就正是一个电子商务系统的开发---网上图书销售系统。

3 系统分析

3.1 可行性分析

商业企业在运营过程中,经常会受到以下一些条件的限制:

  1. 产品的宣传受到限制,采购商或顾客只能通过上门咨询、电话沟通等方式进行各种信息的获取,受一定的时间与物理空间的局限并且成本较高。
  2. 庞大的商业经济周转。
  3. 复杂的产品周转渠道。从看样品、谈价格到支付货款等一系列的产品周转渠道过于复杂,企业与顾客之间缺乏全面的沟通与快捷运营的平台。
  4. 商业企业中根据季节的变化,热销商品在销售高峰到来时货源紧张,企业需要实时了解商品的销售情况,保证热销商品的要货满足率。

因此,企业需要重新认识市场、消费者以及自身市场定位,正确认识电子商务技术在企业中的重要地位,以少量的时间和资金建立企业信息门户网站并架设一定范围的商务网络,以此来制定长远发展战略,使企业与顾客间的经济活动变得更灵活、更主动。

本系统是一个中小型的电子商务系统----网上书店,可以为各类用户提供方便的在线买书环境,符合目前国内流行的电子商务模式。用户可以在系统中实现注册、浏览商品、搜索查询商品、下定单、处理定单等功能;管理员可以通过用户管理、定单管理、商品管理、评论管理等管理功能来对系统进行维护更新。

在技术上,目前市场上开发电子商务平台的技术很多,如ASP,PHP,PB,.NET等。我采用SUN公司的JSP技术,它是目前市场上最流行的技术之一,JSP具有一次编译,处处运行的优点[4]。

由分析可得,不论是商业还是技术上,网上图书销售系统的开发都是可行的。

3.2需求分析

通过对电子商务网站及网上书店的考察、分析以及实际的市场调查,要求本系统具有以下功能:

  1. 统一友好的操作界面,能保证系统的易用性。
  2. 规范、完善的基础信息设置。
  3. 图书分类详尽,可按不同类别查看商品信息。
  4. 按图书大类及图书名称进行模糊查询。
  5. 实现网上购书。
  6. 新书及特价图书展示。

4 概要设计

4.1 系统设计目标

对于典型的数据库管理系统,尤其是对像电子商务这样的数据流量特别大的网络管理系统,必须要满足使用方便、操作灵活等设计要求。本系统在设计时应该满足以下几个目标:

  1. 采用人机对话的操作方式,界面设计美观友好、信息查询灵活、方便、快捷、准确、数据存储安全可靠。
  2. 全面展示书店内所有的图书,并可展示最新图书及特价图书。
  3. 为顾客提供一个方便、快捷的图书信息查询功能。采用模糊查询查询数据。
  4. 实现网上购物。
  5. 商品销售排行,以方便顾客了解本商城内的热销商品及帮助企业领导者做出相应的决策。
  6. 查看商城内的公告信息。
  7. 用户随时都可以查看自己的订单。
  8. 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
  9. 系统最大限度地实现了易维护性和易操作性。
  10. 系统运行稳定、安全可靠。

4.2 系统设计思想

本系统采用三层架构设计[4],它的工作原理如图4.1所示。

图4.1 三层结构原理图

采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。这样用户界面层甚至可以不知道数据库的结构,它只要维护与业务层之间的接口即可。

4.3 系统功能模块划分

根据需求分析及三层架构设计的思想,设计出客户系统功能如图4.2

图 4.2 客户端系统

图4.3 后台管理系统功能图

4.4系统结构设计

根据面向对象和三层结构设计的思想,可得出如图4.4所示的系统结构设计图。

                                 图4.4 系统结构图

4.5系统功能简介

4.5.1系统基本功能

1)图书信息查询

该模块实现图书信息的分类显示,提供最新商品的推荐显示以及销售显示,便于引导购物取向。此外,还提供依据图书名称或是编号等包含关键字实现快速搜索的功能并显示图书的有关详细信息。

2)购物车管理

用于对每一个进入系统的用户所对应的购物车进行管理。将用户所选购的图书信息,包括价格、数量等信息记录到对应的购物车上,便于到收银台进行结帐处理。同时在此模块中,用户还可以方便的实现修改购物图书、清空购物车等操作。

3)会员信息管理

实现系统相关用户信息的注册及身份验证,同时也提供对应的用户资料的更新。该系统可以收集用户相关的联系方式、通讯地址等信息,可以更好的拓展销售规模。

4)订单处理

根据购物车中的信息,以及用户所选择的送货方式和付款方式,和用户对应的个人信息生成订单,便于后续工作的处理。在该模块中,用户可以随时查阅自己的订单,并对其进行取消等处理操作。

4.6 数据库设计

数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致[10]。

4.6.1 数据库需求分析

针对网上图书销售系统的需求分析,得出如下需求信息。

订单分为单张详细订单和总订单。

  • 一个用户可以购买多本图书。
  • 一个用户对应一张订单。
  • 一个列表对应多张订单。

针对本系统功能分析,总结出如下的需求信息。

  • 用户,包括数据项:用户ID、用户名、密码。
  • 图书,包括数据项:图书编号、图书名、价格、图书介绍。
  • 订单列表,包括数据项:订单编号、图书编号、购书数量。
  • 订单,包括数据项:订单编号、用户编号、下单时间。

4.6.2 数据库概念结构设计

从本系统中规划出的实体有:用户信息实体、管理员信息实体、图书实体、图书分类实体、订单实体、订单列表实体。

实体之间关系的E-R图如图4.5所示

                                          图4.5  实体之间的E-R图

     管理员实体的E-R图,如图4.6所示。

    图书分类实体的E-R图,如图4.7所示。

用户信息实体的E-R图,如图4.8所示。

图书实体的E-R图,如图4.9所示。

订单实体的E-R图,如图4.10所示。

订单列表实体的E-R图,如图4.11所示。

          图4.6  管理员实体的E-R图                   

4.7  数据库逻辑结构设计

本系统数据库采用SQL Server 2000数据库,系统数据库名称为bookshop,下面分别给出数据表概要说明、数据表关系概要说明及主要数据表的结构。

1、 数据表概要说明

数据表树型结构图如图4.12所示,该数据表树型结构图包含系统所有的数据表

 图4.12 数据表树型结构图  

2、各个表的的结构如下表

表4.1为图书信息列表,记录书店现有的图书信息。

表4.1 Book表

列名

数据类型

长度

允许空

注释

ID

Int

4

图书编号

BookName

varchar

40

图书名称

BookClass

Int

4

图书分类

Author

Varchar

25

作者

Publish

Varchar

150

出版社

BookNo

Varchar

30

书号

Content

text

300

内容

Price

float

8

价格

Amount

int

4

总数量

Leav_number

int

4

剩余数量

RegTime

datatime

8

注册时间

Picture

varchar

60

封面

表4.2为书店管理员信息表,记录管理员的帐号和密码。

                               表4.2  BookAdmin表

列名

数据类型

长度

允许空

注释

Adminuser

Varchar

20

管理员

AdminPass

Varchar

20

管理员密码

表4.3为用户信息表,记录用户的基本信息。

表4.3  用户表

列名

数据类型

长度

允许空

注释

ID

Int

2

用户编号

UserName

Varchar

50

用户名

passWord

Varchar

50

密码

Names

Varchar

50

真名

Sex

Varchar

50

性别

Address

Varchar

50

地址

Phone

Varchar

50

电话

Post

Varchar

50

邮编

Email

Varchar

50

电子邮件

RegTime

Datatime

50

注册时间

RegIPAddress

varchar

50

注册IP地址

表4.4为订单总表,记录某个用户的订单总信息。

                           表4.4 订单总表

列名

数据类型

长度

允许空

注释

ID

Int

4

 否

总订单编号

OrderID

Int

4

订单号

BookNo

Int

4

书号   

Amount

int

4

数量

表4.5为订单表,记录但张订单的具体信息。

表4.5  订单表

列名

数据类型

长度

允许空

注释

ID

Int

4

订单ID

OrderID

Varchar

50

总订单ID

UserId

Varchar

50

用户ID

SubmitTime

Datatime

8

提交时间

ConsignmentTime

Datatime

8

购买时间

TotalPrice

Float

16

总价格

content

Text

300

描述

Ipaddress

Varchar

50

Ip 地址

Ispayoff

Varchar

50

是否付款

IsAddress

varchar

20

是否发货

表4.6为图书分类表,记录书店现有图书的分类。

表4.6 Bookclass表

列名

数据类型

长度

允许空

注释

ID

Varchar

30

分类编号

ClassName

varchar

30

分类名

5 详细设计

5.1 开发技术简介

5.1.1 JSP简介

JSP(Java Server Pages)是由Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准,JSP技术在Servlet技术基础上发展起来的,它正在飞速发展中,现已成为Java服务器编程的重要组成部分。它虽然还未成型,但是它必将和J2EE(Java 2 Enterprise Edition)一起发展[6]。

JSP是结合markup(HTML和XML)和Java代码来处理一种动态页面。每一页第一次被调用时,通过JSP引擎自动被编译成Servlet,然后被执行,以后每次调用时,执行编译过的Servlet。JSP提供了多种方式访问Java class、Servlet、Applets和Web Server,因此,Web应用的功能可以分成多个明确定义公用接口的组件,通过JSP将它们结合在一起[9]。

5.1.2 JSP的运行原理

在JSP第一次获得来自于客户端浏览器的请求时,JSP文件将被JSP引擎(JSP engine)转换成一个Servlet,即将”.jsp”文件编译成Java Class文件。当Servlet引擎接收到请求后,如果设置了使用最新的JSP,它就会去找JSP文件,检查该文件在上次编译后是否改动过。如果改动过,就会重新编译生成新的Servlet,最终将请求转交给编译好的Servlet引擎执行[1]。如图5.1

图5.1 JSP运行原理图

在编译时如果发现JSP文件有任何语法错误,转换过程将中断,并向客户端发出出错信息;如果编译成功,则所转换产生的Servlet代码被编译,然后该Servlet被JSP引擎加载到内存中。此时JSP引擎还请求了jspInit()方法的执行,并对此Servlet初始化。JspInit()方法在Servlet的生命周期中只被请求一次,然后将被调用来处理客户端的请求和回复操作。对于所有随后对该JSP文件的请求,服务器将检查该JSP文件自最后一次被存取后是否经过修改。如果没有修改,则将请求交还给还在内存中的Servlet的jspService()方法,执行回复操作。由于Servlet始终驻于内存,所以响应是非常快的。Jsp页面在第一次访问时由于要转化和编译,运行速度较慢,但是当第二次访问该页时,由于文件已经被编译成字节码文件了,所以速度非常得快。

5.1.3 JSP页面的组成

 JSP页面看上去像标准的HTML和XML页面,并附带有JSP引擎能够处理和解析执行的代码与组件。通常,JSP代码和组件用于创建在最终页面上显示的文本。通常来说,JSP页面包括模板元素,指令元素,动作元素,Scritptlets,声明,表达式和JSP内建对象。

1)模板元素:模板元素是指JSP的静态HTML或者XML[4] 。

    2)指令元素:使用指令元素来设置全局变量,声明类、要实现的方法和输出内容的内型,它们并不向客户端产生任何输出,所有指令在文件范围内有效,JSP指令的一般语法形式为:<%@directivename attribute=value,attribute=value%>。

3)动作元素(标识):动作元素用于执行某些动作。在JSP规范中有2种类型的动作指令的标识。第一种是标准动作,它定义的是无论在什么版本的JSP引擎或Web服务器下总是可用的动作。第二种是自定义动作,它通过使用taglib指令来实现。例如JSP:useBean;JSP:setProperty;JSP:getProperty就是标准动作。

4)声明:用于声明合法的变量和方法。与任何语言相同,JSP语言使用变量来保存数据。这些变量用declaration元素声明,声明的语法为<%! declaration(s) %>。当页面被初始化的时候,JSP页面中的所有声明都被初始化。除了简单的变量,方法也能被声明。声明不对当前的输出流产生任何影响。

5)表达式:通过计算表达式所得到的结果来表示某个值。表达式的形式为:<%=expression%>。表达式求值的结果被强制转换为一个字符串,并插入到当前的输出流中。

6)程序段:JSP可以在页面中包含的一段程序,称之为程序段。程序段是一个代码片断,在请求的处理过程中被执行。程序段可以和页面中的静态元件组合起来创建动态生成的页面。程序段在“<% %>”中定义,在这对标识中的所有东西都会被当成JSP程序执行。

5.1.4 JavaBean技术介绍

JavaBean技术是一种基于Java的组件技术,JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据的提取,以及封装事务逻辑等,可以很好的实现业务逻辑和前台程序的分离使得系统具有更好的健壮性和灵活性,同时也是解决代码重用问题的一种策略。

以前的组件无法实现真正的代码重用,其主要原因就是它们对于处理平台的依赖和对开发语言的依赖过重。由于Java语言在这些方面所具有的特点和优势,使得基于它的软件JavaBean组件技术倍受人们的关注。它的任务就是:一次编写,可以在任何地方执行,

可以在任何地方重用。JavaBean组件可以在任何地方冲用包括了可以在应用程序、其他组件、文档、Web站点和应用程序构造器工具等多种方案中再利用。

为了创建和使用Java软件组件,JavaBean被实现为一种独立于平台和结构的应用程序接口,它的实现可以忽略内部的结构及细节问题,只需要定义其外部的特征及对外功能就行。其中,属性、方法和事件三种接口可以独立对外进行开发。

JavaBean的实质就是一个.class文件,也可以成为类文件。JavaBean以binary格式保存,可以保护Java源代码不容易被他人抄袭[7]。

5.1.5 JSP 的运行环境

要运行Jsp(注意,不是浏览Jsp页面),需要有支持Jsp的服务器。这里分2种情况:一种是自身就支持Jsp的服务器,如Jrun,Weblogic,JSWDK等;而另一种则是在不支持Jsp的服务器上安装Jsp引擎的插件,如在IIS,Apache等服务器上安装WebSphere,tomcat,Resin等插件。其中主流服务器是Weblogic和tomcat.

Weblogic是一款功能强大的服务器软件,配置比较简单,而且Jsp的扩展功能较多,附带了数据库的JDBC驱动程序。,支持JHTML(一种与Jsp十分相似的技术),是目前市场占有率最高的服务器。不过,Weblogic的运行情况不太稳定,使用它调试Jsp文件,出现语法错误或者数据库连接错误时,Weblogic就有可能崩溃。

Tomcat服务器是Apache Group Jakarta小组开发的一个免费服务器软件,适合于嵌入Apache中使用,而且,它的源代码可以免费获得,你可以自由地对它进行扩充。访问的地址 http://jakarta. apache.org/tomacat/index.html, Tomcat服务器的兼容性很好,如WebLogic服务器采用其为Web服务器引擎,Jbuilder将其作为标准的测试服务器,Sun公司也将其作为JSP技术应用的示例服务器。不足之处是它的配置比较麻烦,对系统硬件要求较高,而且有一些安全性的问题没有解决。但是Tomcat服务器有众多大软件公司的支持,而且服务器的性能稳定,其发展前景很好[9]。

5.2 系统主要文件

该购书系统主要有2类文件,一类是Bean文件,我把它们统一放在了bookshop文件夹里,保存在jakarta-tomcat-5.0.27\common\classes\bookshop下,(这是tomcat要求的默认存放Bean的路径),在bookshop文件夹下又有3个包:book,run,util,对Bean文件的一个分类;另一类是jsp文件,保存在jakarta-tomcat-5.0.27\webapps\ROOT。(这是tomcat的默认工作环境)

Book包中的Bean文件:Allorder.java,Book.java,Bookclass.java,Order.java,Shopcar.java,User.java

Util包中的Bean文件:ChStr.java,DataBase.java,DataFormat.java

Run包中的Bean文件Login.java,

Op_book.java,Op_bookclass.java,Op_buy.java,Op_user.java

Jsp文件分为前台文件和后台文件,因文件太多,在此就不列举。

5.3 详细设计及说明

5.3.1 数据库连接Bean的编写[2]

数据库操作的JavaBean是一个公共类,放在bookshop下的util包中,通常包括连接数据库的方法getConnection、执行查询语句的方法executeQuery、执行更新操作的方法executeUpdate、关闭数据库连接的方法close。其实现代码如下:

package bookshop.util;    //将该类保存到package bookshop.util 包中

/**

 * <p>数据库连接专用包 </p>

 * <p>Copyright: wxy Copyright (c) 2007</p>

 * <p>Company:Ling Du book shop online </p>

*/

import java.sql.*;       //导入提供基本的数据库编程服务的包

public class DataBase {

  public Connection conn;    //定义一个Connection对象

  public Statement stmt;     //定义一个Statement对象

  public ResultSet rs=null;  //定义一个ResultSet对象

  public String sqlStr="";   //定义一个字符串,用来保存SQL语句

  public DataBase() {

  this.connect();

  }

 public boolean connect(){

//download by http://www.codefans.net/      try{Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

//加载SQL Server 2000数据库驱动

String url ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bookshop";

//保存连接数据库的URL地址的变量

conn=DriverManager.getConnection(url,”sa”,””);//建立数据库连接

Statement stmt= conn.createStatement ();

       }catch(Exception ee){

        System.out.println("connect db error:"+ee.getMessage());

//检测数据库连接是否成功

        return false;

       }

      return true;

    }

 public static void main(String[] args) {

     try{

            DataBase db = new DataBase();

            db.connect();

          }catch(Exception e){

            e.printStackTrace();

          }

        }

}

5.3.2字符处理Bean的编写

在JSP开发中经常会涉及有关字符串的处理,例如:把字符串转换成适合于网页显示的文本、八字符串转换成适合SQL语句的字符串等等,所以把这些字符串处理方法集中到一个类中。这也是一个公共类[3]。

关键代码如下:

package bookshop.util;

/**

 * <p>负责字符串的处理 </p>

 */

import java.lang.*;

import java.util.*;

public class dataFormat {

  public dataFormat() {  }

  /**

   * 把字符串转换成适合于网页显示的文本

   * @param s

   * @return

   */

  public static String toHtml(String s) {

     if (s==null) return s;

     s=strReplace(s,"&","&");

     s=strReplace(s,"<","<");

     s=strReplace(s,">",">");

     s=strReplace(s,"\"",""");

     s=parseReturn(s,"<br>\n    ");

     return s;

   }

   /**

    * 把字符串sBody中的sFrom用sTo替换

    * @param sBody

    * @param sFrom

    * @param sTo

    * @return

    */

   public static String strReplace(String sBody, String sFrom, String sTo) {

      int i,j,k,l;

      if (sBody==null || sBody.equals("")) return "";

      i = 0;

      j = sFrom.length();

      k = sTo.length();

      StringBuffer sss = new StringBuffer(sBody.length());

      boolean bFirst=true;

      l = i;

      while (sBody.indexOf(sFrom,i)!=-1) {

        i = sBody.indexOf(sFrom,i);

        sss.append(sBody.substring(l,i));

        sss.append(sTo);

        i += j;

        l = i;

      }

      sss.append(sBody.substring(l));

      return sss.toString();

    }

    /**

       * 把字符串中的"\r\n"转换成"\n"

       * @param String sBody  : 要进行替换操作的字符串

       * @param String sEndwith : 要替换成为的字符串

       */

      public static String parseReturn(String sBody, String sEndwith) {

        StringTokenizer t = new StringTokenizer(sBody, "\r\n");

        StringBuffer sss = new StringBuffer(sBody.length());

        boolean bFirst=true;

        if (sEndwith.trim().equals("")) sEndwith="\n";

        while (t.hasMoreTokens()) {

          String s=t.nextToken();

          s=s.trim();

          while (s.startsWith(" ")) s=s.substring(2);

          if (!s.equals("")) {

             if (bFirst) {

              bFirst=false;

            } else {

              sss.append(sEndwith);

            }

            sss.append(s);

         }

        }

        return sss.toString();

      }

      /**

          * 将字符串格式化成 HTML 代码输出

          * 只转换特殊字符,适合于 HTML 中的表单区域

          * @param str 要格式化的字符串

          * @return 格式化后的字符串

          */

         public static String toHtmlInput(String str) {

             if (str == null)    return null;

             String html = new String(str);

             html = strReplace(html, "&", "&");

             html = strReplace(html, "<", "<");

             html = strReplace(html, ">", ">");

             return html;

         }

      /**

     * 将普通字符串格式化成数据库认可的字符串格式

     *

     * @param str 要格式化的字符串

     * @return 合法的数据库字符串

     */

    public static String toSql(String str) {

        String sql = new String(str);

        return strReplace(sql, "'", "''");

    }

}

5.3.3实现用户实体的Bean

1)用户实体Bean,这个类是对用户实体的抽象,它包含了用户实体的所有属性及用户对象初始化构造方法。它们都是和数据库里的shop_user表相对应的,在这个Bean里封装的方法也主要是对这个表进行操作.这些属性都被定义为类的私有成员,外界不可访问[8]

private Long id;

private String userName;

private String userPassword;

    private String Names;

    private String Sex;

    private String Address;

    private String Phone;

   private String Post;

   private String Email;

   private String RegTime;

   private String RegIpAddress;

2)构造函数里对以上私有成员进行初始化:

   Public user()

{

     Id=0;

     UserName=””;

     Password=””;

     Names=””;

     Sex=””;

     Address=””;

     Phone=””;

     Post=””;

     Email=””;

     RegTime=””;

     RegIpAddress=””;

}

……..

其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。

5.3.4实现图书实体的Bean

应用面向对象的思想把具有共性的实体抽象成一个类。这个图书Bean就是对图书实体的抽象,他包含了图书实体的所有属性及图书对象的初始化构造方法,里面的属性和表Book表对应[8]。部分代码如下:

package bookshop.book;

/**

 * <p>图书类 </p>

 */

public class book {

        private long Id; //ID序列号

        private String BookName; //书名

        private int BookClass; //图书类别

        private String classname ;   //图书类别名

        private String Author; //作者

        private String Publish; //出版社

        private String BookNo ; //书号

        private String Content ; //内容介绍

        private float Prince ; //书价

        private int Amount ; //总数量

        private int Leav_number ; //剩余数量

        private String RegTime ; //登记时间

        private String picture ; //图书样图文件的名称

        /**

         * 图书的初始化

         */

        public book() {

                Id = 0;

                BookName = "";

                BookClass = 0;

                classname = "";

                Author = "";

                Publish = "";

                BookNo = "";

                Content = "";

                Prince = 0;

                Amount = 0;

                Leav_number = 0;

                RegTime = "";

        }

        public void setId(long newId){

                this.Id = newId;

        }

        public long getId(){

       }

        ……

其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。

5.3.5 实现图书分类实体Bean

这个类是对图书分类实体的抽象,他包含了图书分类实体的所有属性及图书分类对象的初始化构造方法,它的属性和表Bookclass对应,部分代码如下:

package bookshop.book;

/**

 * <p>图书分类类</p>

 */

public class bookclass {

        private int Id; //ID序列号

        private String ClassName; //图书类别

        public bookclass() {

                Id = 0;

                ClassName = "";

              }

        public bookclass(int newId, String newname) {

                Id = newId;

                ClassName = newname;

              }

……

5.3.6实现订单实体Bean

这个类是对订单实体的抽象,它包含了订单实体的所有属性及订单对象的初始化构造方法。客户每次购买一种商品都会产生一次订购单,它包括订单号,所购买的书号,所购买这种书的数量等,这些构成了这个类的私有属性,这些属性和表Order对应。核心代码如下:

package bookshop.book;

/**

 * <p>订单类 </p>

 */

public class order {

        private long Id; //ID序列号

        private String orderId;         //订单编号

        private long UserId; //用户序列号

        private String SubmitTime; //提交订单时间

        private String ConsignmentTime;         //交货时间

        private float TotalPrice; //总金额

        private String content;         //用户备注

        private String IPAddress; //下单时IP

        private boolean IsPayoff; //用户是否已付款

        private boolean IsSales; //是否已发货

        public order() {            //在构造方法里初始化变量

                Id = 0;

                orderId = "";

                UserId = 0;

                SubmitTime = "";

                ConsignmentTime = "";

                TotalPrice = 0;

                content = "";

                IPAddress = "";

                IsPayoff = false;

                IsSales = false;

        }

        public long getId() {

                return Id;

        }

       ……

其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。

5.3.7 实现订单列表的Bean

 这个类是对订单列表实体的抽象,它包含了订单实体的所有属性及订单列表对象的初始化构造方法,它的属性和表Allorders对应,部分代码如下:

package bookshop.book;

/**

 * <p>Title: </p>

 */

public class allorder {

        private long Id; //ID序列号

        private long orderId; //订单号表序列号

        private long BookNo; //图书表序列号

        private int Amount; //订货数量

        public allorder() {

                Id = 0;

                orderId = 0;

                BookNo = 0;

                Amount = 0;

        }

        public long getId() {

                return Id;

        }

  ………

其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。

5.3.8 实现购物车实体的Bean

在现实生活中,人们去超市买东西,都是把商品放在一个购物篮里,等到把所有要买的东西选购完毕后,一起拿到收银台前付钱。我在程序里定义的购物车实体就是模拟这个功能.作为购物车,购物时间,所购书的总价格都是必不可少的,这个类是对购物车实体的抽象,它包含了购物车的所有属性及购物车对象的初始化构造方法。部分代码如下:

package bookshop.book;

/**

 * <p>Title: </p>

 */

public class shopcar {

 private long bookId; //图书ID编号

 private int quanlity; //选购数量

 public shopcar(){

   bookId = 0;

   quanlity = 0;

  }

  public long getBookId() {

   return bookId;

  }

5.3.9 管理用户登录Bean的编写

这是一个以客户为中心的交易平台,只有成为了系统的合法用户才有使用本系统的权利,因此需要检测每个用户的合法性,管理用户登录这个Bean:Login.java就是要完成这一功能。图5.2为Login类的类图其中只是关键的几个方法。

                                         图5.2

从图4-1中可以看出Login具有的属性和方法,其中login() :void构造函数,getismin为取得属性isadmin的值的方法,即判断登陆用户是否是管理员。其它的是设置和获取属性的方法。其中有两个重要的方法介绍如下:

  1. getSql()方法

根据用户的不同获得不同的查询SQL语句。判断登陆用户是否是管理员,如果是则从管理员信息表中查询数据,否则则从普通用户表中查询数据。实现代码如下:

      /**

         * 获得查询用户信息的sql语句

         * @return

         */

        public String getSql() {

                if (isadmin) {

                        sqlStr = "select * from BookAdmin where adminuser = '" +

                            dataFormat.toSql(username) + "' and adminpass = '" +

                            dataFormat.toSql(passwd) + "'";

                }else {

                        sqlStr = "select * from shop_user where username = '" +

                            username + "' and password = '" + passwd + "'";

                }

                return sqlStr;

        }

   2)Execute()方法

 /**

         * 执行查询

         * @return

         * @throws java.lang.Exception

         */

        public boolean excute() throws Exception

{

      

                boolean flag = false;

                DataBase db = new DataBase();

                db.connect();          //获取一个数据库连接

                Statement stmt = db.conn.createStatement ();

                rs = stmt.executeQuery(getSql());  //rs 里返回查询结果集

                if (rs.next()){

                        if (!isadmin)

                        {

                                userid = rs.getLong("id");

                        }

                        flag = true;

                }

                rs.close();

                return flag;

}

从以上代码中可以看出,构造数据库连接DataBase类的对象,调用其connect()方法获得连接,调用getsql()方法获得SQL语句,然后从数据库中查得用户所需信息。

5.3.10管理图书Bean的编写

该类负责图书的管理,包括图书的修改、查询、删除、和添加等,图5.3为该类的类图[5],其中省去了部分方法,这里只介绍几个重要的方法。

图5.3管理图书op_book类的类图

1)getRequest()方法

 该方法负责从页面接收到的表单资料分解,并设置图书实体的相应属性,它的返回值为Boolean类型,true表示成功,反之表示失败。部分代码如下:

public boolean getRequest(javax.servlet.http.HttpServletRequest newrequest) {

  boolean flag = false;

  try{

   request = newrequest;

   String ID = request.getParameter("id");

   long bookid = 0;

   try{

           bookid = Long.parseLong(ID);

   }catch (Exception e){

   }

   abooks.setId(bookid);

   String bookname = request.getParameter("bookname");

   if (bookname==null || bookname.equals(""))

   {

           bookname = "";

           sqlflag = false;

   }

   abooks.setBookName(to_String(bookname));

   String author = request.getParameter("author");

   if (author==null || author.equals(""))

   {

           author = "";

           sqlflag = false;

   }

   abooks.setAuthor(to_String(author));

   String publish = request.getParameter("publish");;

   if (publish==null)

   {

           publish = "";

   }

   abooks.setPublish(to_String(publish));

   String bookclass = request.getParameter("bookclass");

   int bc = Integer.parseInt(bookclass);

   abooks.setBookClass(bc);

   String bookno = request.getParameter("bookno");

   if (bookno == null)

   {

           bookno = "";

   }

   abooks.setBookNo(to_String(bookno));

   String picture = request.getParameter("picture");

   if (picture == null)

   {

           picture = "images/01.gif";

   }

   abooks.setPicture(to_String(picture));

   float price;

   try {

           price =new Float(request.getParameter("price")).floatValue();

   } catch (Exception e){

           price = 0;

           sqlflag = false;

   }

   abooks.setPrince(price);

   int amount;

   try{

           amount = new Integer(request.getParameter("amount")).intValue();

   }catch (Exception e){

           sqlflag = false;

           amount = 0;

   }

   abooks.setAmount(amount);

   String content = request.getParameter("content");

   if (content == null)

   {

           content = "";

   }

   abooks.setContent(to_String(content));

   if (sqlflag)

   {

           flag = true;

   }

   return flag;

                }catch (Exception e){

   return flag;

                }

        }

 2)book_search()方法

该方法负责图书查询,包括图书的分类,分页、关键字查询。首先通过getRequest()方法获得页面表单参数值,根据参数值判断是何种查询,然后根据相应的SQL的语句从数据库里查询相应的值。这里需要用到分页技术。

部分代码如下:

/**

         * 完成图书查询,包括分类,分页查询

         * @param res

         * @return

         * @throws java.lang.Exception

         */

public boolean book_search(HttpServletRequest res) throws Exception {

   DataBase db = new DataBase();

   db.connect();

   Statement stmt = db.conn.createStatement ();

   request = res;

   String PAGE = request.getParameter("page");   //页码

   String classid = request.getParameter("classid"); //分类ID号

   String keyword = request.getParameter("keyword"); //查询关键词

   if (classid==null) classid="";

   if (keyword==null) keyword = "";

   keyword = to_String(keyword).toUpperCase();

   try {

           page = Integer.parseInt(PAGE);

   }catch (NumberFormatException e){

           page = 1;

   }

   //取出记录数

   if (!classid.equals("") && keyword.equals("") ) {

           sqlStr = "select count(*) from book where bookclass='"+classid + "'";

      }

  else if (!keyword.equals("")) {

      if (classid.equals("")){

           sqlStr = "select count(*) from book where upper(bookname) like '%" +

                    keyword+ "%' or upper(content) like '%" + keyword + "%'";

      } else {

          sqlStr = "select count(*) from book where bookclass='" + classid

                   + "' and  (upper(bookname) like '%" +keyword+ "%' or "+

                   "upper(content) like '%" + keyword + "%')";

           }

   } else {

           sqlStr = "select count(*) from book";

          }

   int rscount = pageSize;

   try {

           ResultSet rs1 = stmt.executeQuery(sqlStr);

           if (rs1.next()) recordCount = rs1.getInt(1);

           rs1.close();

   }catch (SQLException e){

           System.out.println(e.getMessage());

           return false;

   }

   //设定有多少pageCount

   if (recordCount < 1)

            pageCount = 0;

   else

            pageCount = (int)(recordCount - 1) / pageSize + 1;

   //检查查看的页面数是否在范围内

   if (page < 1)

            page = 1;

  else if (page > pageCount)

            page = pageCount;

            rscount = (int) recordCount % pageSize;  // 最后一页记录数

   //sql为倒序取值

   sqlStr = "select   a.id,a.bookname,a.bookclass,b.classname,"+

           "a.author,a.publish,a.bookno,a.content,a.prince,a.amount,"+

           "a.Leav_number,a.regtime,a.picture from book a,bookclass b"+

          " where a.Bookclass = b.Id ";

  if (!classid.equals("") && keyword.equals("") ){  //如果类别不为空,非查询

           if (page == 1)

           {

               sqlStr = sqlStr + " and a.bookclass='" + classid + "' "+

               "order by a.Id desc";

           } else {

               sqlStr = sqlStr + " and a.bookclass='" + classid + "limit "+

                       (recordCount-pageSize * page)+","+(recordCount-pageSize * (page-1));

           }

  } else if (!keyword.equals("")) {  //如果是查询资料

    if (page == 1){

      if (!classid.equals("")) {//查询某一类

         sqlStr = sqlStr + "and a.Bookclass='" +

         classid + "' and (upper(a.bookname) like '%" +

         keyword+ "%' or upper(a.content) like '%" +

         keyword + "%')  order by a.Id desc";

      } else { //查询所有类

        sqlStr = sqlStr + " and (upper(a.bookname) like '%" +

        keyword+ "%' or upper(a.content) like '%" +

        keyword + "%') order by a.Id desc";

      }

     } else {

      if (!classid.equals("")){

           sqlStr = sqlStr + " and a.Bookclass='" +

           classid + "' and (upper(a.bookname) like '%" +

           keyword+ "%' or upper(a.content) like '%" +

           keyword + "%') limit "+(recordCount-pageSize * page)+","+

           (recordCount-pageSize * (page-1));

      } else {

            sqlStr = sqlStr + " and (upper(a.bookname) like '%" +

            keyword+ "%' or upper(a.content) like '%" +

            keyword + "%') limit "+(recordCount-pageSize * page)+","+

            (recordCount-pageSize * (page-1));

            }

                        }

  } else {//非查询,也非分类浏览

         if (page == 1){

              sqlStr = sqlStr + "  order by a.Id desc limit 0,"+pageSize;

          } else {

              sqlStr = sqlStr + "limit "+(recordCount-pageSize * page)+","+

              (recordCount-pageSize * (page-1));

           }

        }

        try  {

              rs = stmt.executeQuery(sqlStr);

              booklist = new Vector(rscount);

              while (rs.next()){

                                book book = new book();

                                book.setId(rs.getLong("id"));

                                book.setBookName(rs.getString("bookname"));

                                book.setBookClass(rs.getInt("bookclass"));

                                book.setClassname(rs.getString("classname"));

                                book.setAuthor(rs.getString("author"));

                                book.setPublish(rs.getString("publish"));

                                book.setBookNo(rs.getString("Bookno"));

                                book.setContent(rs.getString("content"));

                                book.setPrince(rs.getFloat("prince"));

                                book.setAmount(rs.getInt("amount"));

                                book.setLeav_number(rs.getInt("leav_number"));

                                book.setRegTime(rs.getString("regtime"));

                                book.setPicture(rs.getString("picture"));

                                booklist.addElement(book);

                        }

                        rs.close();

                        return true;

                }catch (Exception e){

                        System.out.println(e.getMessage());

                        return false;

                }

        }

3)insert()方法

 该方法负责图书的添加,返回类型为Boolean型,true表示成功,反之失败。首先从图书对象中获得属性,组装相应的SQL语句并执行,返回执行结果。代码如下:

        /**

         * 完成图书添加

         * @return

         * @throws java.lang.Exception

         */

 public boolean insert() throws Exception {

  sqlStr = "insert into book (Bookname,Bookclass,Author,Publish,Bookno,"+

           "Content,Prince,Amount,Leav_number,Regtime,picture) values ('";

           sqlStr = sqlStr + dataFormat.toSql(abooks.getBookName()) + "','";

           sqlStr = sqlStr + abooks.getBookClass() + "','";

           sqlStr = sqlStr + dataFormat.toSql(abooks.getAuthor()) + "','";

           sqlStr = sqlStr + dataFormat.toSql(abooks.getPublish()) + "','";

           sqlStr = sqlStr + dataFormat.toSql(abooks.getBookNo()) + "','";

           sqlStr = sqlStr + dataFormat.toSql(abooks.getContent()) + "','";

           sqlStr = sqlStr + abooks.getPrince() + "','";

           sqlStr = sqlStr + abooks.getAmount() + "','";

           sqlStr = sqlStr + abooks.getAmount() + "',";

           sqlStr = sqlStr + "now()"+ ",'";

           sqlStr = sqlStr + abooks.getPicture()+"')";

                try{

                        System.out.print(sqlStr);

                        DataBase db = new DataBase();

                        db.connect();

                        stmt =db.conn.createStatement ();

                        stmt.execute(sqlStr);

                        return true;

                }catch (SQLException sqle){

                  System.out.print(sqle.getMessage());

                        return false;

                }

        }

图书的修改和删除方法和上面类似,省略讲解。

其他的定制服务  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用API返回值实现商品信息的自动化更新

利用API返回值实现商品信息的自动化更新是一个涉及到数据交互、数据处理和自动化脚本编写的任务。以下是一个基本的步骤指南&#xff0c;帮助你实现这一过程&#xff1a; 1. 确定API接口 首先&#xff0c;你需要确定能够提供商品信息的API接口。这通常是由商品数据提供商&…

2024年培训服务行业CRM研究报告

国家实行“双减”政策后&#xff0c;很多教培企业慢慢淡出了公众的视野&#xff0c;很多人觉得&#xff0c;教培行业怕是要日薄西山了。 但如果你了解了培训服务行业到底有多庞大&#xff0c;你就会立即改变自己的想法。 从2017年起&#xff0c;中国职业培训机构的年注册量超…

X86架构基础

X86目前的架构有32位和64位两种&#xff0c;不同的架构支持的运行模式也是不一样的&#xff0c;64位的基本能兼容32位。64位是X86架构的主流&#xff0c;本文内容默认以64位位基础。X86平台目前的支持的运行模式有以下几种&#xff1a; 1、实模式&#xff1a;这是最早的X86运行…

ue5远程渲染和本地渲染的区别,及云渲染的联系

UE5这款引擎以其令人惊叹的渲染能力&#xff0c;为游戏开发者们打开了一扇通往视觉盛宴的大门。但是在UE5的世界里&#xff0c;渲染技术其实还有着本地渲染和远程渲染之分&#xff0c;而且它们与时下大热的云渲染技术也有着千丝万缕的联系。本文主要说明UE5中的远程渲染和本地渲…

鲜为人知的 9 种人工智能工具

这套 AI 工具确实与众不同。您可能在其他地方读到过&#xff0c;图像生成需要大量工作。使用 AI 工具制作网站也需要大量工作。此列表涵盖了我在过去几个月发现的一些前沿项目&#xff0c;它们在很多方面都很有用。 如果您没有时间阅读最新的营销书籍&#xff0c;SoBrief 是个不…

Semantic Kernel进阶:多模型的支持

大家可能已经知道&#xff0c;Semantic Kernel默认主要支持两款模型&#xff1a;OpenAI和AzureOpenAI。对于开发者来说&#xff0c;这显然是不够的&#xff0c;尤其是当我们希望对接国内的一些强大模型&#xff0c;比如百度的文心一言、阿里的通义千问、搜狗的百川、智谱ChatGL…

kickstart自动安装脚本制作详解

一、kickstart自动安装脚本制作 此实验中&#xff0c;使用Rhel7.9&#xff0c;并开启图形化系统 1.设置实验环境 1.使用Rhel7.9 2.需要打开图形化系统 [rootpxe ~]# hostnamectl # 查看当前系统是否为图形化Static hostname: pxeIcon name: com…

数字赋能下的艺术蝶变:沃可趣如何重塑乐园演艺人才培训?

全球知名主题乐园在2023年共接待游客超过1300万人次。 这意味着&#xff0c;在童话世界里创造快乐的演职人员们&#xff0c;平均每天要与三、四万人见面&#xff0c;以精湛的演技服务好每一个人&#xff0c;其工作难度和强度不言而喻。 减轻员工负担&#xff0c;帮助员工成长…

江协科技STM32学习- P4 新建工程

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

大语言模型超参数调整指南:入门调参的实用手册

在人工智能的广阔天地中&#xff0c;大语言模型&#xff08;LLM&#xff09;正以其强大的能力&#xff0c;不断刷新我们对机器理解语言的认知。然而&#xff0c;要使这些模型在特定应用场景下发挥最大效能&#xff0c;关键在于如何巧妙地调整其超参数。本文将带你深入探索 LLM …

4. 数组与集合

数据结构是管理和组织数据的基础&#xff0c;它直接影响到程序的性能和效率。在本章中&#xff0c;我们将深入探讨与数组和集合相关的知识。这些数据结构在Java编程中至关重要&#xff0c;无论是处理简单的线性数据还是复杂的多维数据&#xff0c;合理使用这些结构都能大大提高…

100个智能体实战技巧 | 如何让工作流也能处理图片

相信不少朋友都遇到过想要在工作流中处理图片但是却无从下手的情况 举个例子&#xff0c;扣子中有个插件叫OCR&#xff0c;是可以用来识别图中的文字的 然而作为一个插件&#xff0c;它只能在工作流中被调用&#xff0c;如下图 工作流 vs. 图像流 这就意味着&#xff0c;要使用…

Modal中的跳转用<Link>组件会报错?

在做链接跳转时&#xff0c;一般是用a标签或者link标签。但是当团队规范使用标签时&#xff0c;在modal&#xff08;antd的版本4&#xff09;中使用可能就有问题了。 报错内容是&#xff0c;发现link在使用时找不到路由上下文。因此报错。 原因&#xff1a;Link 组件在 return …

Vue3-响应式原理解析

vue3 与 vue2 主要差异之一无疑是响应式实现上的改变。本文主要阐述响应式原理的实现方式解析以及核心源码阅读的注释理解。 本文主要对响应式实现原理进行逻辑梳理,舍弃枯燥无味的代码,只用图解/文字进行功能描述,具体实现请自行阅读。保重!!! 如果问题,虚心求教,还请…

xxl_job任务调度简单使用

一、概念 任务调度是为了自动完成特定任务&#xff0c;在约定的特定时刻去执行任务的过程 如以下应用场景&#xff1a; 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口&#xff1a; RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

60%公司推行精益管理失败都源于同一原因,这个原因是...

精益管理在许多公司中已经成为提高运营效率、减少浪费、和提升客户满意度的重要方法。或者你觉得惊讶&#xff0c;根据我们的经验&#xff0c;超过60%的公司在实施精益管理失败&#xff0c;我们发现他们都有一个共同的原因&#xff0c;这个原因就是公司没有跟踪正确的指标&…

【图文并茂】ant design pro 如何优雅奇妙地把 crud 的 api 单独抽出来共用

我们写后台项目&#xff0c;经常要写增删改查的接口。 比如 角色 权限 我们不可能都写一个 api 比如 getRoles, getPermissions 这些请求列表的&#xff0c;都是一样的&#xff0c;只是路径不同 那么我们应该抽出来&#xff0c;放到一起&#xff0c;直接去调&#xff0c;只…

双向电表是什么电表?为什么光伏发电储能要求安装双向电能表!

双向电表是什么电表? 双向电表就在用电的时候假如是正转&#xff0c;那么向外送电的时候就是反转&#xff0c;也就是读数越来越小。反总是指反向总有功&#xff0c;反无是指反向总无功。 双向电表&#xff0c;也称为双向计量电能表&#xff0c;是一种能够计量用电和发电的电…

第三节:Nodify 添加连接关系

引言 Nodify有三层结构&#xff0c;编辑器Editor&#xff0c;节点Node和连接组件Connection&#xff0c;上节介绍了节点和编辑器&#xff0c;本节介绍连接组件。连接组件用于保存节点中连接端子的连接关系&#xff0c;并随节点的拖动改变。 1、连接组件 连接组件存储一个连接关…