2010-03-01

学习目标:
l         进一步掌握MVC设计模式;
l         掌握添加功能的实现;
l         掌握分页显示功能的实现。
主要内容:
l         通过用户信息添加功能进一步介绍MVC模式;
l         通过用户信息的分页显示介绍分页显示功能的原理和实现。
1、 如何采用MVC模式完成用户添加?
首先考虑与人如何交互:应该有一个输入用户信息的界面,包含用户名和口令,另外需要一反馈的界面。
然后考虑功能如何实现:需要在User类中添加一个方法,完成用户信息的添加。
最后考虑控制器:获取信息;调用JavaBean;传值;选择界面响应。
2、 添加用户的界面
实际应用中的信息项比较多,并且需要对用户输入信息进行验证。这里重点强调添加过程,所以对问题进行简化。可以在登录界面的基础上修改,参考代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
添加用户<br>
<form name="form1" method="post" action="addUser">
   用户ID:<input type="text" name="username"><br>
   口令:<input type="password" name="userpass"><br>
       <input type="submit" value="添加"><input type="reset" value="重置">
</form>
<%@ include file="contact.jsp"%>
3、 在User中增加方法
   public boolean addUser()
   {
      Connection con = null;
      Statement stmt = null;
      boolean b; // 表示添加成功与否
 
      try{
         // 指出连接数据库所需要的驱动程序
         Class.forName("oracle.jdbc.driver.OracleDriver");
 
        // 建立与数据库之间的连接
// 需要把myserver修改为自己的数据库服务器的IP地址
// 把mydb修改成自己的数据库)
        con = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger");
 
        // 编写查询数据库信息的SQL语句
        String sql="insert into usertable(username,userpass) values('"+username+"','"+userpass+"')";
 
        // 创建语句对象,用于执行SQL语句
        stmt = con.createStatement();
 
        // 执行没有结果集返回的语句,返回的是影响数据库表中记录的个数
        int n = stmt.executeUpdate(sql);     
 
        if(n>0)
            b = true;
        else
            b = false;
      }catch(Exception e){
          b = false;
      }
      finally{
        // 关闭相关对象
        if(stmt!=null) try{ stmt.close(); }catch(Exception ee){}
        if(con!=null) try{ con.close(); }catch(Exception ee){}
      }     
      return b;
   }
4、 使用Servlet进行控制
参考代码如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javabean.*;
import java.util.*;
 
public class AddUser extends HttpServlet
{
   public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws IOException,ServletException
   {
      request.setCharacterEncoding("gb2312");
      // 第一步:获取用户的输入信息
      String username = request.getParameter("username");
      String userpass = request.getParameter("userpass");
 
      // 第二步:调用JavaBean
      User user = new User();
      user.setUsername(username);
      user.setUserpass(userpass);
      boolean b = user.addUser();
 
      // 第三步:传值
      String info;
      if(b)
          info="添加成功!";
      else
          info="添加失败!";
      request.setAttribute("addinfo",info);
 
      // 第四步:选择一个界面对用户进行响应
      String forward="getAllUser";
 
      RequestDispatcher rd = request.getRequestDispatcher(forward);
      rd.forward(request,response);
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response)
     throws IOException,ServletException
   {
      doGet(request,response);
   }
}
    此处添加完成之后跳转到userlist.jsp文件处理,但是在显示之前需要获取数据,所以需要先执行Servlet,所以专向了getAllUser控制器。
5、 修改配置文件
   <servlet>
      <servlet-name>addUser</servlet-name>
      <servlet-class>servlet.AddUser</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>addUser</servlet-name>
      <url-pattern>/addUser</url-pattern>
   </servlet-mapping>
6、 在列表界面显示提示信息
修改userlist.jsp代码如下,红色部分为增加的内容:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<font color="red">
   ${addinfo}
</font>
<br>
<c:forEach var="user" items="${users}">
   用户名:${user.username} 口令:${user.userpass} <br>
</c:forEach>
7、 运行测试
输入正确的用户名和口令测试;
输出已经存在的用户名进行测试。
8、 添加分页显示
经过不断的添加,数据库表中已经有大量的记录。当记录比较多的时候就应该进行分页显示。分页显示可以采用多种方式:
l         在SQL中进行控制,只查询需要的记录;
l         在遍历结果集的时候,只封装相关的记录;
l         在显示的时候进行控制。
第一种方式对开发人员的SQL水平要求比较高,第三种方式传递的数据量比较大,所以我们介绍第二种。
要完成分页显示,需要做3个方面的修改:
l         界面上增加分页显示的超链接;
l         修改User.java,在遍历结果集的时候进行控制,另外需要增加获取页码数的方法;
l         在控制器中传递需要的页码和总页码。
9、 在界面上增加分页显示功能
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<font color="red">
   ${addinfo}
</font>
<br>
 <a href="getAllUser?pageNo=1">第一页</a>
 <a href="getAllUser?pageNo=${pageNo-1}">上一页</a>
 <a href="getAllUser?pageNo=${pageNo+1}">下一页</a>
 <a href="getAllUser?pageNo=${pageCount}">最后一页</a>
