基于JSP/Servlet校园二手交易平台

摘 要

本系统采用JSP/servlet技术,是使用Java编程语言编写的一套校园网二手交易平台软件。系统采用的是最近几年流行的B/S开发模式,以互联网方式运行,服务器端只需要安装本系统,而客户端用户只要可以上网,就可以非常方便快捷的通过浏览器访问系统,浏览和发布二手交易信息,免去了传统的C/S模式下复杂的安装、配置、维护等操作。同时由于使用面向对象的Java语言,所以本系统也具有Java语言的面向对象、与平台无关、安全性高、稳定性高、多线程等特性,以及Java语言对网络编程技术的支持。使得本系统具有很高的使用价值。 系统开发采用了实现MVC模式的Web应用组件:Struts,实现数据持久化功能的ORM组件:Hibernate,用JSP+HTML+JavaScript进行界面处理,数据库采用比较稳定的MySQL 5.0,并用JDBC进行数据库访问。

关键词:JSP,Struts,Hibernate,MySQL,二手交易平台

Campus Secondhand Merchandise Platform Based on Jsp/Servlet

ABSTRACT

This system is a set of platform software of the campus-wide system secondhand transaction. It adopts the JSP/J2EE technique, and programmed with Java programming language. It also adopts the B/S development mode, which is based on Web and popularize in recent years. It runs in internet ways. Only when the server install this system and the client can visit it, browse and release some secondhand conveniently and speedily when they go on-line. And so it dispenses with such operation as the complicated installing, installment and support in traditional C/S mode. At the same time, it uses the Java language which towards the OOP(object-oriented programming).So the system has the specific property of towarding OOP, irrelevant with the platform ,the Java language's support to the network programming technique makes the system have high practical value.

The System using the components of Web applications: Struts to achieve MVC model, using the ORM components: Hibernate to achieve data persistence features, using JSP + HTML + JavaScript to Show page. using Relatively stable database MySQL 5.0, and use JDBC to visit.

KEY WORDS: JSP,Struts,Hibernate,MySQL,Campus Secondhand Merchandise

1系统分析

1.1 开发背景

随着全世界互联网技术的不断发展,各种基于互联网技术的网络应用不断涌现,网络技术正在不断的深入人们的生活。人们从Internet上获取信息、享受生活、交流感情、网上工作等。Internet正在迅速改变着人们的生活方式。

经过我国改革开放多年以后,随着与国际社会的接轨,各种资源的商品化已经逐渐成为了我们这个社会的代名词。在这这情势下,校园二手商品资源也已极大的丰富起来,如何解决一类问题,争取最大利用率的交流这类商品的信息便是一个存在中的问题。本毕业设计便是解决该问题的。

1.2 目的和要求

在当前社会上,许多的各种类型的电子商务类网站纷纷建立,可以很大程度上的解决人们信息资源的闭塞以及地域上的限制。作为大学校园,伴随着学生的购买能力的提高和每年的升学和毕业,也存在的许多各种类型的二手商品,由于信息交流的落后,很多只限于于校园公告栏或者请人代为宣传的方式进行交易。这种方式有很多局限性和偶然性,并不能满足二手商品畅通交流的要求。于是一种新的二手商品信息交流的方式出现了,就是基于Web的校园网二手商品交易系统。通过这个系统,可以发现每一个校园网用户都是系统的主人,大家可以非常方便的发布自己的信息,浏览别人的发布的信息,还可以对各种二手商品信息作出横向比较,作出自己的最佳选择。由此可见,该系统只是一个交流二手商品信息的平台,与一般的电子商务类网站又有本质的区别。

1.3 可行性研究

设计这样一个系统,从根本上解决了传统的校园二手信息发布交流方式的弊端,使得校园各种二手商品信息得到了有效的整合,方便了广大用户。且拥有的客户通常只是大学校园网的用户,所有系统规模上来讲不会很大,从经济上来说,由于选择的开发工具和服务器几乎全部为免费的开源软件,并且由于是开发成本较低的基于Web的B/S模式,而非成本费用相对较高的C/S模式,所以从经济上来讲是可行的。从技术上来说,由于是基于Web的,可以相对比较容易面对用户的实际需求而开发。而在现今,各种网络应用的开发已经相当成熟,出现了几大主流的开发语言和工具,都可以非常有效的支持开发这样一个系统。同时作为本系统,也有许多成功的电子商务类网站的经验可以借鉴,所以从技术的角度来说,也是可行的。从运行上来说,由于客户端仅仅只是需要一个浏览器,通过浏览器来登陆系统,而服务器端也只需要一台服务器,服务器要求一个数据库环境和一个网络应用开发的环境,实现起来比较容易,所以从运行上来说是可行的。同时这样一个系统,在系统管理员合法管理和用户的自觉配合下,不会违规进行任何的不法的活动和交易,发布具有危害性和不适宜的信息,也不存在任何非法牟利的行为,在法律上也是可行的。在各种可行性研究保证和基于用户需求要求下,开发系统的方案经过不断论证和假设,确定出了一个最佳方案。

2 开发技术及开发环境

