本文实例讲述了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程序设计有所帮助。

JSP实现添加功能和分页显示实例分析的更多相关文章

  1. ios – UIScrollView的平滑自定义分页

    我在UIScrollView中有两个(可能更多)视图,并希望使用分页.当我尝试使用UIScrollView的默认分页选项时出现问题,因为视图具有不同的宽度,无法正确分页.所以我已经实现了一个有效的自定义分页代码.但是,当滚动较慢时,它不会按预期运行.(它回到没有动画的原始位置.)以下是我目前通过uiscrollviewdelegate进行自定义分页的方法我想要的是:是)我有的:解决方法尝试下面的自

  2. ios – 使用子视图控制器分页滚动视图

    使用分页实现水平滚动视图的最佳做法是什么,每页有一个视图控制器?由于iOS5具有用于视图控制器容器/包含的API,因此PageControl示例仍然是实现此功能的最佳方式吗?

  3. 可可触摸 – 启用预览和分页的UICollectionView

    在AppStore中显示搜索结果时,我正在尝试模仿苹果公司的功能.(参考:http://searchengineland.com/apple-app-search-shows-only-one-result-at-a-time-133818)它显示像卡中的详细应用程序信息,并且它被分页.当中间的一个活动卡片和滚动视图的分页行为仍然完整时,我被困在如何使上一张和第二张卡片显示.我已经尝试使用UICo

  4. ios – 启用了内容插入的UIScrollView分页工作很奇怪

    我创建了具有内容插入的UIScrollView.第一次,scrollView.contentOffset.x为-160.0但是奇怪的问题是当我点击scrollView(黄色区域)时,内容偏移x值将重置为0并显示为这样.我尝试过几次,但是点击滚动视图会将内容偏移量重置为0.我该如何防止这种情况?解决方法UIScrollView分页通过滚动与scrollView宽度相同的页面(在您的情况下为480个宽

  5. UIKit框架-高级控件Swift版本: 10.UIWebView方法/属性详解

    前面我们已经讲解完了UINavigationController的一些常用属性以及方法,现在让我们来看看一个关于网络的UIWebView.1.UIWebView的常用属性常用类型2.UIWebView的代理方法3.代码示范首先我们要使用storyBoard布局界面关联控件遵守代理协议自定义UIWebVIew实现代理方法在ViewDidLoad方法中实现PS:UIWebView继承与UIView,并

  6. swift+storyboard+UIImageview入门

    更新记录:该Storyboard教程由CarolineBegbie更新iOS8和Swift相关内容。Storyboard是最先在iOS5引入的一项振奋人心的特性,大幅缩减构建App用户界面所需的时间。要介绍Storyboard是什么,我打算从这张图讲起。这就是使用Storyboard的力量。Storyboard通过新的原型表项和静态表项特性,让处理表视图的工作更加轻松。Storyboard使自动布局更易用。接下来我们看一下Storyboard,点击项目浏览器中的Main.storyboard就可以在Int

  7. 使用RxSwift进行分页API调用

    如何实现这一点的任何建议将非常感谢…

  8. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  9. jsp ${param.id}用法

    ${id} 意思是取出某一范围中名称为id的变量。

  10. Angular2 PrimeNG分页模块学习

    这篇文章主要为大家详细介绍了Angular2 PrimeNG分页模块学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部