重定向請求與分頁功能的實現
阿新 • • 發佈:2018-11-05
1. 重定向請求
請求轉發:
request.getRequestDispatcher(“目錄路徑”).forward(request,response);
請求重定向:
response.sendRedirect(“目錄路徑”);
請求重定向和請求轉發的區別: 1) 請求轉發時,位址列不會改變(是第一個servlet的地址) 重定向,位址列會發生變化(是最後一個servlet的地址) 2) 請求轉發時一次請求,跳轉發生在伺服器內部 重定向是兩次請求,第一次請求會返回302的狀態碼和目標地址, 瀏覽器根據目標地址傳送第二次請求,才完成整個流程 3) 重定向是兩次請求,所以不能利用request作用域存值取值 但可以使用session作用域來存值取值 請求轉發因為是同一次請求,所以可以使用request作用域存值取值 4) 請求轉發的目標只能是本專案的servlet或jsp 重定向跳轉的目標可以是任意的
頁面跳轉時如何選擇重定向還是請求轉發?
查詢:
servlet --> jsp // 關係密切的跳轉使用請求轉發 forward()
刪除:
刪除servlet --> 查詢列表servlet // 關係不密切的跳轉使用重定向 redirect()
2.分頁功能實現
select … from … limit n; // 每次最多查詢n條記錄
select … from … limit m, n; // 從m開始(m從0開始),每次最多查詢n條記錄
每頁10條記錄
1 頁 limit 0, 10;
2 頁 limit 10, 10;
3 頁 limit 20, 10;
…
page(頁號), size(每頁記錄數)
m=(page-1)*size
n=size
1.分頁功能的實現
Servlet程式碼
package controller;
import entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
@WebServlet(urlPatterns = "/s1")
public class Servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int count = 0; //資料庫內的資料個數
int total = 1; //預設首頁
int total_next = 2; //下一頁
req.setAttribute("next",total_next);
int total_prev = 0; //上一頁
ArrayList<User> users = new ArrayList<User>();
//HttpSession session = req.getSession();
req.setAttribute("msg",false);
Connection conn = null;
PreparedStatement stmt = null;
PreparedStatement stmt2 = null;
ResultSet rs = null;
try {
int flag = 10; //每頁顯示個數
int page = 1; //頁數
conn = Utils.getConnection();
stmt = conn.prepareStatement("select count(*) from test2");
rs = stmt.executeQuery();
rs.next();
count = rs.getInt(1);
if (count != 0){
if (count/flag == 0){
page = count/flag;
req.setAttribute("last",page);
}else {
page = count/flag+1;
req.setAttribute("last",page);
}
}
stmt2 = conn.prepareStatement("select * from test2 limit ?,?");
if(req.getParameter("page") != null) {
total_prev = Integer.parseInt(req.getParameter("page"))-1;
req.setAttribute("prev",total_prev);
total = (Integer.parseInt(req.getParameter("page"))-1)*10;
total_next = Integer.parseInt(req.getParameter("page"))+1;
req.setAttribute("next",total_next);
}//接受返回的頁數
stmt2.setInt(1,total);
stmt2.setInt(2,flag);
rs = stmt2.executeQuery();
while (rs.next()){
users.add(new User(rs.getString("name"),
rs.getString("passwd")));
}
req.setAttribute("list",users);
req.getRequestDispatcher("1.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
jsp頁面程式碼
<%--
Created by IntelliJ IDEA.
User: kmz
Date: 2018/9/17
Time: 19:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="a" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tbody>
<a:forEach items="${requestScope.list}" var="u">
<tr>
<td>${u.name}</td>
<td>${u.passwd}</td>
</tr>
</a:forEach>
</tbody>
</table>
<a:if test="${requestScope.prev>0}">
<a href="/s1?page=${requestScope.prev}"><button>上一頁</button></a>
</a:if>
<a href="/s1?page=1"><button>首頁</button></a>
<a href="/s1?page=2"><button>第2頁</button></a>
<a href="/s1?page=3"><button>第3頁</button></a>
<a href="/s1?page=${requestScope.last-1}"><button>末頁</button></a>
<a:if test="${requestScope.next<requestScope.last}">
<a href="/s1?page=${requestScope.next}"><button>下一頁</button></a>
</a:if>
</body>
</html>