JBuilder2005实战JSP之切换控制

ZDNet软件频道 时间:2008-06-29 作者: | 中国IT实验室 我要评论()
本文关键词:实战 JBuilder JSP
由于在login.jsp的表单中通过action属性指定switch.jsp为响应的JSP文件,当用户在login.jsp中选定登录用户,输入密码提交表单后,客户端将向服务器发送一个HTTP请求,服务器即调用switch.jsp来响应这个请求。

 由于在login.JSP的表单中通过action属性指定switch.JSP为响应的JSP文件,当用户在login.JSP中选定登录用户,输入密码提交表单后,客户端将向服务器发送一个HTTP请求,服务器即调用switch.JSP来响应这个请求。
  
  表单中用户名和密码两组件的数据将通过HTTP请求传给服务器的switch.JSP,服务器将这些信息封装在request对象中传给switch.JSP,所以switch.JSP可通过request.getParameter(String paraName)来获取这两个值。
  
  String userId = request.getParameter("userId");
  String password = request.getParameter("password");
  
  试想如果login.JSP的表单有10个以上的数据组件,则在switch.JSP中必须通过相应数目的request.getParameter()方法获取其值。此外,如果这些数据不是字段串类型,而是整数或浮点数,由于request.getParameter()方法返回的值都是String,还必须进行类型的转换,这种工作不但单调乏味,还容易出错。
  
  JSP允许你通过Bean以映射的方式接收网页表单的数据,Bean以这个规则映射表单的数据:Bean属性名=表单数据组件名,也即所有和Bean属性名相同的表单数据域被自动填充到Bean中,并且完成数据类型的转换。如login.JSP的表单中有两个数据组件,一个名为userId,另一个是password,定义一个拥有相同名的userId和password属性的User.java Bean,这个Bean将可以自动接收表单中的两个数据组件值。
  
  编写User.java
  
  我们先来编写这个User.java的Bean,在工程中创建User.java,其代码如下所示:
  
  代码清单 7 User.java
  
  1. package bookstore;
  2.
  3. public class User
  4. {
  5. private String userId;//用户Id
  6. private String password;//密码
  7. private String userName;//用户名
  8. public String getPassword() {
  9. return password;
  10. }
  11. public String getUserId() {
  12. return userId;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. public void setPassword(String password) {
  18. this.password = password;
  19. }
  20. public void setUserId(String userId) {
  21. this.userId = userId;
  22. }
  23. public void setUserName(String userName) {
  24. this.userName = userName;
  25. }
  26. }
  
  除userId和password两属性名,还有一个用户名属性userName,这个属性的值不是从login.JSP的表单接收的,当用户名密码验证正确后,从数据表T_USER表中获取用户名保存在这个属性中,以便其他地方引用,保存并编译这个类。
  
  提示:
  
  你可以通过JBuilder的Bean Express工具快速创建User.java的代码,在一般情况下,你应该通过Bean Express来创建Bean的属性,这样不但自动产生get/set的属性访问方法,还保证了Bean命名规范。
  
  编写页面程序
  
  在创建User.java 的Bean后,我们着手创建switch.JSP,在switch.JSP中引用这个Bean。
  
  通过File->New..->Web->双击JSP图标启动创建JSP向导。
  
  1.指定swith.JSP名字
  
 

  
图 10 指定switch.JSP的名字

  
  一直按Next到向导的第3步。
  
  2.引用User.java Bean
  
 

  
图 11 指定JSP中引用Bean

  
  点击Add Bean...按钮,弹出Select a Class对话框,在对话框中选择bookstore.User类,如下图所示:
  
 

  
图 12 选择类作为Bean

  
  按OK后,返回到向导第3步的对话框,此时对话框的Bean列表中多了一行记录,可以在ID栏中为Bean指定一个名字,在Scope中指定Bean的作用域,如下图所示:
  
 

  
图 13 引用一个Bean

  
  我们为User的Bean取名为userBean,将其作用域设置为page域。page域即为页面作用域,在当前页面范围作用域内可用,当JSP返回响应,或请求转到其他的JSP页面中时,都不可用了,其他3个作用域说明如下:
  
  ·request作用域:当一个请求产生直到返回响应的范围内都是有效的,如a.JSP中声明为request作用域的Bean,当a.JSP通过<JSP:forward>转移请求到b .JSP页面中时还是可用的。
  
  ·session作用域:在用户会话的周期内都是可用的,会话周期为用户登录系统直到其退出系统为此。
  
  ·application作用域:这个作用域最长,表示Web容器启动直到关闭都是有效的。
  
  按Next到下一步。
  
  3.设置运行配置项
  
  在向导的最后一步,你可以为创建的JSP产生一个运行配置项,虽然向导将创建一个运行配置项设置为默认选项,但笔者认为这并不是一个合理的默认值,建议取消create a runtime configuration设置项,不要创建JSP的运行配置项,如下图所示:
  
 

  按Finish按钮创建switch.JSP文件,其代码如下所示:
  
  代码清单 8 向导创建的switch.JSP
  
  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <html>
  3. <head>
  4.  <title>
  5.   switch
  6.  </title>
  7. </head>
  8. <JSP:useBean id="userBean" scope="page" class="bookstore.User" />
  9. <JSP:setProperty name="userBean" property="*" />
  10. <body bgcolor="#ffffff">
  11. <h1>
  12.  JBuilder Generated JSP
  13. </h1>
  14. </body>
  15. </html>
  
  第8行是引用Bean的JSP标签,第9行用表单的数据填充Bean的属性值,即以名字匹配的方式将request的参数填充到Bean的属性中,同时完成类型转换(只有基本数据类型或构造函数支持的才可以完成转换)。在执行完第9行后,userBean中的userId和password属性将被设置为login.JSP页面中所发送过来的用户名和密码的值。
  
  因为switch.JSP只是用于控制,并不需要显示内容到客户端,所以我们去除switch.JSP中的HTML代码,将switch.JSP调整为:
  
  代码清单 9 去除静态HTML代码后的switch.JSP
  
  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <JSP:useBean id="userBean" scope="page" class="bookstore.User" />
  3. <JSP:setProperty name="userBean" property="*" />
  
  在switch.JSP中提供一段Scriptlet,将userId和password发送到数据库和T_USER表中的用户比较看是否是合法的用户,根据验证的结果转向不同的页面。switch.JSP的最终代码如下所示:
  
  代码清单 10 最终的switch.JSP
  
  1. < contentType="text/html; charset=GBK"%>
  2. < import="bookstore.*"%>
  3. < import="java.sql.*"%>
  4. <JSP:useBean id="userBean" scope="session" class="bookstore.User"/>
  5. <JSP:setProperty name="userBean" property="*"/>
  6. <%
  7. Connection conn = null;
  8. try {
  9.  conn = DBConnection.getConnection();
  10. PreparedStatement pStat = conn.prepareStatement(
  11.  "select USER_NAME from T_USER where USER_ID=? and password = ?");
  12. pStat.setString(1, userBean.getUserId());
  13. pStat.setString(2, userBean.getPassword());
  14. ResultSet rs = pStat.executeQuery();
  15. if (rs.next()) { //密码正确
  16.  userBean.setUserName(rs.getString(1));//设置用户名
  17.  session.setAttribute("ses_userBean", userBean);//将userBean放入Session对象中
  18. %><JSP:forward page=" welcome.JSP "></JSP:forward>
  19. <%} else { //密码错误%>
  20. <JSP:forward page="fail.JSP"></JSP:forward>
  21. <%
  22.  }} finally {
  23.   if(conn != null) conn.close();
  24.  }
  25. %>
  
  ·在第2~3行中引入Scriptlet代码中需要的类。
  
  ·第7~14行代码向数据库发送查询SQL语句并返回结果。
  
  ·第15行通过检查结果集的记录数间接判断用户密码是否正确。
  
  ·第16~18行是用户密码正确的响应代码,首先用结果集的USER_NAME属性填充userBean的userName属性值,然后将userBean对象放入Session中,最后转向welcome.JSP页面。
  
  ·当用户输入密码不正确时,结果集中将没有记录,此时rs.next()返回false,程序转向第20行,第20行的代码将页面转向到密码输入错误的处理页面fail.JSP
  
  ·第22~24行的代码用于关闭数据库的连接。
  
  也许大家已经发现虽然第9~21行会抛出SQLException异常,但我们并没有相应的异常捕获块,在标准的Java程序中将导致一个编译期的错误,但在JSP中却可以顺序通过编译,这是因为JSP


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134