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 交通频道 作文范文 有些东西总喜爱在夜里豪放 我的黑发,你的手作文 让美停留作文800字 精彩短语大全:青春好比吸烟,烟在飞扬,烟灰在坠落。 春暖了,花开作文150字 强者还是弱者作文700字 生命的意义在于有限时间无限可能 描写苹果树的作文 双星历险记 黑妞 “十百千”工程人才培养计划总结_教务科工作 我学会了捏乌龟 作文250字 学校书记述职述廉报告 推与争见高低 相遇红尘,邂逅爱 作文 三国水浒城一日游 幸福征文 第一次大扫除250字作文 只因有你 关于学会感恩的作文 简历要个性不要千人一面 如梦令·凉拌包菜 整个天空都写满我们分开的遗憾。 三句半主持串词 《寒号鸟》读后感400字 让人心痛的伤感句子:你走了,带着我全部的爱走了 当我走近你的时候 我学会了作文:洗衣服 “帅帅”的自传11500字 多媒体培训总结 落叶的美丽作文400字 最新关于科研实习报告范文汇编 《只要翻过那座山》教案3 在自己家里的历险 湖上抓月亮 元旦聚会作文700字 看透人生~```` 风,我想看见你...... 泪滴落在你的耳边 想不透,离别泪 海洋世界作文1400字 换个角度会很美作文600字 工作收入证明模板 把伤害留给自己 蒲公英的旅程作文100字 毕业自我鉴定800字 不可失去的童心——观电影《淘气包马小跳》有感 班级激励性标语 地球,万物的家.作文200字 小学五年级数学教学工作计划 马云经典励志语录

Copyright © 2016 phpStudy |