本文執行個體講述了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程式設計有所協助。