应当尽量避免使用JSPs实现复杂逻辑那种程序也许容易写但难以调试而且几乎不可能被理解和维护好的解决方案是用JSPs负责Web页面的显示(这正是JSPs擅长的)把复杂逻辑的实现交给Java如对数据库的访问这样程序不但比较容易实现和调试而且易于理解和维护
这个Web应用程序可以运行在专用Web服务器或者是个人电脑上操作系统可以是WindowsLinux或者Mac OS所需的软件包有Java运行时环境(JDK或以上版本)Tomcat最新版本(Tomacat 或以上版本)以及Ant开发工具(Ant 或以上版本)Ant用于创建Web应用程序包(WAR)以及在Tomcat上安装部署WAR文件配置关系数据库接口javaxsqlDataSource所有以上提到的软件包都可以通过Internet免费获得
这个Web应用程序还需要一个数据库几乎所有支持SQL而且有JDBC驱动的关系数据库都可以MySQL是一个符合条件的不错选择从可以得到MySQL的最新版本以及它的JDBC驱动Connector/J
为了让Ant与Tomact管理软件协同工作需要将catalinaantjar从Tomcat的server/lib目录拷贝到Ant的lib目录下将你的数据库JDBC驱动程序复制到Tomcat的common/lib目录下使Tomcat和其上的Web应用程序可以访问数据库最后必须建立Tomcat的admin和manager角色(roles)及其用户名和密码编辑Tomcat的conf目录下的tomcatuserxml文件如下
<?xml version=?>
<tomcatusers>
<role rolename=admin/>
<role rolename=manager/>
<user username=tomcatusername password=tomcatpassword
roles=adminmanager/>
</tomcatusers>
我的开发环境是Apple Cube运行Mac OS X 操作系统软件包JDK Tomcat AntMySQL 及Connector/J beta操作系统升级到Mac OS X 未出现任何问题同样Tomcat升级到也没出现问题
Web应用程序
本文通过一个叫做AddressBook的简单地址簿程序来说明如何应用将要介绍的技术这个应用程序的目的不是建立一个地址簿的正式版本它仅仅是一个例子
AddressBook中的Java程序
AddressBook中包含三个Java程序图显示了他们在Tomcat中的是如何使用的
educitycn/img_///jpg>
AddressBookContextListener
AddressBookContextListener是一个servlet上下文监听器它在AddressBook开始和关闭时被调用可以使用AddressBook的部署描述文件webxml配置当AddressBook开始运行时创建一个AddressesDB的实例并将它作为一个上下文属性保存而当AddressBook运行结束时从上下文属性中取出AddressesDB对象并关闭数据库连接在运行过程中当JSPs需要连接数据库它们将访问上下文属性中的AddressesDB对象
细节请看ContextListenerjava的完整的带有注释的源代码
AddressBook AddressesDB
AddressBook AddressesDB用于操作地址数据库它的构造函数建立一个数据库连接这个会话可以被多个Web会话共享这个类提供多个数据库连接函数
; getAddress(id)返回用id标识的地址如果地址没找到则返回null
; addAddress(address)添加地址并返回改变的行数
; deleteAddress(id)删除地址并返回改变的行数
; getAddresses()返回数据库中所有地址的聚集如果数据库无效返回null
; close()关闭数据库连接
细节请看AddressesDBjava的完整的带有注释的源代码
AddressBook Address
AddressBook Address是用于描述地址的类在用JSPs编程时用类集中描述数据仍不失为一个好的方法在AddressBook中使用的就是这种方法
AddressBook Address的构造函数将地址内容保存于对象中这个类中包括取得单个地址域的普通get函数两个获取合并的地址域的get函数以及一个地址比较函数
; Address(idsurnamefisrtnamestreetdistrictcitypostcode)
; getId()
; getSurname()
; getFirstname()
; getStreet()
; getDistrict()
; getCity()
; getPostcode()
; getFullname()返回firstname+ +surname
; getFulladdress()返回street+ +district+ +city+ +postcode
; compareTo(address)返回负整数零正整数分别对应surname和firstname大于等于小于这个surname和firstname比较是大小写不敏感的在存储地址聚集时使用
细节请看Addressjava的完整的带有注释的源代码
AddressBook中的JSP页面
AddressBook有七个JSP页每个代表一个对AddressBook数据库进行独立操作的Web页每个页面数据库的状态与前页数据库的状态是相互独立的如果数据库被其他用户改变了Web页面将检测到并产生相应的动作例如如果你正在修改一个地址而另一个用户在确认修改之前删除了该地址JSP将通知你修改不存在的地址失败
图显示JSPs之间的逻辑关系
educitycn/img_///jpg>
Homejsp是AddressBook的主页也就是用户使用AddressBook时见到的第一个页面它用一个表显示Address库中的所有地址表中的每一行显示一个地址以及删除或修改地址的连接页面底部有一个添加新地址的连接配置信息见webxml notes
; 添加地址连接将控制权交给RequestAddjsp
; 删除地址连接将控制权交给RequestDeletejsp同时将要删除的地址id传递给该页
; 修改地址连接将控制权交给RequestModifyjsp同时将要修改的地址id传递给该页
细节请看Homejsp的完整的带有注释的源代码
RequestAddjsp
RequestAddjsp提供一个地址表单用于输入新地址页面底部的取消连接可以取消这次操作
; 提交表单将新的地址域值以及控制权交给DoAddjsp
; 取消操作将控制权交给Homejsp
细节请看RequestAddjsp的完整的带有注释的源代码
DoAddjsp
DoAddjsp显示接收到的地址域值然后将新地址添加到数据库并显示是否成功的信息页面底部有一个继续连接
; 点击继续连接回到Homejsp
细节请看DoAddjsp的完整的带有注释的源代码
RequestDeletejsp
RequestDeletejsp读取得到的id相应的地址该页面在表中显示地址域以便让你确认删除的是正确的地址页面底部的两个连接分别是继续请求的继续连接和取消请求的取消连接
; 选择继续连接将转到DoDeletejsp并传递要删除的地址id
; 选择取消连接回到Homejsp
细节请看RequestDeletejsp的完整的带有注释的源代码
DoDeletejsp
DoDeletejsp读取传递给它的id在表中显示该id对应的地址从数据库中删除它并显示是否成功页面底部是继续连接
; 选择继续连接回到Homejsp
细节请看DoDeletejsp的完整的带有注释的源代码
RequestModifyjsp
RequestModifyjsp显示一个表单并填入当前的地址同时提供提交按钮和取消连接
; 提交表单将新的地址域值以及控制权交给DoModifyjsp
; 选择取消连接回到Homejsp
细节请看RequestModifyjsp的完整的带有注释的源代码
DoModifyjsp
DoModifyjsp显示接收到的修改的地址域值然后修改数据库中的地址记录并返回成功与否页面底部是继续连接
; 选择继续连接回到Homejsp
细节请看DoModifyjsp的完整的带有注释的源代码
AddressBook的Addresses数据库表
如何建立数据库取决于所用的数据库软件若你用的不是MySQL以下的步骤就需要根据情况修改AddressBook只有一个表Addresses保存在数据库Public中表Addresses有七个域
; id主键自动增长的数据域
; surname长度为的字符域保存联系人的姓
; firstname长度为的字符域保存联系人的名
; street长度为的字符域保存地址的第一行
; district长度为的字符域保存地址的第二行
; city长度为的字符域保存城市名
; postcode长度为的字符域保存邮政编码
首先建立MySQL数据库(Mac OS X )用管理员权限启动mysql命令行工具需要的话输入密码创建Public数据库以及账号mysqlusername密码mysqlpassord命令如下
# mysql u root p
mysql> create database Public;
mysql> grant all privileges on Public* to mysqlusername@localhost identified by mysqlpassword wi