发布者:flyfox
在这个练习里你将学习使用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)..
