在这个练习里你将学习使用 JDBC 访问数据库和插入一个记录到数据库的基础知识。
在这个练习里,你将写 RegistrationServlet 类的 register 方法。这个类和你在 Servlet1A 练习里用的一样。在这个练习里,你将使用数据库的功能。这个练习将展示实现用户需求的步骤。
第一部分:理解 regsiter() 方法在 RegistrationServlet 中的工作原理
在这个练习里,你将在 com.ibm.waslab.JDBC 包上工作。扩展 RegistrationServlet 类,理解 register() 。这个方法抛一个 SQLException 。完整的方法声明是:
public synchronized void register(Properties formInput)
throws SQLException{
}
register() 方法在 servlet 取得控制时从 doPost() 方法里被调用。 register() 方法实际上写一个新的记录到数据库。我们将在第二部分写 register() 方法。同时,我们需要确信一些设置步骤已经完成。
1. 打开 init() 方法,在 super.init() 的调用后面输入以下的代码:
//Load JDBC driver for DB2
try
{
Class.forName(JKToysDBInfo.gerDriver());
}
catch (ClassNotFoundException e)
{
erroLog(“JDBC Driver not found”+e);
}
保存 init() 方法。记住,在驱动器管理可以得到一个连接以前,一个正确的数据库驱动器必须被 servlet 装载。每一个 servlet 只在 servlet 的 init() 方法里作一次。这个方法并不真地建立一个连接,它只是允许连接被建立。
注意:在这个情况下,我们装载 DB2 app 驱动器。这个驱动器是在数据库装在 servlet 将要运行的同一台机器上时使用的。如果你在访问另一台机器上的数据库,你要使用 net 驱动器:
COM.ibm.db2.jdbc.net.DB2Driver
当用 net 驱动器得到一个连接,你需要在 getConnection() 里使用的 URL 里提供更多的信息。数据库所在的机器名或 URL ,和 DB2 Java Gateway 侦听的端口号。一个有效的 URL 参数看上去是这样的:
jdbc:db2://servrid:8888/databasename
第二部分
1. 现在,回去,重新打开 register ()方法。代码的第一行创建一个数据库连接:
Connection conn=DriverManager.getConnection(URL,USER,PASSWORD);
你用驱动器管理器的静态方法 getConnection() ,把数据库的 URL ,一个有效的用户 ID 和口令传递给它。 url,userid 和 password 在类被装载时从一个属性文件里得到 ( 看静态变量声明 ) 。
2. 现在到了有挑战性的部分了。我们要作的第一件事是找到已经被分配掉的最后一个客户号码,这样我们可以分配给正在注册的新客户一个新的客户号码(比以前的最高的还要高)。我们要存储这个新的客户号码在一个 int 变量名为 nextId 。为了做到这个,你会需要确信使用 Statement 类和 ResultSet 类。以下的 SQL ;
“SELECT MAX(CUSTNO) FORM”+DBOWNER+”.CUSTOMER”
将允许你获得当前最高的客户号。试试自己写这个代码,基于课程笔记的例子。如果你需要帮助,看答案页。
3. 接着你将用一个 prepared statement 对象来把客户属性对象里的信息插入数据库。输入以下的行:
//Insert record in the database
PreparedStatement insertStatement=
conn.prepareStatement(“INSERT INTO”+DBOWNER+”.CUSTOMER(FNAME,LNAME,ADDR,CITY,STATE,AGE,ZIP,CUSTNO)”+”VALUES(?,?,?,?,?,?,?,?)”);
上面的行要求连接创建一个 prepared statement 对象叫 insertStatement 。 SQL 语句作为参数被传递。数据库行的每一列的值用问号代表。每一个问号必须被一个正确类型的值代替。输入以下行:
insertStatement.setString(1,formInput.getProperty(“FNAME”));
insertStatement.setString(2,formInput.getProperty(“LNAME”));
insertStatement.setString(3,formInput.getProperty(“ADDR”));
insertStatement.setString(4,formInput.getProperty(“CITY”));
insertStatement.setString(5,formInput.getProperty(“STATE”));
insertStatement.setString(6,formInput.getProperty(“AGE”));
insertStatement.setString(7,formInput.getProperty(“ZIP”));
insertStatement.setInt(8,nextId);
4.insertStatement 执行对数据库的更新。输入下面两行:
insertStatement.executeUpdate();
如果有错误出现在创建连接时,语句或访问数据库,这个方法会抛出一个 SQLException 。
5. 最后你需要存储客户号码到 formInput 属性对象。输入下面行:
formInput.put(“CUSTNO”,new Integer(nextId).toString());
6. 保存方法。应该没有错误。
7. 接着你将需要为 JKRegister servlet 编辑 WebSphere 配置文件。 ( 编辑 ”[x:]\IBMVJava\ide\project_resources\IBM WebSphere Test Environment\properties\server\servlet\servletservice\serrvlets.properties”.)
改变看上去这样的行:
servlet.JKRegister.code=com.ibm.waslab.servlet1.RegistrationServlet
为这样:
servlet.JKRegister,code=com.ibm.waslab.JDBC.RegistrationServlet
8. 如果你的 webserver 在运行,关掉它。在 VAJ ,启动 SERunner 。打开你的 web 浏览器,到 JK Toys 网站的注册页面。在表格里输入注册信息,按注册按钮。你的新的 servlet 将被调用。登录进 JKToys 站点确信注册已经发生。你的新的客户号码应该能在数据库找到。
在这个练习你作了什么
在这个练习,你编写了 Registration Servlet 的 register 方法。这个方法用 JDBC 来创建一个新的客户号码,注册一个新的客户到数据库。现在你有了在你的 servlets 里访问数据库的基本知识。
答案
以下的代码创建一个 SQL 语句,执行在前一页里定义的 SQL 查询。
//Get next customer number
Statement sqlStatement=conn.createStatement();
ResultSet result=sqlStatement.executeQuery(“SELECT MAX(CUSTNO) FROM”+DBOWNER+”.CUSTOMER”);
查询的结果被放在 ResultSet 对象叫 result 里面。结果的集合包含一个游标,最初指向返回的第一行前面。为了得到查询的值游标必须用 next() 往前移动。用这个方法,游标只能向前移动。下面几行移动游标到返回的值,增加 1 。
int nextId=0;
if(result.next()= =true)
{
nextId=result.getInt(1)+1;
}
if 检查确定是否有行被返回。如果没有,结果为 false 。我们不处理错误的情况,但是它可以简单地用把 nextId 设置为 1 来处理。我们还可以用 ResultSet 的方法 getInt(String) ,列的名字为 ”CUSTNO” ,但是因为我们知道只有一列会被返回,我们选择用 getInt(int)..
· 安全: Servlet安全这个练习展示你怎样使用 WebSphere 的 Servlet 安全特性来创建一个用户组,一个用户集合,和一个访问控制列表,然后增加一个 servlet 到被这个访问控制列表保护的资源列表。
这个练习将有三个部分。在第一个部分我们将作一些初始设置,包括取得前一个练习 (WebSphere studio lab) 里创建的 servlet ,给它一个名字。第二个部分将展示怎样在 WebSphere 里创建用户和用户组,最后一个部分会介绍创建 ACL 和把资源 ( 包括 servlet) 指派到 ACL 。
第一部分:初始设置和 Servlet 命名
1. 这个练习从你以前完成的 WebSphere studio 练习 ( 练习 5) 的结果开始。如果你没有完成那个练习,解开文件 c:\Lab5Solutions.zip 到 c:\ 。
2. 把文件 ViewCustomersServlet.servlet 从 \WebSphere\Appserver\servlets\JKToys 目录拷贝到 \WebSphere\Appserver\servlets 目录。
3. 下一个任务是让 JKToys.ViewCustomersServlet 类成为一个 named servlet 。 WebSphere 的访问控制特性依靠 servlet 命名――对没有命名的 servlet 它们不工作。为了做到这个,我们将用 WebSphere Application Server 管理工具工作。为此你需要从 IBM HTTP Server 启动 Application Server( 记住首先在 VA Java 里停掉 SERunner) 。在 Web Server 和 Application Server 被启动以后,从你的浏览器用 http://localhost:9527 登录进 WebSphere 管理页面。记住缺省的 WebSphere 管理用户的 ID 和口令为 admin,admin 。当管理页面打开,打开标签为 ”Servlets” 的树节点,选择 ”Configuration” 来打开 Servlet Configuration page 。
4. 按 ”Add” 按钮。我们将命名这个 servlet 为“ ViewCustomersServlet” 。在 ”Servlet Name” 域键入 ”ViewCustomersServlet” 。 View Customers servlet 的类是 ”JKToys.ViewCustomersServlet” 。在 ”Servlet Class:” 域键入这个,按 ”Add” 按钮。(如果你要,按 ”Test” 按钮来测试这个 servelt, 然后释放说测试被通过的对话框。)
5. 我们接着需要作一些整理工作,检验我们的命名是否工作正常。在你的硬盘上的 [x:]\www\html\JKToys\html( 或 jspSolutions) 目录里找到 ”ViewCustomersInputPage.html” 文件。用 notepad 或别的文字编辑器打开那个文件。找到行“ <FORM METHOD=POST ACTION=”/servlet/JKToys.ViewCustomersServlet”> ”改成,“ <FORM METHOD=POST ACTION=”/servlet/ViewCustomersServlet”> ”。保存这个文件。现在,往你的浏览器里输入以下的 URL :” http://localhost/JKToys/html/ViewCustomerInputPage.html”. 。确信 ”View Customers” 按钮出现,一旦按钮被按下,包含客户信息的表出现。
第二部分:增加用户和用户组
1. 既然我们的重命名已经完成,我们可以开始向我们的 ViewCustomersServlet servlet 增加口令保护。回去到 Administration GUI (如果你测试和命名 servlet 用了同样的浏览器,你将需要重新登录进 WebSphere 管理)。从树里选择 ”Security” 节点。你会看到 Security tree 有四个节点:
Users
Groups
Access Control Lists
Resources
我们将在我们的练习里用所有四个 tabs 。
2. 选择“ Users” 。一个表会打开,显示 WebSphere 已经在它的内部数据库里有的用户的列表。一个缺省的 WebSphere 安装会有两个用户,” jeeves” 和 ”admin” 。我们将增加一个新的用户叫 ”sales” 。按 ”Add” 。一个对话框显示出来,问用户的名字和口令,要你确认口令。在用户名域输入“ sales” ,在口令和确认口令域都输入 ”bluefish” 。然后按对话框里的“确定”按钮。用户 ”sales” 将被加进表。在一个实在的应用里,我们显然不用一个可在字典里找到的口令――你可以用字母和数字的随机组合。
3. 我们将增加一个用户组到 WebSphere 。我们要允许销售人员和管理人员都可以列出客户――销售人员会看客户列表,管理员会需要在数据库崩溃时维护客户列表。我们要创建一个新的用户组名字为“ customer-access” 包含所有这些用户。按 ”Group” 。显示器有三个列表。最上边的是” Defined Groups”( 现在忽略 ”realm” 下拉菜单――让它保持 ”DefaulgRealm” 设置 ) 。左边的按钮是增加和删除组。按“ Add ”按钮。一个对话框显示出来,向你要要增加的组的名字。输入 ”customer_access” 按“ Add” 按钮。 ”customer_access” 组将被加进列表。我们现在已经准备好用底部的两个列表。左边的是成员列表,现在还空着。在右边的列表 (“non-memebers”) 里选择 ”admin” 用户,按 ”<Add” 按钮。这个用户会被加到用户组。对 ”sales” 用户作同样的事。我们现在完成了创建用户组的工作。
第三部分:创建 ACL 和增加资源
1. 我们现在准备好向 WebSphere 的 ACL 增加新的 ACL 了。按 ”Access Control List”. 显示的面板和 Groups 的面板相似,最上边的下拉菜单显示 realms( 再一次,让它保持“ defaultRealm”) ,最上边的列表显示 ACL's 的列表。应该有一个 ACL ,简单的叫做 ”defaultAcl” 。我们将创建一个新的 ACL 叫做 ”customer_access_ACL” 。按左边的 Add 按钮。一个对话框会显示出来,要求要加入的新的 ACL 的名字。在文字域输入 ”customer_access_ACL” ,按 ”Add” 。一个新的 ACL 叫做 ”customer_access_ACL” 的 ACL 将被加进列表。
2. 这里我们已经准备好向用户组指派权限。在 ACL 列表下面有一个树形图包含三个分枝: Users,groups,computers 。所有这些分枝应该都是空的 ( 没有儿子 ) 。按中间的分枝 (Groups) ,然后按这个视图左边的 ”Add” 按钮。这个将带出来一个对话框,让你向不同的用户组指派权限。
3. 现在对话框出现了,下一步是在我们的 ACL 里向新的用户组指派权限。在 ”Assign Permission for:” 对话框的上面有两个 radio button 。这两个选择是 ”files and folders” 和 ”servlets” 。你也许以为我们要 ”servlets” ,但是相反我们要选择 ”files and folders” 。 ”servlets “选项是指一个运行的 servlet 拥有的权限,例如打开 sockets ,读文件等。我们要设置访问一个 servlet 的权限;这是 HTTP 协议下的文件访问。另一组 radio buttons 让你选择你是否要为 ”Users”,”Groups”, 或 ”Host” 设置权限。选择” Groups” 。因为只有一个组,它 (customer_access) 应该在第二组 radio buttons 下面的 ”principals” 列表里被选中。在 ”principals” 列表下面是一组 check boxes, 标着 ”GET”,”PUT”,”POST”,”DELETE” 。 check”GET” 和“ POST”check boxes ,按 check boxes 下面的“确定”按钮。这给这个用户组对这个 ACL 保护的文件,文件夹和 servlets 使用” GET “和” POST “方法的权限。
4. 我们现在要结束我们的练习。按 ”Resouces” 。在 ”realm” 下拉菜单下面你将看到一个空的表。按表左边的 ”Add” 按钮。这个会带出来一个对话框,让我们增加资源到我们创建的 customer_access_ACL 保护的资源列表里。
5. 当 ”Protect A Resource” 对话框出现,改变 ACL 下拉菜单为 ”customer_access_ACL” 。然后在 ”Resource to Protect” 下面,选择 ”Servlet” radio button ,从下拉菜单选择 ”ViewCustomers”servlet ,然后按“确定”释放对话框。你会在 Resource 表里看到资源 ”ViewCustomersServlet” 和 ”customer_access_ACL”ACL 之间有一个联系。我们现在结束了编辑我们的 ACL 和资源,准备测试了。
6. 在一个浏览器,输入 URL http://localhost/JKToys/html/ViewCustomersInputPage.html 。 ”View Customers” 按钮出现,按它。一个 challenge dialog 应该出现,向你要名字和口令。如果对话框没有出现,重新看看你在这以前的步骤。如果你不能找到错误,向你的实验辅导员请求帮助。首先输入一个无效的用户名和口令。你应该接着收到 challenge dialog 。输入 ”sales” 和 ”bluefish” 给名字和口令。现在,客户的表应该象在这个练习的开头一样显示出来。如果 challenge dialog 又出现了,重新输入名字和口令。 challenge dialog 通常会给你三次机会输入正确的名字 / 口令对,如果都失败,浏览器会显示错误“ 401 Unauthorized” 。
在这个来年练习里,我们创建用户和用户组,创建一个 ACL 和指派一个 servlet 资源到 ACL 。我们已经展示怎样给一个 servlet 增加口令保护。
(全文完)