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>