2.1 Java语言简介 Java语言是美国Sun公司于1995年推出的一种简单的、面向对象的、分布式的、可解释的、键壮的、安全的、结构的、中立的、可移植的、性能很优异的多线程的、动态的语言。其前身为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术。经过Sun公司的工程师的不懈努力以及全世界无数的编程爱好者的使用,Java终于发展成为今天这样一个集桌面(J2SE)、网络(J2EE)、移动平台(J2ME)应用为一体的功能强大的编程语言。目前Java由于其平台无关及分布式特性,最重要的应用是在网络应用上[1]。 ## 2.2 J2EE技术介绍 J2EE技术是Java网络应用的技术,广泛应用于企业级的应用。它是由一套规范(shannin,2001)和建立在J2SE平台上的应用编程接口(API)组成。J2EE拥有Sun公司提供免费开发工具,称为J2EE软件开发工具包(Software Development Kit,SDK )(http://java.sun.com/j2ee)。J2EE技术是一种Java网络应用技术的组合,包含有远程方法调用(Remote Method Invocation,RMI)、Java消息服务(Java Message Service,JMS)、JavaMail等通信服务,JDBC、Java命名和目录接口(Java naming and Directory Interface,JNDI)、Java连接器体系结构(Java Connector Architecture,JCA)、Java事务API/Java事务服务(JTA/JTS)、XML处理API等通用服务以及Servlet、Java服务器页面(JSP)、企业级JavaBean(EJB)等组件技术。任何J2EE的实现都必须要在其特定容器中实现。 ## 2.3 Servlet/JSP技术 Servlet是JSP技术的基础,JSP本身就是预先被编译成Servlet,然后再运行的,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。 Servlet其实和传统的CGI程序和ISAPI、NSAPI等Web程序开发工具的作用是相同的,在使用Java Servlet以后,用户不必再使用效率低下的CGI方式,也不必使用只能在某个固定Web服务器平台运行的API方式来动态生成Web页面。许多Web服务器都支持Servlet,即使不直接支持Servlet的Web服务器也可以通过附加的应用服务器和模块来支持Servlet。JSP(JavaServer Pages)是一种基于Java的脚本技术。在JSP 的众多优点之中,其中之一是它能将 HTML 编码从 Web 页面的业务逻辑中有效地分离出来。用 JSP 访问可重用的组件,如 Servlet、JavaBean 和基于 Java 的 Web 应用程序。JSP 还支持在 Web 页面中直接嵌入 Java 代码。可用两种方法访问 JSP 文件:浏览器发送 JSP 文件请求、发送至 Servlet 的请求。 a) JSP 文件访问 Bean 或其它能将生成的动态内容发送到浏览器的组件。 b) 发送至 Servlet 的请求生成动态内容,并调用 JSP 文件将内容发送到浏览器。该访问使得将内容生成从内容显示中分离出来更为方便。 JSP最大的优点在于其与平台无关性,具有"一次编写,处处运行"的特点。 ## 2.4 MVC 简介 模型-视图-控告器(MVC)是20世纪80年代Smalltalk-80出的一种软件模式,现在已经被广泛使用。 a) 模型(Model) 模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑。 b) 视图(View) 视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。 c) 控制器(Controller) 控制器的工作就是根据用户的输入,控制用户界面显示和更新模型对象的状态。典型的MVC模式所包含的模块、每个模块的功能以及模块之间的关系如图2-1所示[2]: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5af2d76328f24dcdbbdb788d07ab2082.png)

图2-1 MVC组件的关系和功能

MVC模式的出现不仅实现的功能模块和显示模块的分离,同是赛马场还提高了应用系统的可维护性、可扩展性、可移植性和组件的可利用性。

在早期的程序中,如果不注意对数功能和显示的解耦合,常常估导致程序的复杂及难以维护,像VB,Delphi等RAD程序都有这种问题。甚至现在有C#,Java有时候也会出现把业务逻辑写在显示模块中的现象。

尽管MVC设计模式很早的提出了,但在Web项目的开发中引入MVC却是步履艰难。主要原因是在早期的Web项目开发中,程序语言和Html的分离一直难以实现,CGI程序以字条串输出的形式动态的生成html内容。直到基于J2EE的JSP Model2问世时才得以改观。它用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean实现模型的功能。JSP Model2 结构如图2-2所示:

图2¬-2 JSP Model2 结构图

在Model 2这种框架结构中,Servlet作为控制器负责处理用户的请求以及创建JSP页面中所有要使用的Bean对象,并且还要根据用户的请求来返回到不同的JSP页面。

在使用Model 2开发框架时,一定要保证在JSP页面中不能包含任何的业务处理逻辑。它只是简单地得到对象或者在Servlet中创建的Bean,然后通过这些动态的内容来生成动态显示的页面。

Struts 本质上就是在Model 2的基础上实现一个MVC架构,它只有一个中心控制器,采用定制转向的URL并采用Action来处理逻辑。

2.5 Struts 技术

Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Java Servlet和JSP构建Web应用的一项非常有用的技术。首先事件是指从客户端页面(浏览器)由用户操作触发的事件,Struts使用Action来接受浏览器表单提交的事件,这里使用了Command模式,每个继承Action的子类都必须实现一个方法execute。

struts重要的表单对象是ActionForm,它代表了一种应用,这个对象中至少包含几个字段,这些字段是Jsp页面表单中的input字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用Struts就不太可能,当然通过结合JavaScript也是可以转弯实现的。

Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间。

Struts包含了一组想相互协作的类、Servlet和JSP标记,它们共同组成了一个可重用的MVC模板。通过定义可以看出,Struts是Web应用的开发框架,Struts包含丰富的标记库和独立于该框架工作的实用程序类。图2-3 显示了Struts的基本结构。

图 2-3 Struts基本结构

通过图 2¬-3可以看出,采用Struts框架结构的Web应用程序主要由控制器、业务逻辑、模型和视图组成。其中的控制器、模型和视图为Struts框架的主要组成部分,而事务逻辑则是我们需要实现的系统业务逻辑处理部分。

2.6 Hibernate 技术

2.6.1 应用程序的分层体系结构

随着计算机应用软件的发展,应用程序逐渐由单层体系结构发展为多层体系结构。其中,三层结构是目前典型的一种应用软件结构。

表述层:提供与用户交互的界面,如GUI(图形用户界面),web页面等;

业务逻辑层:负责各种业务逻辑,直接访问数据库,提供对业务数据的保存、更新、删除和查询操作;

数据库层:负责存放管理应用的持久性业务数据。

三层结构的特点是:所有下层向上层提供调用的接口,具体实现细节对上层透明。层与层之间存在自上而下的依赖关系,即上层会访问下层的API,但下层不依赖于上层。

分离出的持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API[2]。

持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

三层软件结构如图2-4所示:

图2-4 三层软件结构图

