並透過參數的方式達到分頁以及由資料表中選取所需的資料
不過往往會在 JSP 裡產生過多的 Java 程式碼,所以可以透過 JavaBean 的特性
並透過 EL 和 JSTL 的運用來減少 JSP 裡的過多的 Java 程式,簡單說就是以 JavaBean 當作一個工具
首先以下範例為一個購物網站,假設在資料庫中有 20 筆資料,而網站內容是每頁展示9筆
程式的主要架構是將先是商品的網頁嵌入在一個 iframe,且此網頁必由 servlet 轉送而來
為什麼一定要從 servlet 轉送過來,因為我需要在 Servlet 內執行一些 SQL 語句和 javabean 的處理
以下來看看這個 Servlet 程式 listgoods.java
package org.controller;
import org.tool.Pagebean;
import org.model.Good;
import org.dao.GoodDAO;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class listgoods extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
int nowPageNumber = 1; //目前頁數
if(request.getParameter("nowP") != null){ //檢查看看是否有 nowP 參數
nowPageNumber = Integer.parseInt(request.getParameter("nowP"));
}else{
nowPageNumber = 1; //代表目前請求的是第一頁
}
Pagebean pagebean = new Pagebean(); //Pagebean 為產生分頁程式碼的 JavaBean
pagebean.setPageLink(nowPageNumber); //產生分頁功能的程式碼
//查詢當前頁面所需的資料,透過 GoodDAO 實現
ArrayList goods = new GoodDAO().getAllGoods(nowPageNumber);
request.setAttribute("goods", goods); //設定屬性,方便在JSP 顯示商品
request.setAttribute("pagebean", pagebean); //設定屬性,方便在JSP 顯示分頁功能
//重新導向到 listgoods.jsp 以顯示商品內容
request.getRequestDispatcher("listgoods.jsp").forward(request, response);
}
}
接下來看看 Pagebean.java
package org.tool;
import org.dao.GoodDAO;
public class Pagebean
{
private String pageLink = "";
public void setPageLink(int page) //注意連結(a link)是如何寫的
{
int allGoods = new GoodDAO().getGoodsCount(); //透過 GoodDAO 取得資料庫中有幾筆資料
int allP = 0; //allP 代表呈獻所有資料所需的頁數
allP = allGoods / 9; //每頁呈現9項商品
if(allGoods % 9 != 0){ //如果除以9有逾數 代表還要在+1頁
allP++;
}
pageLink += "<table border='0' cellpadding='2' cellspacing='0'>"; //table
if(page != 1){ //如果當前頁不等於第一頁,即可顯示"上一頁"
pageLink += "<tr><td><a href='listgoods?nowP=" + String.valueOf(page-1) + "'>上一頁</a></td>";
}
pageLink += "";
for(int i=1;i<=allP;i++){ //最多顯示10頁, 如果總頁數超過10頁則跳出
if(i > 10) break;
pageLink += "<a href='listgoods?nowP=" + String.valueOf(i) + "'>" + String.valueOf(i) + "</a>";
}
if(allP > 10){ //總頁數超過10頁時,以 "...." 再加上最後一頁的編碼
pageLink += "....";
pageLink += "<a href='listgoods?nowP=" + String.valueOf(allP) + "'>" + String.valueOf(allP) + "</a>";
}
pageLink += "</td>";
if(page != allP){ //當前頁不為最後一頁時, 即可顯示"下一頁"
pageLink += "<td><a href='listgoods?nowP=" + String.valueOf(page+1) + "'>下一頁</a></td>";
}
pageLink += "</tr>";
pageLink += "</table>";
}
public String getPageLink(){
return pageLink;
}
}
接著在看看 GoodDAO.java 的 getAllGoods() 方法和 getGoodsCount()方法
//....
public ArrayList getAllGoods(int page) //取得所有商品
{
//每頁顯示 9 筆資料
//所以是 0-8 9-17 18-.... 資料庫是從0開始算
int n = (page-1)*9;
//因為我使用的資料庫是 MYSQL 所以可以透過 limit語法 限定由哪個位置開始抓取多少筆資料
//以下的 db 是我專案內專門處理資料庫的一個工具類,所以此處依你的需求更換
db.exceuteQueUpd("SELECT * FROM goods ORDER BY uptime DESC limit " + n + ",9", new Object[]{});
ArrayList list = new ArrayList();
try{
Good good;
ResultSet result = db.getResult();
while(result.next())
{
good = new Good(); //Good 物件的程式碼省略
good.setId(result.getInt("id"));
good.setViewpic(result.getString("viewpic"));
good.setName(result.getString("name"));
good.setPrice(result.getInt("price"));
good.setStorenum(result.getInt("storenum"));
good.setUptime(result.getDate("uptime"));
good.setMaaker(result.getString("maker"));
good.setInfo(result.getString("info"));
list.add(good);
}
}catch(java.sql.SQLException e){
System.out.println(e.getMessage());
list = null;
}
return list;
}
public int getGoodsCount() //取得資料庫中的總筆數
{
db.exceuteQueUpd("SELECT * FROM goods", new Object[]{});
try{
ResultSet result = db.getResult();
result.last();
return result.getRow();
}catch(java.sql.SQLException e){
System.out.println(e.getMessage());
return 0;
}
}
最後由於我是使用一JSP (main.jsp) 裡面包含的 iframe , iframe 裡面則未顯示商品的網頁內容
以下為 main.jsp 的其中一段
<iframe id="listgoods" src="listgoods" width="100%" frameborder="0" scrolling="no"></iframe>
listgoods 指向的就是後台的 listgoods.java 的 servlet 程式
最後看看沒有半點 Java 程式的 listgood.jsp
<table width="99%" border="0" cellspacing="5" cellpadding="5">
<c:choose>
<c:when test="${requestScope.goods ne null}">
<c:set var="allgoods" value="${requestScope.goods}" />
<c:forEach var="aGood" items="${allgoods}" varStatus="Loopcount">
<c:if test="${Loopcount.count%3 eq 1}" >
<tr>
</c:if>
<td>
<img src="images/${aGood.viewpic}" width="150" height="150" /><br />
商品名稱 : ${aGood.name}<br />
商品價格 : ${aGood.price}<br />
</td>
<c:if test="${Loopcount.count%3 eq 0}">
</tr>
</c:if>
</c:forEach>
<tr>
<td colspan="4">${requestScope.pagebean.pageLink}</td>
</tr>
</c:when>
<c:otherwise>
//資料庫發生錯誤
</c:otherwise>
</c:choose>
</table>
沒有留言:
張貼留言