1. 程式人生 > >重定向請求與分頁功能的實現

重定向請求與分頁功能的實現

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>