在这个练习里你将在输入表格上执行错误检查,发现用户没有填写的字段。对这个例子来说,所有字段都是强制的。
你将从上一个 servlet 你丢下的地方开始这个练习。你将从草稿重写 getFormInput() 方法。这个方法从表格提取参数,返回一个 Properties 对象,用字段名字作键值。这个方法还检查空白或空参数。你将使用属性对象中的值来定制送回去的确认消息。
· 第一部分:创建 getFormInput() 方法
1. 在 VAJ 里打开 com.ibm.waslab.Servlet1 包里的 RegistrationServlet 。改变现存的 getFormInput() 方法的 signature ,增加以下的 ”throws” 列表。
Private Properties getFormInput (HttpSErvletRequest req) throws
InvalidParameterException
{
}
注意:这个方法抛出一个 InvalidParameterException ,这个异常的类已经提供给你了,在 VAJ 的 com.ibm.waslab.exception 包里。
getFormInput() 方法声明为 private ,返回一个 Properties 对象,它将包含表格的参数名字和值。它把 HttpServletRequest 对象作为一个参数,因为它包含原始形式的输入表格的值。
2. 然后,增加代码检查空白字段。
注意:在这些指导里,因为印刷的行的长度限制,有很多行代码在纸上被分开了。你应该在 VAJ 里把这些行作为一个单独的行输入。
Properties formInput=new Properties();
Enumeration fieldNames=req.gerParameterName();
while (filedNames.hasMoreElemenets())
{
String paramName=(String)fieldNames.nextElement();
String paramValue=(String)
req.getParamterValues(paramName)[0];
//check for missing parameters(code to be added)
if (paramValue.length()= =0)
throw(new InvalidParameterException(“Required parameter missing”));
formInput.put(paramName,paramValue);
}
return formInput;
确信你理解所有已经有的代码。第一行声明一个新的 Properties 对象,命名为 formInput, 来保存参数名字 / 值对。然后这个 request 对象的 getParameterNames() 方法是用来取得一个所有参数名字的枚举。这些是表格里字段的名字,将被用作 formInput properties 对象的键值。
反复通过枚举,你取得参数名字和值。你检查,来确保每一个值有一个比 0 大的长度。如果长度等于 0 ,一个异常被抛出和处理。如果值的长度比 0 大,它被保存在 formInput ,用字段名字作为键值。当枚举里没有更多的元素时,循环结束,返回填好的 forminput Properties 对象。
保存 getFormInput() 方法,重新打开 doPost() 方法。
· 第二部分:处理 InvalidParameterException 异常
因为 getFormInput() 现在可以抛出一个异常, doPost() 里的代码得处理这个情况,把这个方法的调用放在一个 try/catch 块里。修改调用 getFormInput() 的代码段来处理这个异常。如果异常被抛出,调用方法 missingParameterResponse(), 这将生成一个错误 HTML 页面。在异常的情况下,你还将需要从 doPost() 方法返回,结束事务,不写任何东西到数据库。
重新提交一个表格来测试代码,这次有一个参数(输入表格上的一个字段)没有填入。错误页面应该被显示,而不是你在前一个练习里编码的成功注册消息。
· 第三部分:产生一个定制的输出 HTML 页面
1. 在这个部分你将定制用户在记录被存入数据库后看到的信息。你会在页面里显示客户的名字和新指派给客户的客户号码。在 register() 调用后面输入以下的行:
//Output confirmation message
out.println(“<html>”);
out.println(“<head><title>Registration Complete</title></head>”);
out.println(“<body>”);
//modified or additional lines of code are in bold
out.print(“<h2><br>Greetings:”);
out.println(“formInput.getProperty(“FNAME”)+”</h2>”);
out.println(“<br>Your registration has been recorded in the database”);
out.println(“<br><br>You have been assigned customer number”<strong>”+formInput.gerProperty(“CUSTNO”)+”</strong>);
out.println(“<br>Thank you for your interest in JKToys”);
out.println(“<br><h2>We lo “确定” forward to serving you in the future!</h2>”);
out.println(“<a href=\””+ServletUtil.getClientURL(req)+”/jktoys/htm/jktoys_kids_zone.html\”>”+”Back to the kids Zone!!!</a><br>”);
out.println(“</body></html>”);
out.flush();
out.close();
return;
在这个练习里我们假设写数据库成功。在一个真实的应用里,你应该捕捉在 register() 方法里的任何异常,显示合适的错误信息。
注意字段的值怎样从属性里提取,插入被建立的 HTML 页面的正确的地方。
从底向上第四行建立一个回到注册页面的超链接。 ServletUtil.gerClientURL(req) 的调用返回 URL 的第一部分,包含一些东西,象: http://127.0.0.1 。 http 和主机名从请求对象里得到,组合进一个字符串,用来形成这个这个页面的完整的 URL 。 web server 的端口号,如果不是 80 ,也要带上。 ServletUtil 是一个在 com.ibm.waslab.common 包里向你提供的类。
2.Property 对象里的客户号条目不是原始表格的一部分,而是插入 register ()方法。这个唯一的号码是从数据库得到的:查询一个现有的最大的客户号,再加 1 。
3. 保存 doPost() 方法。如果你在编译期间得到错误,返回到源代码,改正它们,再编译。如果你不能解决错误,请向你的辅导员请求帮助。
4. 现在你已经准备好测试你的改进的 servelt 了。遵从前一个练习里的同样的测试步骤,通过正常的执行路径,输入所有的字段,按 register ,现在应该得到新的,改进的和定制的祝贺。
5. 再试一次,让一个或两个字段空白。按 register 按钮,你应该得到自己的错误 HTML 页面。
第四部分:输出和在 VisualAge 外面运行 servlet
1. 要从“生产”环境运行 Registration Servlet ,先停止 WebSphere Text Enviroment(SERunner) 。
2. 从 VisualAge 输出类和源代码到 WebSphere Application Server 。选择 WASDev 项目,鼠标右击,选择 Export 。选择 ”directory” ,击 ”Next” 。按“ Browse” 按钮,浏览到 c:\WebSphere\AppServer\servlets 目录。选择 .class 和源代码。按 Finish 。这把类文件布置到 AppServer 。
3. 启动 HTTP Server(Start->Programs->IBM HTTP Server->Start Server) 。
4. 从浏览器访问 Registration 页面,象以前一样重新运行 Registration 场景。
你在这个练习里做了些什么
在这个练习里,你学会怎样提取一个表格里的字段的值,和怎样把它们包含在属性里。你使用 Properties 对象里的信息来生成一个定制的动态的 HTML 页面。你也处理表格里提供的信息不全的情况,显示一个错误页。
答案
Properties formInput=null;
//Get the input form contens
try
{
formInput=getFormInput(req);
}
catch (InvalidParameterException e)
{
missingParameterResponse(out);
return;
}
(未完待续)