数据库的读写是一个很耗费时间和资源的操作,当大量用户同时直接访问数据库的时候,效率将非常低,如果将数据持久化就不需要每次从数据库读取数据,直接在内存中对数据进行操作,这样就节约了数据库资源,而且加快了系统的反映速度。增加持久化层提高了开发的效率,使软件的体系结构更加清晰,在代码编写和系统维护方面变得更容易。特别是在大型的应用里边,会更有利。同时,持久化层作为单独的一层,人们可以为这一层独立的开发一个软件包,让其实现将各种应用数据的持久化,并为上层提供服务。从而使得各个企业里做应用开发的开发人员,不必再来做数据持久化的底层实现工作,而是可以直接调用持久化层提供的API。

2.6.2 Hibernate的应用及API简介

Hibernate是一种Java语言下的对象关系映射解决方案。它是一种自由、开源的软件。它用来把对象模型表示的对象映射到基于SQL的关系模型结构中去,为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。

Hibernate不仅管理Java类到数据库表的映射(包括从Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

Hibernate对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,它既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。最具革命意义的是,Hibernate可以在应用EJB(EnterpriseJavaBeans是Java应用于企业计算的框架)的J2EE架构中取代CMP,完成数据持久化的重任。

Hibernate使用 Java 反射机制 而不是字节码增强程序来实现透明性。Hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。Hibernate支持各种关系数据库,从一对一到多对多的各种复杂关系。Hibernate核心接口如图2-5所示:

图2-5 Hibernate核心接口框图

2.7 开发环境及环境配置

2.7.1 Java/JSP系统环境

开发及测试的系统环境,我选择了Microsoft Windows Advanced Server 2000。由于其本身就是为服务器版的,适合用于搭设成为服务器端。要开发JSP,首先必须要求有Java环境,我选择了JavaTM Platform, Standard Edition 6 Development Kit。

作为JSP的容器,选择了目前非常流行的Tomcat 6.0。而IDE工具则选择了Eclipse(MyEclips)。

2.7.2 JSP环境的安装和环境变量的设置

首先安装JDK,安装Tomcat。

接下来配置环境变量:右键点击"我的电脑",在弹出的菜单中点"属性",在系统特性里选择"高级",找到"环境变量",点击进入后,"系统变量"就是我们需要设置的地方。

a) 新建变量CATALINA_HOME,变量值为:

D:\apache-tomcat-6.0.18

b) 新建JAVA_HOME变量,然后在变量值中输入以下内容:

C:\Program Files\Java\jdk1.6.0_12

c) 编辑path变量:在原有的变量值后添加JDK的BIN目录

%JAVA_HOME%\bin;%CATALINA_HOME%\BIN

2.7.3 Eclipse开发工具

Eclipse平台体系结构主要由5部分组成,分别是平台运行库、工作区、工作台、团队支持和帮助。

在运行时内核是整个架构的核心,其他部件都是以插件方式来实现的。Eclipse采用动态加载机制,即只有需要的才加载,这样可以降低启动时间,提高资源使用效率。

工作空间插件即所谓的工作区,主要负责管理用户资源,例如用户创建项目的管理、文件变更等,并负责通知其他插件关于资源变更的信息。

工作台插件是Eclipse 提供的用户界面。它使用标准窗口工具包(SWT)和一个更高级的API(JFace)构建的。SWT是Java的Swing/AWT的非标准替代者,JFace则以SWT为基础,但更易于使用。

团队支持插件负责提供版本控制和配置管理支持。它允许用户根据需要添加视图,并与允许用户使用的任何版本控制系统交互。

帮助插件允许以HTML文件形式添加文档,并提供了一个附加的导航结构以便用户使用帮助功能搜索相关信息。

2.7.4 Tomcat服务器

Tomcat是Sun的JSWDK(Java Server Web Development Kit)中Servlet的运行环境(servlet容器)。Tomcat是Apache Jakarta软件组织的一个子项目,Tomcat是一个JSP/Servlet容器,它是在SUN公司的JSWDK(Java Server Web Development Kit)基础上发展起来的一个JSP和Servlet规范的标准实现,使用Tomcat可以体验JSP和Servlet的最新规范。经过多年的发展,Tomcat不仅是JSP和Servlet规范的标准实现,而且具备了很多商业Java Servlet容器的特性,并被一些企业用于商业用途[4]。

Tomcat目录如下:

Tomcat_home

|---bin Tomcat:存放启动和关闭tomcat脚本;

|---conf Tomcat:存放不同的配置文件(server.xml和web.xml);

|---doc:存放Tomcat文档;

|---lib/japser/common:存放Tomcat运行需要的库文件(JARS);

|---logs:存放Tomcat执行时的LOG文件;

|---src:存放Tomcat的源代码;

|---webapps:Tomcat的主要Web发布目录(包括应用程序示例);

|---work:存放jsp编译后产生的class文件;

2.8 数据库开发工具选择及配置

目前数据库的开发工具,大、中、小型的有很多,比如Oracle、MS SQL Server2000、DB2、MySQL、Access等等许多关系数据库,在系统开发初期,我用SQL server2000 进行数据库连接,因为可以于Windows 2000服务器系统很好的兼容,并且对大并发访问有很好支持,功能强大且使用简单,然而在后期的开发中,由于经常更换设计环境,而且自己用到Hibernate,对软件有一定要求,每次系统移植都要花很多时间配置环境,所以又更换了移植性很好的MySQL做数据库。

MySQL是一个小型关系型数据库管理系统,被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本[3]。

在本系统中,对MySQL的配置最重要是数据库字符编码设置,因为数据库的录入的大多是中文字符,默认编码为GBK会减少许多操作,配置如下:

default-character-set=gbk

3 系统需求分析及设计

3.1 系统需求分析

3.1.1 系统功能需求

本系统主要面向于大学校园网用户,依托校园网提供给这些用户一个发布和交流二手商品信息的平台。在大学校园里,存在着很多的二手商品,但是由于信息资源的不流通以及传统二手商品信息交流方式的笨拙,导致了很多仍然具有一定价值或者具有非常价值的二手商品的囤积,乃至被当作废弃物处理。现在通过校园网进入到本系统,可以方便快捷的发布和交流任何二手商品的信息,并且可以通过留言方式进行深一步的交流。由于每个大学的校园网都基本篇布校园的每一个地方,因此,只要宣传得当,理论上来说,每一个人都可以让他所发布的信息让全校所了解,争取到了信息资源的最大化利用。

