重定向请求与分页功能的实现

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>

猜你喜欢

转载自blog.csdn.net/qq_34862798/article/details/82784147