JSP实现添加功能和分页显示实例分析


本文实例讲述了JSP实现添加功能和分页显示的方法。分享给大家供大家参考。具体如下:

学习目标:

① 进一步掌握MVC设计模式;
② 掌握添加功能的实现;
③ 掌握分页显示功能的实现。

主要内容:

① 通过用户信息添加功能进一步介绍MVC模式;
② 通过用户信息的分页显示介绍分页显示功能的原理和实现。

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、 添加分页显示

经过不断的添加,数据库表中已经有大量的记录。当记录比较多的时候就应该进行分页显示。分页显示可以采用多种方式:

① 在SQL中进行控制,只查询需要的记录;
② 在遍历结果集的时候,只封装相关的记录;
③ 在显示的时候进行控制。

第一种方式对开发人员的SQL水平要求比较高,第三种方式传递的数据量比较大,所以我们介绍第二种。

要完成分页显示,需要做3个方面的修改:

① 界面上增加分页显示的超链接;
② 修改User.java,在遍历结果集的时候进行控制,另外需要增加获取页码数的方法;
③ 在控制器中传递需要的页码和总页码。

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){}

希望本文所述对大家的JSP程序设计有所帮助。



相关阅读:
Java中HttpServletResponse响应中文出现乱码问题
详解Android中Intent对象与Intent Filter过滤匹配过程
CSS3提交意见输入框样式代码
Android开发之menu菜单
ul设置列表为一行2条的方法
mac怎么恢复出厂设置?苹果电脑系统恢复出厂设置教程图解
Android NDK 开发教程
使用Sticker.js实现贴纸效果
php实现过滤表单提交中html标签的方法
Android中Serializable和Parcelable序列化对象详解
WordPress 单页面上一页下一页的实现方法【附代码】
使用jQuery实现星级评分代码分享
Linux系统中的sudo命令使用讲解
如何备份Ubuntu系统以在电脑出问题时及时恢复
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 音乐教师实习周记 弯月当空 信赖,往往能创造出美好的境界 关于中国父亲节的来历 2016年超有哲理的一句话语录 蓝天白云成了稀罕 教育工作者学习总书记七一讲话心得 教育教学实习报告_实习报告 每一只鸟都是我的情敌 静思心语---藏起那份心痛 放弃的那一刻,你有没有后悔过 男人送给女人的十句真心话 接待用餐制度 夜的神灵捎去我的歌声 秦始皇,追求永生不敢死 对环渤海经济圈发展战略的思考 春节作文250字 就到这吧 猕猴桃作文2500字 陵县公安局刑警大队打流中队张元民二三事 小学三年级作文300字:冥冥之中 珍惜今天作文800字 关于新疆人住店被拒,我想谈谈人性! 邮储银行通讯稿 红尘末路多珍重 端午节划龙舟符号图案 老舍经典散文:又是一年芳草绿 七夕怎么过? 长命也许不够好,但是美好的生命却够长 2014最新中学生入团申请书范文精选 网络没有距离 某学院办公室工作总结 装修公司管理制度 出塞(夜梦一女子引扇求字,为书小阕) 不该丢失的友谊作文 办公室个人德能勤绩廉述职报告 冬天来了350字 运输车辆承包合同 产品质量问题检讨书 给远方朋友端午节短信 会计契约履行机制研究 看12求职方式哪种成功率高 哈比奇遇记 幼儿园总务岗位职责 《汤姆叔叔的小屋》读后感600字 数学城旅游记作文400字 和懒惰分手作文700字 最美好的一天:今天 沉沦世界 名人传好词好句

Copyright © 2016 phpStudy |