系统完成的主要功能有:用户设置功能、发布信息功能、信息管理功能、搜索信息功能,留言功能,及系统管理功能,具体业务功能包括如下:

用户注册:学生可利用自已学号进行注册,注册实现实名制。

用户登录:只有登录用户才能进行信息发布。管理员登录后可以进行系统管理。

发布信息:普通用户和管理员登录后都可以发布信息。

修改信息:普通用户可以修改自己发布的信息,管理员可以修改所有信息。

删除信息:普通用户可以删除自己发布的信息,管理员可以删除所有信息。

浏览信息:游客、普通用户和管理员可以浏览所有发布的信息。

搜索信息:游客、普通用户和管理员可以用关键字搜索所有发布的信息。普通用户可以搜索自己发布的所有信息。

发表留言:普通用户和管理员登录后都可以对发布信息进行留言。

查看留言:游客、普通用户和管理员都可以查看发布信息的留言。

删除留言:管理员可以删除留言。

添加二手指南:管理员可以添加二手指南。

查看二手指南:游客、普通用户和管理员都可以查看二手指南。

修改二手指南:管理员可以修改二手指南。

删除二手指南:管理员可以删除二手指南。

3.1.2 系统界面要求

由于系统主要面向大学生,系统界面要求不能过古板,要能体现大学校园的自由,创新。系统界面设计应体现人性化,界面清晰简捷,操作简单流畅,提高管理效果。不需要任何专业培训,不需要配备专门的电脑操作人员,无电脑知识一样运用自如。关键在于系统的框架式设计简单明晰。

3.2 概要设计

3.2.1 系统体系结构设计

本系统是一个典型的三层应用------浏览器通过Web服务器实现对数据库的各种操作。图3-1 展示了整个系统的体系结构。

图3-1 系统体系结构

在这个系统体系结构中,并不是直接JDBC来访问数据库和进行数据库中相关表的操作,而是通过一系列持久层的Java对象来完成数据库的操作。

映射文件相当于持久层的Java对象和数据库的表之间的桥梁,它所描述的是这两都之间的对应关系。而且,持久层的Java对象和数据库表之间的关系也是一一对应的。

3.2.2 系统功能模块设计

系统主要设计了用户设置功能、发布信息功能、信息管理功能、搜索信息功能,留言功能,及系统管理功能模块。

用户设置功能主要是用户注册必须填写所要求的个人资料,完成个人资料登入。

发布信息功能主要是为已注册用户的服务,登陆的用户可以即时发布自己的二手商品信息,立刻就能浏览到。这是本系统的主要功能。

信息管理功能是帮助已发表信息的的用户管理自身发布的二手商品信息的同时也管理短消息信息。此项功能也主要是服务于注册用户。

搜索信息功能是面向所有登陆到本系统的人员的,采用模糊查询的方法,遍历所有二手商品信息,搜索出浏览者感兴趣的内容。

留言功能是对某一二手商品信息进行留言,还可以查看该信息的其他留言。

系统管理功能是系统管理员对系统所有信息资源进行统一管理的一个模块。系统功能结构如图3-2所示:

图 3-2 系统功能结构图

3.2.3 功能设计的目标与原则

本二手交易平台的主要目的是服务于学生,方便学生进行网上交易。其原则是做到界面友好,操作简单且可靠。

具体做到:

a) 架构清晰,界面友好美观,简捷,实用性强。

b) 动态式信息发布:为充分展现网站的时实性,二手交易平台采用动态网页技术实现内容发布。

c) 提供多种信息搜索及查看方式。全面自动化管理。

d) 全面整合买家和卖家之间的信息,提供一个交流沟通的平台。

e) 可用性。目标系统功能齐全,能够完全满足业务需求。

3.3数据库设计

3.3.1 数据库需求分析

对于数据库的需求主要体现在对数据库的提交信息、更新信息、删除信息、保存信息等。这些信息的存在都取决于各个功能模块的对信息的需求。通过对功能模块的具体操作,实现对数据库中信息的输入和输出。所以,针对各个功能模块的需求,设计如下的数据表和数据结构:

(1) Maste 类表:用于实现平台用户我实名制及平台基本信息:

学院信息:包括学院编号,学院名,描述等。

班级信息:包括班级编号,班级名,学院编号,描述等。

学生信息:包括学号,姓名,班级编号,学院编号等。

类型信息:包括类型编号,类型名,类型描述等。

交易地区信息:包括地区编号,地区名,地区描述等。

(2) Temp 类表:用于实现平台各模块:

用户信息:包括用户编号、用户名、密码、学号,及用户的其它相关信息等。

商品信息:商品编号、信息标题、信息内容,发布信息的用户,信息相关内容等。

商品留言信息:包括留言编号、商品信息编号、留言内容等。

3.3.2 数据库概念结构设计

概念模型是对于信息世界的建模,是现实世界到信息世界的抽象,是数据库设计人员和用户之间进行交流的语言。它具有简洁明晰、易于理解和修改、便于向各种数据模型转换,从而生成相应的逻辑模式。

概念设计的目的是要确定系统的概念模型,因为概念模型是数据库系统的核心和基础,所以概念设计是数据库设计的关键。

3.3.3 数据库逻辑表设计

数据库的概念结构设计完毕后,现在可以将上面的数据库概念结构转化为某种数据库所支持的实际数据模型,也就是数据库的逻辑结构。

在本次设计开发中,考虑到系统的规模,以及系统的功能、稳定性、性能和效率等方面,特别的对系统可移植性的考虑,我使用MySQL数据库系统。

依照3.3.1中的数据库需求分析设计各数据库表,各个表中都用ID做主键,困为用到Hibernate自动生成主键,所以这里主键ID类型设置为VARCHAR(50)。其它字段也都有各自的约束条件。

各个表的具体逻辑结构如下:

表3-1 学院表 (m_dep)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 学院编号

DEP_NAME VARCHAR(10) UNIQUE 学院名

DEP_DESC varchar(100) NOT NULL 学院描述

表3-2 班级表(m_class)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 班级编号

DEP_ID VARCHAR(50) Foreign Key 学院编号

