JSP實(shí)現(xiàn)添加功能和分頁(yè)顯示實(shí)例分析
本文實(shí)例講述了JSP實(shí)現(xiàn)添加功能和分頁(yè)顯示的方法。分享給大家供大家參考。具體如下:
學(xué)習(xí)目標(biāo):
① 進(jìn)一步掌握MVC設(shè)計(jì)模式;
② 掌握添加功能的實(shí)現(xiàn);
③ 掌握分頁(yè)顯示功能的實(shí)現(xiàn)。
主要內(nèi)容:
① 通過(guò)用戶信息添加功能進(jìn)一步介紹MVC模式;
② 通過(guò)用戶信息的分頁(yè)顯示介紹分頁(yè)顯示功能的原理和實(shí)現(xiàn)。
1、如何采用MVC模式完成用戶添加?
首先考慮與人如何交互:應(yīng)該有一個(gè)輸入用戶信息的界面,包含用戶名和口令,另外需要一反饋的界面。
然后考慮功能如何實(shí)現(xiàn):需要在User類中添加一個(gè)方法,完成用戶信息的添加。
最后考慮控制器:獲取信息;調(diào)用JavaBean;傳值;選擇界面響應(yīng)。
2、添加用戶的界面
實(shí)際應(yīng)用中的信息項(xiàng)比較多,并且需要對(duì)用戶輸入信息進(jìn)行驗(yàn)證。這里重點(diǎn)強(qiáng)調(diào)添加過(guò)程,所以對(duì)問(wèn)題進(jìn)行簡(jiǎn)化??梢栽诘卿浗缑娴幕A(chǔ)上修改,參考代碼如下:
<%@ 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{ // 指出連接數(shù)據(jù)庫(kù)所需要的驅(qū)動(dòng)程序 Class.forName("oracle.jdbc.driver.OracleDriver"); // 建立與數(shù)據(jù)庫(kù)之間的連接 // 需要把myserver修改為自己的數(shù)據(jù)庫(kù)服務(wù)器的IP地址 // 把mydb修改成自己的數(shù)據(jù)庫(kù)) con = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger"); // 編寫(xiě)查詢數(shù)據(jù)庫(kù)信息的SQL語(yǔ)句 String sql="insert into usertable(username,userpass) values('"+username+"','"+userpass+"')"; // 創(chuàng)建語(yǔ)句對(duì)象,用于執(zhí)行SQL語(yǔ)句 stmt = con.createStatement(); // 執(zhí)行沒(méi)有結(jié)果集返回的語(yǔ)句,返回的是影響數(shù)據(jù)庫(kù)表中記錄的個(gè)數(shù) int n = stmt.executeUpdate(sql); if(n>0) b = true; else b = false; }catch(Exception e){ b = false; } finally{ // 關(guān)閉相關(guān)對(duì)象 if(stmt!=null) try{ stmt.close(); }catch(Exception ee){} if(con!=null) try{ con.close(); }catch(Exception ee){} } return b; }
4、使用Servlet進(jìn)行控制
參考代碼如下:
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"); // 第二步:調(diào)用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); // 第四步:選擇一個(gè)界面對(duì)用戶進(jìn)行響應(yīng) 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); } }
此處添加完成之后跳轉(zhuǎn)到userlist.jsp文件處理,但是在顯示之前需要獲取數(shù)據(jù),所以需要先執(zhí)行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代碼如下,紅色部分為增加的內(nèi)容:
<%@ 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、運(yùn)行測(cè)試
輸入正確的用戶名和口令測(cè)試;
輸出已經(jīng)存在的用戶名進(jìn)行測(cè)試。
8、 添加分頁(yè)顯示
經(jīng)過(guò)不斷的添加,數(shù)據(jù)庫(kù)表中已經(jīng)有大量的記錄。當(dāng)記錄比較多的時(shí)候就應(yīng)該進(jìn)行分頁(yè)顯示。分頁(yè)顯示可以采用多種方式:
① 在SQL中進(jìn)行控制,只查詢需要的記錄;
② 在遍歷結(jié)果集的時(shí)候,只封裝相關(guān)的記錄;
③ 在顯示的時(shí)候進(jìn)行控制。
第一種方式對(duì)開(kāi)發(fā)人員的SQL水平要求比較高,第三種方式傳遞的數(shù)據(jù)量比較大,所以我們介紹第二種。
要完成分頁(yè)顯示,需要做3個(gè)方面的修改:
① 界面上增加分頁(yè)顯示的超鏈接;
② 修改User.java,在遍歷結(jié)果集的時(shí)候進(jìn)行控制,另外需要增加獲取頁(yè)碼數(shù)的方法;
③ 在控制器中傳遞需要的頁(yè)碼和總頁(yè)碼。
9、 在界面上增加分頁(yè)顯示功能
<%@ 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">第一頁(yè)</a> <a href="getAllUser?pageNo=${pageNo-1}">上一頁(yè)</a> <a href="getAllUser?pageNo=${pageNo+1}">下一頁(yè)</a> <a href="getAllUser?pageNo=${pageCount}">最后一頁(yè)</a> <br> <c:forEach var="user" items="${users}"> 用戶名:${user.username} 口令:${user.userpass} <br> </c:forEach>
其中,pageNo表示當(dāng)前頁(yè)碼,pageCount表示總頁(yè)數(shù)。
10、在User.java中增加獲取總頁(yè)碼的方法
public int getPageCount() { Connection con = null; Statement stmt = null; ResultSet rs = null; try{ // 指出連接數(shù)據(jù)庫(kù)所需要的驅(qū)動(dòng)程序 Class.forName("oracle.jdbc.driver.OracleDriver"); // 建立與數(shù)據(jù)庫(kù)之間的連接 con = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger"); // 編寫(xiě)查詢數(shù)據(jù)庫(kù)信息的SQL語(yǔ)句 String sql="select count(*) from usertable"; // 創(chuàng)建語(yǔ)句對(duì)象,用于執(zhí)行SQL語(yǔ)句 stmt = con.createStatement(); // 執(zhí)行SQL語(yǔ)句得到結(jié)果集 rs = stmt.executeQuery(sql); rs.next(); // 得到總的記錄數(shù) int number = rs.getInt(1); return (number-1)/10+1; }catch(Exception e){ return 0; } finally{ // 關(guān)閉相關(guān)對(duì)象 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、增加按照頁(yè)碼獲取信息的方法
public ArrayList getUserByPage(int pageNo) { int number=10; // 每一頁(yè)顯示的記錄數(shù) 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{ // 指出連接數(shù)據(jù)庫(kù)所需要的驅(qū)動(dòng)程序 Class.forName("oracle.jdbc.driver.OracleDriver"); // 建立與數(shù)據(jù)庫(kù)之間的連接 con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.170:1521:fhdn","scott","tiger"); // 編寫(xiě)查詢數(shù)據(jù)庫(kù)信息的SQL語(yǔ)句 String sql="select * from usertable"; // 創(chuàng)建語(yǔ)句對(duì)象,用于執(zhí)行SQL語(yǔ)句 stmt = con.createStatement(); // 執(zhí)行SQL語(yǔ)句得到結(jié)果集 rs = stmt.executeQuery(sql); // 遍歷結(jié)果集 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{ // 關(guān)閉相關(guān)對(duì)象 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); } // 第二步:調(diào)用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)); // 第四步:選擇一個(gè)界面對(duì)用戶進(jìn)行響應(yīng) 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、之后再進(jìn)行測(cè)試運(yùn)行
14、增加對(duì)第一頁(yè)和最后一頁(yè)的控制
如果已經(jīng)在第一頁(yè),就不能再點(diǎn)擊第一頁(yè)或者首頁(yè)。如果已經(jīng)在最后一頁(yè),就不能再點(diǎn)擊最后一頁(yè)或者下一頁(yè)。修改userlist.jsp中代碼如下(部分代碼):
<c:if test="${pageNo!=1}"> <a href="getAllUser?pageNo=1">第一頁(yè)</a> <a href="getAllUser?pageNo=${pageNo-1}">上一頁(yè)</a> </c:if> <c:if test="${pageNo!=pageCounter}"> <a href="getAllUser?pageNo=${pageNo+1}">下一頁(yè)</a> <a href="getAllUser?pageNo=${pageCounter}">最后一頁(yè)</a> </c:if>
這里設(shè)置為不顯示,也可以設(shè)置為不添加超鏈接。
15、增加對(duì)異常的處理
如果用戶按照這樣的方式訪問(wèn):http://127.0.0.1:8080/ch8/getAllUser?pageNo=aaa,將產(chǎn)生異常。因?yàn)轫?yè)碼不是數(shù)字,所以需要進(jìn)行異常處理。修改:
為:
希望本文所述對(duì)大家的JSP程序設(shè)計(jì)有所幫助。
- JSP實(shí)現(xiàn)的簡(jiǎn)單分頁(yè)示例
- JSP+EXt2.0實(shí)現(xiàn)分頁(yè)的方法
- jsp分頁(yè)顯示完整實(shí)例
- JSP自定義分頁(yè)標(biāo)簽TAG全過(guò)程
- jsp分頁(yè)顯示的實(shí)現(xiàn)代碼
- json實(shí)現(xiàn)jsp分頁(yè)實(shí)例介紹(附效果圖)
- JSP分頁(yè)顯示的實(shí)例代碼
- jsp讀取數(shù)據(jù)庫(kù)實(shí)現(xiàn)分頁(yè)技術(shù)簡(jiǎn)析
- 一個(gè)通用的jsp分頁(yè)P(yáng)ageBean
- jsp hibernate的分頁(yè)代碼
- 一個(gè)實(shí)用的JSP分頁(yè)代碼
- JSP實(shí)現(xiàn)的簡(jiǎn)單分頁(yè)顯示效果代碼
相關(guān)文章
js實(shí)現(xiàn)隨機(jī)的四則運(yùn)算題目效果
本文主要介紹了js實(shí)現(xiàn)隨機(jī)的四則運(yùn)算題目效果,可以隨機(jī)的進(jìn)行加減乘除的運(yùn)算,有興趣的同學(xué)可以了解一下。2016-10-10詳解直接訪問(wèn)WEB-INF目錄下的JSP頁(yè)面的方法
這篇文章主要介紹了詳解直接訪問(wèn)WEB-INF目錄下的JSP頁(yè)面的方法的相關(guān)資料,需要的朋友可以參考下2017-06-06二、設(shè)置開(kāi)發(fā)、運(yùn)行環(huán)境
二、設(shè)置開(kāi)發(fā)、運(yùn)行環(huán)境...2006-10-10jsp簡(jiǎn)單連接SQL Server2000數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了jsp簡(jiǎn)單連接SQL Server2000數(shù)據(jù)庫(kù)的方法,較為詳細(xì)的分析了JSP連接SQL Server2000數(shù)據(jù)庫(kù)的相關(guān)設(shè)置技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10淺談jsp EL表達(dá)式取值過(guò)程、page和pagecontext的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談jsp EL表達(dá)式取值過(guò)程、page和pagecontext的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03