JSP实现添加功能和分页显示实例分析
学习目标:
① 进一步掌握MVC设计模式;
② 掌握添加功能的实现;
③ 掌握分页显示功能的实
本文实例讲述了JSP实现添加功能和分页显示的方法。分享给大家供大家参考。具体如下:
学习目标:
① 进一步掌握MVC设计模式;
② 掌握添加功能的实现;
③ 掌握分页显示功能的实现。
主要内容:
① 通过用户信息添加功能进一步介绍MVC模式;
② 通过用户信息的分页显示介绍分页显示功能的原理和实现。
1、如何采用MVC模式完成用户添加?
首先考虑与人如何交互:应该有一个输入用户信息的界面,包含用户名和口令,另外需要一反馈的界面。
然后考虑功能如何实现:需要在User类中添加一个方法,完成用户信息的添加。
最后考虑控制器:获取信息;调用JavaBean;传值;选择界面响应。
2、添加用户的界面
实际应用中的信息项比较多,并且需要对用户输入信息进行验证。这里重点强调添加过程,所以对问题进行简化。可以在登录界面的基础上修改,参考代码如下:
1 2 3 4 5 6 7 8 | <%@ 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中增加方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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进行控制
参考代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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、修改配置文件
1 2 3 4 5 6 7 8 | <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代码如下,红色部分为增加的内容:
1 2 3 4 5 6 7 8 9 | <%@ 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、 在界面上增加分页显示功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <%@ 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中增加获取总页码的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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、增加按照页码获取信息的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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、修改控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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中代码如下(部分代码):
1 2 3 4 5 6 7 8 | <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,将产生异常。因为页码不是数字,所以需要进行异常处理。修改:
为:
希望本文所述对大家的JSP程序设计有所帮助。