CLASS_NAME VARCHAR(10) UNIQUE 班级名

CLASS_DESC varchar(100) NOT NULL 班级描述

表3-3 学生表(m_student)

字段名 数据类型 约束条件 说明

ID VARCHAR(12) Primary Key 学号

CLASS_ID VARCHAR(50) Foreign Key 班级编号

STU_NAME VARCHAR(10) UNIQUE 学生姓名

sex TINYINT(3) NOT NULL 学生性别

表3-4 交易地区表(m_area)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 地区编号

AREA_NAME VARCHAR(10) UNIQUE 地区名

AREA_DESC varchar(100) NOT NULL 地区描述

表3-5 信息类型表(m_type)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 类型编号

TYPE_NAME VARCHAR(10) UNIQUE 类型名

TYPE_DESC varchar(100) NOT NULL 类型描述

表3-6 二手指南表(t_article)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 指南编号

TITLE VARCHAR(10) UNIQUE 指南标题

CONTENT varchar(8000) NOT NULL 指南内容

表3-7 用户表(t_user)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 用户编号

USERNAME VARCHAR(10) UNIQUE 用户名

PASSWORD varchar(100) NOT NULL 用户密码

STU_ID VARCHAR(50) Foreign Key 学号

BIRTHDAY DATETIME NOT NULL 生日

PHOTO SMALLINT(5) NOT NULL 照片

QUESTION VARCHAR(100) NOT NULL 注册问题

ANSWER VARCHAR(100) NOT NULL 注册答案

EMAIL VARCHAR(50) --- EMAIL

QQ VARCHAR(20) --- QQ

CREATE_TIME DATETIME NOT NULL 注册时间

STATUS TINYINT(3) NOT NULL 状态

ROLE TINYINT(3) NOT NULL 权限

表3-8 信息表(t_message)

字段名 数据类型 约束条件 说明

ID VARCHAR(50) Primary Key 信息编号

MESSAGE_TITLE VARCHAR(50) UNIQUE 信息标题

TYPE_ID VARCHAR(50) Foreign Key 信息类型

AREA_ID VARCHAR(50) Foreign Key 交易地区

OLD_VALUE SMALLINT(5) NOT NULL 新旧值

PRICE DECIMAL(10,0) NOT NULL 商品价格

R_USER VARCHAR(10) NOT NULL 联系人

R_PHONE VARCHAR(50) NOT NULL 联系电话

R_EMAIL VARCHAR(50) --- EMAIL

MESSAGE_DESC VARCHAR(200) NOT NULL 信息详情

MESSAGE_PHOTO VARCHAR(50) --- 信息图片

CREATE_TIME DATETIME NOT NULL 新增日期

FLAG TINYINT(3) NOT NULL 信息标志

TOP_VALUE INTEGER NOT NULL 人气值

CREATE_USER_ID VARCHAR(50) Foreign Key 发布用户

3.3.4 数据库逻辑结构设计

对于maste表,它们都是做为别的表的外键而存在的。本系统数据库逻辑可分为两部分,一部分实现用户的实名制:实名制需要校方学生纪录,而学生又有以学院、班级,每个用户对应一个学生,其逻辑模型如图3-3所示:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c16866b9479c4edea5b999db5d779147.png)

图3-3 数据库逻辑模型一

第二部分实现商品信息关联,每个商品都有商品类型、交易地区和发布用户,每个商品有多个留言,而每个留言又有发表用户,其逻辑模型如图3-4所示:

图3-4 数据库逻辑模型二

3.4 数据库访问设计

数据库访问是指对数据库进行操作,本系统使用Hibernate完成数据库表与java对象映射,并用HibernateSessionFactory进行数据库访问。

3.4.1 数据库表模型设计

所有数据库表中都有编号做为主键,在java类库中用BaseModel.java完成模型对象的基类。在BaseModel类中,属性id 做为所有表的主键,equals(Object o)是重写的父类方法,只要字符串内容相同,对象就相同;toString用于规范对象的打印格式。
本系统包含的业务模型有:交易地区(Area),商品类型(Type),二手指南(Article),学院(Department),班级(Clazz),学生(Student),用户(User),信息(Message),留言(Comment),它们都对应于数据库中某张表。这些Java模型对象的数据类型与数据库表相对应,并都继承BaseModel,所有Model类的UMR如图3-5所示:

图3-5 系统持久层对象UMR图

3.4.2 Hibernate数据库访问配置

Hibernate配置文件主要用于配置hibernate连接数据库的参数以及其它一些hibernate在运行时需要使用的各种参数的值。配置如图3-6所示:

图3-6 Hibernate配置图

Hibernate是你的应用程序里连接数据库的那层,所以它需要连接用的信息。连接(connection)是通过一个也是由我们配置的JDBC连接池(connection pool)来完成的。Hibernate的发布包里包含了许多开源的(open source)连接池,但在我们例子中使用Hibernate内置的连接池。

3.4.3 定义映射文件

映射文件用于描述持久层对象以及它们的属性和数据库中的表和表的字段之间的对应关系,完成java对象和数据库中表的数据的相互转化,这里只介绍用户对象的映射配置。

文件清单如下:

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping  package="cn.lee.market.model">
    <class name="User" table="T_USER" schema="dbo" catalog="market_1">
        <id name="id" type="string">
            <column name="ID" length="50" />
            <generator class="uuid.hex" />
        </id>
        <many-to-one name="MStudent" class="Student" fetch="select">
            <column name="STU_ID" length="50" not-null="true" />
        </many-to-one>
        <property name="username" type="string">
            <column name="USERNAME" length="50" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="50" not-null="true" />
        </property>
        <property name="birthday" type="timestamp">
            <column name="BIRTHDAY" length="23" not-null="true" />
        </property>
        <property name="photo" type="integer">
            <column name="PHOTO" not-null="true" />
        </property>
        <property name="question" type="string">
            <column name="QUESTION" length="50" not-null="true" />
        </property>
        <property name="answer" type="string">
            <column name="ANSWER" length="50" not-null="true" />
        </property>
        <property name="telephone" type="string">
            <column name="TELEPHONE" length="50" />
        </property>
        <property name="email" type="string">
            <column name="EMAIL" length="50" />
        </property>
        <property name="qq" type="string">
            <column name="QQ" length="50" />
        </property>
        <property name="create_time" type="timestamp">
            <column name="CREATE_TIME" length="23" not-null="true" />
        </property>
        <property name="status" type="integer">
            <column name="STATUS" not-null="true" />
        </property>
        <property name="role" type="integer">
            <column name="ROLE" not-null="true" />
        </property>
        <set name="TMessages" inverse="true">
            <key>
                <column name="CREATE_USER_ID" length="50" not-null="true" />
            </key>
            <one-to-many class="Message" />
        </set>
        <set name="TComments" inverse="true">
            <key>
                <column name="USER_ID" length="50" not-null="true" />
            </key>
            <one-to-many class="Comment" />
        </set>
    </class>