<br>
<c:forEach var="user" items="${users}">
   用户名:${user.username} 口令:${user.userpass} <br>
</c:forEach>
其中,pageNo表示当前页码,pageCount表示总页数。
10、              在User.java中增加获取总页码的方法
   public int getPageCount()
   {
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
 
      try{
         // 指出连接数据库所需要的驱动程序
         Class.forName("oracle.jdbc.driver.OracleDriver");
 
        // 建立与数据库之间的连接
        con = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger");
 
        // 编写查询数据库信息的SQL语句
        String sql="select count(*) from usertable";
 
        // 创建语句对象,用于执行SQL语句
        stmt = con.createStatement();
 
        // 执行SQL语句得到结果集
        rs = stmt.executeQuery(sql);     
 
        rs.next();
        // 得到总的记录数
        int number = rs.getInt(1);
 
        return (number-1)/10+1;
      }catch(Exception e){
          return 0;
      }
      finally{
        // 关闭相关对象
        if(rs!=null) try{ rs.close(); }catch(Exception ee){}
        if(stmt!=null) try{ stmt.close(); }catch(Exception ee){}
        if(con!=null) try{ con.close(); }catch(Exception ee){}
      }     
   }
11、              增加按照页码获取信息的方法
   public ArrayList getUserByPage(int pageNo)
   {
      int number=10;
      // 每一页显示的记录数
 
      int begin = (pageNo * number) - 9;
      int end = pageNo * number;
      int index=1;
 
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      ArrayList users = new ArrayList();
 
      try{
         // 指出连接数据库所需要的驱动程序
         Class.forName("oracle.jdbc.driver.OracleDriver");
 
        // 建立与数据库之间的连接
        con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.170:1521:fhdn","scott","tiger");
 
        // 编写查询数据库信息的SQL语句
        String sql="select * from usertable";
 
        // 创建语句对象,用于执行SQL语句
        stmt = con.createStatement();
 
        // 执行SQL语句得到结果集
        rs = stmt.executeQuery(sql);     
 
        // 遍历结果集
        while(rs.next())
        {
           // 在begin之前的记录是不显示的
           if(index<begin){
               index++;
               continue;
           }
 
           // 在end之后的记录也不显示
           if(index>end)
               break;
 
           index++;
 
           String username = rs.getString(1);
           String userpass = rs.getString(2);
           // java.util.Date birthday = rs.getDate(3);
           // int age = rs.getInt(4);
           User user = new User();
           user.setUsername(username);
           user.setUserpass(userpass);
           users.add(user);
        }
      }catch(Exception e){
          System.out.println(e.getMessage());
      }
      finally{
        // 关闭相关对象
        if(rs!=null) try{ rs.close(); }catch(Exception ee){}
        if(stmt!=null) try{ stmt.close(); }catch(Exception ee){}
        if(con!=null) try{ con.close(); }catch(Exception ee){}
      }     
      return users;
   }
12、              修改控制器
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javabean.*;
import java.util.*;
 
public class GetAllUser extends HttpServlet
{
   public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws IOException,ServletException
   {
       
      // 第一步:获取用户的输入信息
      String pageNo=request.getParameter("pageNo");
      int iPageNo=1;
      if(pageNo!=null)
      {
          iPageNo = Integer.parseInt(pageNo);
      }
 
      // 第二步:调用JavaBean
      User user = new User();
      ArrayList users=null;
      users = user.getUserByPage(iPageNo);
      int pageCount=user.getPageCount();
 
      // 第三步:传值
      request.setAttribute("users",users);
      request.setAttribute("pageNo",new Integer(iPageNo));
      request.setAttribute("pageCounter",new Integer(pageCount));
 
      // 第四步:选择一个界面对用户进行响应
      String forward="userlist.jsp";
 
      RequestDispatcher rd = request.getRequestDispatcher(forward);
      rd.forward(request,response);
 
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response)
     throws IOException,ServletException
   {
      doGet(request,response);
   }
}
13、              之后再进行测试运行
14、              增加对第一页和最后一页的控制
如果已经在第一页,就不能再点击第一页或者首页。如果已经在最后一页,就不能再点击最后一页或者下一页。修改userlist.jsp中代码如下(部分代码):
<c:if test="${pageNo!=1}">
 <a href="getAllUser?pageNo=1">第一页</a>
 <a href="getAllUser?pageNo=${pageNo-1}">上一页</a>
</c:if>
<c:if test="${pageNo!=pageCounter}">
 <a href="getAllUser?pageNo=${pageNo+1}">下一页</a>
 <a href="getAllUser?pageNo=${pageCounter}">最后一页</a>
</c:if>
这里设置为不显示,也可以设置为不添加超链接。
15、              增加对异常的处理
如果用户按照这样的方式访问:http://127.0.0.1:8080/ch8/getAllUser?pageNo=aaa,将产生异常。因为页码不是数字,所以需要进行异常处理。修改
          iPageNo = Integer.parseInt(pageNo);

    try{     iPageNo = Integer.parseInt(pageNo); }catch(Exception e){}
参考教材:《Java Web程序设计基础教程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值