完成分页的增删改查

一、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)------》将方法 反射执行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值