一、BaseServlet
BaseServlet 的作用就是要消灭HttpServlet,不需要每次写doget,dopost
1、引入BaseServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* BaseServlet 提供给所有的Servlet程序,完成对应的方法处理过程
*/
public abstract class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// exam: method == findAllEmpByPage
String method = req.getParameter("method");
Method targetMethod = null;
try {
// public void findAllEmpByPage(HttpServletRequest req, HttpServletResponse resp)
// 根据方法名 方法参数 获取方法 findAllEmpByPage(HttpServletRequest req, HttpServletResponse resp)
targetMethod = this.getClass().getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
// 执行目标 让方法反射执行----》调用 findAllEmpByPage( req, resp)
Object result = targetMethod.invoke(this, req, resp);
// 方法设置执行结果
System.out.println("result:"+result);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
2、创建EmpServlet
/**
* EmpServlet 是 HttpServlet 可以接收前端的请求
*
*/
// /emp?method=findAllEmpByPage
@WebServlet("/emp")
public class EmpServlet extends BaseServlet {
private EmpService empService;
@Override
public void init() throws ServletException {
empService = new EmpServiceImpl();
}
/**
* 分页查选所有 雇员 并分页 /showAllEmpByPage.jsp
*
* 等价于 ShowAllEmpServletByPage 中的 doget()
*/
// /emp?method=findAllEmpByPage
public void findAllEmpByPage(HttpServletRequest req, HttpServletResponse resp){
// 接收分页参数
String pageIndexStr = req.getParameter("pageIndex");
String pageSizeStr = req.getParameter("pageSize");
// 初始化默认值,就算用户不传递,也会进行分页
int pageIndex = 1;
int pageSize = 5;
// 获取用户传递的分页
if (pageIndexStr!=null){
// 将string 参数 转化为 int 类型
pageIndex = Integer.valueOf(pageIndexStr);
}
if (pageSizeStr!=null){
pageSize = Integer.valueOf(pageSizeStr);
}
try {
List<Emp> empList = empService.findAllEmpByPage(pageIndex,pageSize);
// 将数据传递给前端界面 放到request 属性中 ---》在showAllEmp.jsp 中使用 el 获取
req.setAttribute("empList",empList);
// 如何计算 总页数: 1.先查出总行数 2.使用总行数 / 每页大小
// 得到总行数 / pageSize
int pageCount = empService.getPageCountByPage(pageSize);
PageInfo pageInfo = new PageInfo(pageIndex,pageSize,pageCount);
// 将当前页 信息传递 /showAllEmpByPage.jsp
req.setAttribute("pageInfo", pageInfo);
req.getRequestDispatcher("/showAllEmpByPage.jsp").forward(req,resp);
} catch (SQLException | ServletException | IOException e) {
e.printStackTrace();
}
}
/**
* 更新 emp
* @param req
* @param resp
*/
// /emp?method=updateEmp
public void updateEmp(HttpServletRequest req, HttpServletResponse resp){
}
/**
* 更具id 查询 雇员
* @param req
* @param resp
*/
// /emp?method=showEmpById
public void showEmpById(HttpServletRequest req, HttpServletResponse resp){
}
}
3、修改前端界面showAllEmpByPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<H1>Emp 列表展示</H1>
<table border="1px">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>sex</td>
<td>salary</td>
</tr>
<%--
从 requset 获取 empList 进行遍历展示出来 --->展示每一行
${empList}
--%>
<c:forEach items="${empList}" var="emp">
<tr>
<td>${emp.id}</td>
<td>${emp.name}</td>
<td>${emp.age}</td>
<td>${emp.sex}</td>
<td>${emp.salary}</td>
</tr>
</c:forEach>
</table>
<div>
<a href="/emp?method=findAllEmpByPage&pageIndex=1&pageSize=${pageInfo.pageSize}">首页</a>
<%--
1.必须知道 当前页 总共多少页 每页大小
--%>
<%--
只有当前页 小于总页数 才显示,否则隐藏
--%>
<c:if test="${pageInfo.currentIndex < pageInfo.countPage}">
<a href="/emp?method=findAllEmpByPage&pageIndex=${pageInfo.currentIndex+1}&pageSize=${pageInfo.pageSize}">下一页</a>
</c:if>
<%--
如果是第一 页 不显示 上一页
否则 显示 2 3 4 页码显示
--%>
<c:if test="${pageInfo.currentIndex > 1}">
<a href="/emp?method=findAllEmpByPage&pageIndex=${pageInfo.currentIndex-1}&pageSize=${pageInfo.pageSize}">上一页</a>
</c:if>
<a href="/emp?method=findAllEmpByPage&pageIndex=${pageInfo.countPage}&pageSize=${pageInfo.pageSize}">尾页</a>
</div>
</body>
</html>
疑惑
this 是谁?
类的继承关系:EmpServlet—》BaseServle----》HttpServlet----》Object
所有的东西到jvm 都是 对象object
EmpServlet empServlet;
empServlet 是属于 Object?属于HttpServlet ? 属于BaseServle ? 属于EmpServlet?
类中的 this 指向当前对象
学生类(Studnet)—》人类(humen)—》Object
Student xiaoming;
xiaoming 使学生么?小明是人吧
Student xiaoming = new Studnet();
普通方式请求流程
/showAllEmpServletByPage —》ShowAllEmpServletByPage(对象)—》
父类HttpServlet.service()---->ShowAllEmpServletByPage.doget()
使用BaseServlet方式请求方式流程,淘汰doGet,doPost()
/emp?method=findAllEmpByPage ---->EmpServlet(对象)---->父类BaseServlet.service()—>获取method参数findAllEmpByPage —》根据方法名 可以找到对应 方法 public void findAllEmpByPage(HttpServletRequest req, HttpServletResponse resp)------》将方法 反射执行