</hibernate-mapping>

在hibernate-mapping标签(tag)之间, 含有一个class元素。所有的持久化实体类都需要一个这样的映射,来把类对象映射到SQL数据库里的表。id元素是标识符属性的声明,name="id" 声明了Java属性的名字 - Hibernate会使用getId()和setId()来访问它。 column属性则告诉Hibernate, 我们使用market_1表的哪个字段作为主键。嵌套的generator元素指定了标识符生成策略,在这里我们指定uuid.hex。

3.4.4 Hibernate Session工厂

该类主要用于方便地提供Hibernate的初始化以及Hibernate的sessioon和事务的处理,HibernateSessionFactory类的结构如图3-7所示:

图 3-7 HibernateSessionFactory类方法UMR图

在此简要介绍一下使用Hibernate进行数据库操作的过程,使用Hibernate进行持久化操作主要需要以下步骤:

(a) 创建Configuration对象:进行配置文件的装载操作,读取所有的映射文件并进行解析。

(b) 创建 SessionFactory对象:通过创建好的Configuration对象可以创建一个SessionFactory对象的实例,它是产生Session对象的工厂,它在整个应用中是唯一的。

© 创建Session对象实例:Session对象类似于数据库的连接对象,可以理解为与数据库建立的一个连接,这个连接可以进行数据库的其它操作。

(d) 开始一个事务。

(e) 进行持久化操作:读取或保存java对象。

(f) 结束事务:在操作完成后要进行显示的结束事务的操作。

(g) 关闭Session::类似于释放数据库的连接。

3.4.5 定义和实现Hibernate DAO

在完域模型的定义和配置工作后,要完成HibernateDAO的定义和实现。

首先定义DAO接口,使用的接口的编程方法,可以在方法调用者和方法具体实现之间建立一个屏障,即它们不存在任何的关联,一边的修改不会影响另一边的正确运行。在本系统中,DAO接口(IBaseHibernateDAO)只有一个方法:返回Session对象。

然后实现DAO接口,每个方法的实现,这里只介绍UserDAO,MessageDAO,CommentDAO,这三个类的关系如图3-8所示:

图3-8 Hibernate DAO UMR图

3.4.6 Hibernate Filter的实现

在Web应用中,通过Filter来进行Hibernate事务管理并不仅仅出于处理方便,在本系统中,采用了面向对象的设计方法,每个Message对象都持有一个User对象的实例来表示这个二手信息的发布者,这与传统的结构化开发有很在区别。在结构化的开发方法中,Message对象中的属性应该是与信息存储表中的字段一一对应的,那么它就应该创建一个持有用户ID的属性来表示信息的的发布者。而在该系统中,我使用User类作为Message的属性。在面向对象的方法中,只需取得页面中需要显示的Message对象就可以了。

通过上面获取对象的不同方法可以看出,采用面向对象的方法可以在很大程度上减少进行持久化操作所要进行的编码工作。而对于Message对象所持有的User对象则会由持久层(本系统用的是Hibernate)自动去完成相应的读取操作。

在本系统中,通过Filter的机制,将一个用户请求中所做的所有持久化操作看成一个事务。当然,如果某个业务确实需要将这个请求分解成多个事务,那么也就可以在业务实现的方法中自选进行事务的提交可者回滚操作。也就是说,整个用户请求都是在一个Session中完成的,在响应用户请求之前会自动开始一个Session和事务。在处理完用户请求直到页面输出完毕后才提交当前的事务和关闭用户的Session。这样,就可以确保应用随时都可以通过Hibernate来获取相关对象的信息。

另外在本系统的Filter中还进行了字符编码的控制,在每次用户请求中都将字符转化为GBK,以确保信息的正确保存。本系统用到的Filter关键代码如下:

(1) 字符编码转化

request.setCharacterEncoding("GBK");

(2) Hibernate事务处理

session.beginTransaction();

chain.doFilter(request, response);

session.getTransaction().commit();

完成Filter类后,要对该Filter进行配置和部署,Filter的配置和部署工作是在WEB-INF目录下的Web.xml中配置的,相关配置代码如下:

java 复制代码
<filter>
		<filter-name>hibernateFilter</filter-name>
		<filter-class>cn.lee.market.filter.HibernateFilter</filter-class>
