本文是有关Java服务程序的三组系列文章之二上个月( JDJ第卷第期)我向大家介绍了Java服务程序技术以及如何将您现有的CGI程序移植到Java服务程序的方法本文将不再重复以前介绍的内容我先假定大家对Java Servlet API (应用程序设计接口)和Java数据库连接API的基本知识已经比较熟悉在本文中我将介绍如何利用Java服务程序(Servlet)和Java数据库连接(JDBC) 技术创建三层次数据库应用程序您将了解每一层的创建方法以及采用数据库连接来创建Java服务程序所使用的技术
挑 战
某着名公众演说家对参加她举办的因特网讲座的学生进行跟蹤调查每次讲座结束后她都会与感兴趣的学生交换名片然后把学生数据输入她的数据库程序她并非把每张名片的数据依次输入计算机而是借助万维网应用程序来完成这项工作在每次举办讲座时她都在若干万维网终端上设立万维网应用程序每位学生都在万维网终端登记输入各自的姓名所在公司电子邮件(email)地址课程名称和对课程的期望万维网应用程序还可显示所有学生的最新名单
三层解决方案
这个万维网应用程序由三部分组成浏览器服务程序中间件和数据库服务程序这三层如图所示
图 三层次解决方案
第一层使用浏览器可充分发挥这一通用客户端巨大的用户安装数的优势用一个HTML表格作为用户输入界面而数据库查询结果用HTML页面返回采用HTML页面作为用 户输入和数据显示的界面可降低对客户端浏览器版本的要求这种万维网应用程序并不要求必须采用具有最新JDK修补程序的Java使能的浏览器
第二层采用运行Java服务程序的Web服务器Java服务程序可访问 菘猓⒎祷亓杏惺莸腍TML页面请注意Java服务程序不只运行于Sun Microsystems公司的Java Web Server上您也可在下列服务器上使用Java服务程序Microsoft IISNetscape FastTrack Server及Enterprise Server以及O?Reilly公司的WebSiteProfessional在Live Software公司的JRun产品()上也可实现Java服务程序的功能Sun公司的Java Server主页上列有支持Java服务程序的Web服务器列表
第三层是后端数据库服务器只要计算机安装了JDBC驱动程序那么Java服务程序就能从数据库中提取数据在本文所讨论的情形里公众演说家的数据库是MSAccess 所以我们可以使用与Java Development Kit 版或更高版本捆绑在一起的JDBCODBC驱动程序
应用程序的交互过程
您可以看到应用程序被划分成三个不同的层次图表示应用程序不同层次之间的交互过程
图 应用程序的交互过程
下面介绍交互过程的每个步骤 第一步 用户将信息输入HTML表格表格的数据被传输到在Web服务器上运行的Java服务程序中
第二步 Java服务程序对表格的数据进行分析并创建一条SQL语句然后通过Java数据库接口(JDBC)将该SQL语句传输到数据库服务器
第三步 数据库服务器执行该SQL语句并将一组结果返回给Java服务程序
第四步 Java服务程序对这组结果进行处理并用其中的数据创建一个HTML页面随后该HTML页面被返回到用户的Web浏览器
对数据库模式进行分析
本文的公众演说家正在将学生信息存入MS Access数据库该数据库包括一个名为Students的数据表表定义了数据字段
表 数据库结构
设计Web浏览器界面
浏览器界面包括一个主菜单页面用户使用该页面可选择学生注册或显示数据库中的学生列表提供了主菜单的HTML代码
学生注册表
学生使用HTML表格进行注册该表格采集姓名电子函件地址公司名称和其它与课程相关的信息图为学生注册表
图 学生登记注册表
开发服务程序中间件
服务程序中间件封装了应用程序的业务逻辑服务程序对表格中的数据进行分析并构造一条SQL语句随后该SQL语句被传送到数据库服务器在SQL语句执行完毕后数据库服务器将结果集返回给服务程序至此服务程序对结果集进行处理并为用户构造一个HTML页面
被创建的服务程序称作StudentDBServletStudentDBServlet有执行下列功能的方法初始化对请求的服务对学生数据的显示和对学生的登记下面详细介绍这些功能
服务程序的初始化
在服务程序的生命周期内当服务程序第一次被调用时首先调用init()方法列表为init()方法的代码清单
StudentDBServlet服务程序来说一个数据库连接被打开并创建用于显示学生列表或进行学记的预先准备好的SQL语句(Prepared Statement)这个数据库连接在服务程序的整个生命周期内都将保持打开的状态根据用户的设计用户可以为每个SQL查询打开或关闭一个连接但在此应用中数据库连接仅打开一次
对用户请求提供服务
每次服务程序被调用时service()方法会被调用service()方法是服务程序的主要入口点(Entry Point)但是如果这是服务程序第一次被调用那么就会先调用init()方法然后再调用service()方法
本应用中的service()方法系用来将请求转移给相应的处理方法学生登记表中有一个名为Register的隐含字段service()方法核对Register字段的值如果该值非空(null)则registerStudent()方法就被调用如果HTML页面不存在该字段则返回一个空值(null)如果返回空值(null)则会执行displayStudent()方法
显示学生名单
displayStudent()方法包括访问数据库和显示学生名单的业务逻辑这是通过使用辅助的Student (学生)类实现的列表 给出了Student类的代码
Student类有为每位学生保持信息的数据成员Student类还有能根据表格数据或一组数据库结果创建对象的构造程序下列语句表示学生的姓是如何从表格数据中获取 的
lastName = requestgetParameter (LastName);
请求对象是HttpServletRequest的一个实例请求对象包含表格数据表格数据可通过调用getParameter( )方法并提供表格字段的名称获得学生注册表中包含有一个LastName字段 (请参考我以前发表在JDJ的文章其中详细讨论了服务程序如何获取表格数据)
Student类有存取其数据成员并以字符串方式表示其数据的方法列表中包括了Student类的方法代码清单toString()方法以普通的字符串格式返回数据成员toWebString( )方法以HTML无序列表的格式返回数据toTableString( )方法以HTML表格的格式返回数据这些方法被用来创建学生名单
构造一个HTML页面后就创建了学生名单在列表中的displayStudents()方法中创建了HTML页面的标题随后再创建显示下列信息的表格标题
服务程序向数据库服务器发出请求获得学生的名单在init()方法中准备了下列SQL语句 select * from Students order by LastName;
SQL语句将根据姓氏并按照字母顺序返回学生的名单这组结果被用来创建HTML表格的主体通过创建while循环语句处理这组结果的每个记录该while循环语句的 部分代码如下
int rowNumber = ; while (dataResultSetnext( ) ) { aStudent = new Student(dataResultSet); tableBody += aStudenttoTableString(rowNumber); rowNumber++; }
每个记录都被用来创建一个新的Student对象toTableString()方法被调用以获得学生数据的字符串表示前面谈到toTableString( )方法以HTML表格的格式返回数据
在构造了表格主体后结果集就被关闭在主页的底部还提供了至主菜单页面的浏览链接
在服务程序方面进行了大量的处理工作但我们到现在还没有结束必须将HTML页面返回给Web浏览器这是通过在响应对象上打开一个输出流实现的响应对象是HttpServletResponse的一个实例将HTML页面返回给用户的语句如下
PrintWriter outputToBrowser = new PrintWriter(responsegetOutputStream()); responsesetContentType(text/html) ; outputToBrowserprintln(htmlPage); outputToBrowserclose( );
为HTML设置了内容类型(contenttype)后用println()方法将htmlPage串返回给浏览器图为StudentDBSServlet所返回的学生名单样本
图 学生名单
学生的登记处理
registerStudent()方法根据HTML表格数据创建一个新的Student对象这个Student对象被用来作为在init( )方法已经准备好的SQL语句中的参数下列语句表示参数是如何设置的
registerStatementsetString(LAST_NAME_POSITION aStudentgetLastName())
所有参数设置完毕后就执行SQL语句该语句执行完毕后新的学生数据就成功地插入到数据库中了
此外还为用户构造了确认页面确认页面包含成功地插入数据库的数据列表StudenttoWebString()方法被调用为无序列表提供一个HTML字符串
合
至此应用程序的全部三层均已构造完毕用户界面由在浏览器中显示的HTML页面组成对浏览器的唯一要求就是必须能显示HTML表格Microsoft (微软)公司和Netscape(网景)公司所提供的两种主要浏览器均可轻松地满足这一要求所以能保证Web应用程序对浏览器是友好的
后端数据库是采用Microsoft Access创建的但只要存在相应的JDBC驱动程序就可使用任何一种数据库在我们所讨论的情形里公