</filter>
<filter-mapping>
		<filter-name>hibernateFilter</filter-name>
		<url-pattern>/*</url-pattern>
</filter-mapping>

4 系统功能模块的实现

在本章内,将为大家详细说明系统功能模块的具体实现,系统主要使用了JSP、Javascript、Java、HTML以及DHTML语言等综合处理页面信息的显示和各个功能模块功能的设计,以及通过Hibernate对数据库的操作,完成了一个动态的校园二手交易平台。

4.1 系统主页设计

4.1.1 主页显示设计

系统主页是面向平台的所有访问者,注册用户和非注册用户都可以进入到系统主页面,查看相关的二手信息及二手指南。主页面由平台Logo、登录框、搜索框和各种类型的最新二手信息列表组成。主页面效果如图4-1所示:

图4-1 主页面

4.1.2 主页后台设计

系统主页面显示了最新各种类型的二手信息和二手信息top排行,这些都在进入主页前放入request,还有搜索条件中的分类下拉列表和交易地区下拉列表需要放入session中供以后使用。这些操作在IndexAction中实现,相关代码如下:

(1) 查询各种类型的二手信息,放入request,供主页面显示。

List typeList = tDao.findAllType();

for(Type type:(List)typeList){

List typeMessage = (List)mDao.getTypeMessages(type.getId());

messageMap.put(type.getId(), typeMessage);

typeMap.put(type.getId(), type.getType_desc());

}

request.setAttribute("messageMap", messageMap);

(2) 查询所有分类,所有交易地区放入session,用于搜索框下拉列表及其它操作。

request.getSession().setAttribute("typeMap", typeMap);

List areaList = aDao.findAllArea();

for(Area area:(List)areaList){

areaMap.put(area.getId(), area.getArea_desc());

}

request.getSession().setAttribute("areaMap", areaMap);

(3) 按人气将信息排序后放入TopMessageList,供主页面显示。

List TopMessageList = mDao.findByTop_value2();

request.getSession().setAttribute("TopMessageList", TopMessageList);

4.2 系统登录功能设计

由于游客、普通用户、管理员限不同,系统实现登录功能,为普通用户、管理员的特殊操作提供接口。
登录流程简单描述为输入->验证->返回主页。本系统为登录表单设计了ActionForm,在Action只须对接收到的ActionForm进行验证,验证其是否为用户、用户权限等,并根据不同验证结果进行相应操作。登录Struts配置如图4-2所示:

图4-2 登录Struts配置图

登录成功后,普通用户、管理员都将在主页面显示用户的基本信息,并提供信息管进,发布信息,修改个人资料和用户注销的链接。登录成功效果图如图4-3所示:

图4-3 用户登录成功效果图

4.3 系统搜索功能设计

系统搜索时也用ActionForm(searchConditionForm)接收搜索表单,在Action中用Dao对象操作ActionFromr返回搜索结果,搜索Struts配置如图4-4所示:

图4-4 搜索Struts配置图

Dao对searchConditionForm的操作代码如下:

java 复制代码
public List findBySearchCondition(SearchConditionForm searchConditionForm) {
		String keyword = searchConditionForm.getKeyword();
		String typeid = searchConditionForm.getTypeid();
		int flag = searchConditionForm.getFlag();
		String areaid = searchConditionForm.getAreaid();
        try {
        	String queryString = "from Message where (message_title like '%" + keyword +"%'" +"or message_desc like '%" + keyword +"%')";
        	if(typeid!=null&&!"allType".equals(typeid))
        		queryString += " and MType = '"+ typeid +"'";
        	if(flag==1||flag==0)
        		queryString += " and flag = "+ flag +"";
        	if(areaid!=null&&!"allArea".endsWith(areaid))
        		queryString += " and MArea = '"+ areaid +"'";
        	queryString += " order by id desc";
        	System.out.println(queryString);
	         Query queryObject = getSession().createQuery(queryString);
			 return (List)queryObject.list();
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
}

搜索结果的显示实现了分页显示功能,搜索效果如图4-5所示:

图4-5 搜索效果图

在该系统中,页面中所有信息列表的显示均使用JSTL标签进行处理,这里仅对搜索结果显示的代码作一下分析,关键代码如下

<c:forEach items=" s e a r c h M e s s a g e L i s t " v a r = " m e s s a g e " b e g i n = " {searchMessageList }" var="message" begin=" searchMessageList"var="message"begin="{first }"

end="{last }"\> \[出售\] \[求购\] [{fn:substring(message.message_title,0,20) } {fn:length(message.message_title) le 20?"":"..."}](%7bctx%7d/message.do?messageid=$%7bmessage.id%20%7d) ${message.MArea.area_desc} ${message.old_value }成新 ${message.price }RMB ${message.top_value } 说明:searchMessageList是从Action中返回的信息列表,在此用C标签进行循环打印,字段值的输出使用EL表达式,使页面代码简洁,容易理解,修改[4]。

4.4 用户注册功能设计

本系统用户注册实现了学生实名制,注册前要先同意平台协议,然后在注册输入界面输入相关信息,系统收集到用户注册人信息,验证通过后注册成功,进入注册成功页面。

4.4.1 用户注册页面设计

注册页面包括表单和表单验证。注册页面所涉及的表单元素如表4-1所示:

表4-1 注册页面所涉及的表单元素

名称 元素类型 重要属性 含义

Username Text maxLength=16

οnblur="checkUsernameFormat(this)" 平台帐号

stu_id Text maxLength=12 学号

Birthday Text οnclick="GetCalendar(this,'birthday');" src=".../images/calendar/calendar.gif" 生日

email Text 前台验证: isEmail(this) E-mail

password password maxLength=20 密码

repassword password maxLength=20 确认密码

question Text id=txtTipQuestion 密码问题

answer Text id=txtTipAnswer 密码答案

注册表单提交前使用javascript脚本进行验证,核心代码如下:

java 复制代码
if(!checkUsernameFormat(f.username))
		return false;
	if(!isNumeric(f.stu_id,'学号格式不正确!'))
		return false;
	if(!isEmail(f.email))
		return false;
	if(f.repassword.value != f.password.value){
		alert('两次输入的密码不相同!');
		f.repassword.value="";
		f.password.value="";
		f.password.focus();
		return false;
	}
	if(!isNotEmpty(f.question, '密码查询问题不能为空!'))
		return false;
	if(!isNotEmpty(f.answer, '密码查询答案不能为空!'))
		return false;
	return true;

注册验证效果如图4-6所示:

图4-6 注册验证效果图

4.4.2 用户注册后台设计

用户注册后台操作在Action中进行,后台实现了将用户信息插入数据库并将新注册用户以及用户权限放入session。用户注册Struts配置如图4-7所示:

图4-7 用户注册Struts配置

4.5 发布、修改信息设计

信息的发布和修改是该系统的最主要功能,只有注册用户或管理员才有权限进行信息发布,普通用户只能修改自己发布的信息,管理员可以修改所有信息。
信息的发布和修改共用了同一个页面,页面中包含表单和表单验证。表单通过ActionForm接收,在Action中对表单的操作根据信息编号参数值判断执行发布或修改。

信息发布页面效果如图4-8

图4-8 信息发布页面效果图

信息表单元素如表4-2所示:

表4-2 信息表单元素

名称 元素类型 重要属性 含义

postForm from action="post.do" method="post"

οnsubmit="return(post_check(this))" 表单

messageid hidden --- 信息编号

message_title Text maxLength=30 信息标题

old_value DropDown οnclick="GetCalendar(this,'birthday');" src=".../images/calendar/calendar.gif" 新旧程度

flag DropDown --- 交易类型

typeid DropDown 遍历 t y p e M a p v a l u e = " {typeMap } value=" typeMapvalue="{type.key }" 所属类别

areaid DropDown 遍历${areaMap } value=" ${area.key }" 交易地区

price Text maxLength=10 物品价格

r_user Text maxLength=10 联系人

r_email Text maxLength=20 E-mail

r_phone TEXTAREA --- 联系方式

message_desc TEXTAREA --- 物品简介

submit submit value="提交" 提交按钮

reset reset value="重置" 重置按钮

信息发布、修改的具体操作在Action中进行,Action中首先验证是否为用户,非用户则弹出消息返回主页,反之执行相应操作。信息发布、修改Struts配置如图4-9所示:

图4-9 信息发布、修改Struts配置图

4.6信息管理设计

信息管理分为普通用户个人信息管理和管理员会员信息管理。管理页面显示了要管理信息的重要信息,并提供链接可进入详细信息页面。每个信息都有修改、删除按钮。这里只介绍个人信息管理页面,页面效果如图4-10所示:

图4-10 个人信息管理效果图

4.7 信息留言设计

登录用户可以对信息进行留言,留言会立刻显示在信息详细下面。留言输入界面显示有登录用户的相关信息(用户名和邮箱),这些信息会连同留言表单内容传入Action中进行插入操作。留言界面效果如图4-11所示:

图4-11留言界面效果图

留言成功后返回到信息详细页,信息最后显示该信息的所有留言,效果如图4-12所示:

图4-12 留言成功界面效果图

4.8 二手指南设计

二手指南是平台为用户提供的二手帮助指南,游客和普通用户都只能对其进行浏览操作。二手指南的增加,修改,删除都是管理员来操作。在该模块,因为二手指南只有标题和内容两个字段,所有没有必要用ActionForm来接收表单,操作仍然写在Action中。

5总结

本次毕业设计工作在最初选题过后,我选择了JSP,它是真正的跨平台,实现动态功能的一种技术。JSP+Servlet+JavaBeans/EJB,能够让人非常简单方便地构建安全高速的WEB应用。同时可以通过JDBC(Java DataBase Comnectivity)接口,访问几乎所有数据库,并且可以使用数据库连接池技术,有效控制连接数,确保系统的正常运转。从发展的眼光来看,JSP的前途一片光明。在数据库的选择上,我也使用近些年发展很好的MySQL,充分实现系统的跨平台性。 在这个系统开发过程中,我对Hibernate的学习从零开始,作过许多小测试。每次的新发现我都运用到这个系统中,在运用中,对它的掌握也更加熟练。还是系统运用Struts框架,在该系统的开发过程中,参阅了很多相关的书籍,特别的Apache官方网站的帮助文档,不仅解决了很多问题,也提高了自己的英文水平。系统中所有的页面,我都争取只写显示代码,用到了JSTL标签和EL表达式,使页面上代码简捷,易懂,易改。 经过1个月左右的设计与开发,系统终于基本开发完成,各项预期功能都已得到实现,并且还具有进一步的扩展空间,将会伴随着日后的使用逐步完成。设计和开发过程中遇到的问题也都得到解决,学到了很多开发经验,受益无穷。

致 谢

本系统是在我的指导老师陈敏歌老师悉心指导下立完成的,论文的每次改动都离不开老师认真的指点,信息教研室的每个老师都很忙碌,陈老师也不例外,而她却在百忙之中给予了我最大的帮助和支持,无私地付出令我颇为感动。在校期间,导师渊博的知识、严谨的治学作风,宽厚的长者风范给我留下深刻的印象,使我受益终生。在此向我的导师表示衷心的感谢! 同时,还要感谢为我提供相关资料的老师、同学、朋友和有关单位。在此向他们表示诚挚的谢意! 最后,再一次感谢所有关心、帮助我的老师,同学和朋友!

参 考 文 献

[1]郑莉. Java语言程序设计[M].北京:清华大学出版社,2005:27-61 [2]陈天河.Struts,Hibernate,Spring集成开发宝典[M].电子工业出版社,2007:286-392 [3](奥)科夫勒.MySQL 5权威指南(第3版)[M].杨晓云等译. 人民邮电出版社,2006:19-57 [4]孙卫琴 李洪成.Tomcat与Java Web开发技术详解[M].电子工业出版社,2004:73-102 [5]孙鑫.Java Web开发详解[M].电子工业出版社,2006:383-432

相关推荐
夏子曦2 分钟前
java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC
java·开发语言
gogo_hua2 分钟前
JVM系列之OOM观测准备
java·大数据·jvm
m0_6754470814 分钟前
Solon 拉取 maven 包很慢或拉不了,怎么办?
java·maven
武昌库里写JAVA18 分钟前
SpringCloud+SpringCloudAlibaba学习笔记
java·开发语言·算法·spring·log4j
爱编程的小生20 分钟前
SpringBoot Task
java·spring boot·后端
CoderJia程序员甲26 分钟前
重学SpringBoot3-异步编程完全指南
java·spring boot·后端·异步编程
小咖拉眯30 分钟前
第十六届蓝桥杯模拟赛第二期题解—Java
java·数据结构·算法·蓝桥杯·图搜索算法
扬子鳄00830 分钟前
Spring Boot自动配置机制
java·数据库·spring boot
岁岁岁平安32 分钟前
springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)
java·spring boot·后端·mybatis·动态sql·pagehelper·条件分页查询
一直学习永不止步37 分钟前
LeetCode题练习与总结:数组中两个数的最大异或值--421
java·算法·leetcode·字典树·数组·位运算·哈希表