BaseServlet 的详解和使用

本文探讨了在开发中如何优化Servlet的使用,以减少资源消耗。通过在一个Servlet中使用反射和多态性,实现了多个方法的调用,避免了大量的case语句。同时,通过定义BaseServlet基类,减少了代码冗余,实现了方法的集中管理。在BrandServlet示例中,展示了如何通过继承BaseServlet并重写方法来简化代码,实现了动态调用不同业务逻辑。
摘要由CSDN通过智能技术生成

        在进行开发时会需要编写许多的 Servlet 来进行满足多种多样的业务需求,但是每一个 Servlet 都是需要部署在 Tomcat 或者其他的 Web 服务器上,如果 Servlet 的数量过多的话会占据大量的资源,因此我们可以考虑更优的方案来解决这个问题。

        首先我们考虑在一个 Servlet 中编写多个方法,根据 request 携带过来的方法的名称的参数来进行方法的选取

        但是当需要的方法的数量过多的时候就会导致 case 语句的数量繁多,因此我们就需要进一步的优化,这时我们可以想到可以利用反射的方式来进行 Servlet 的使用

        从这其中我们又可以发现,当存在多个相同的类似基类,如:UserServlet , BrandServlet 等的时候,就会出现类似代码的冗余,每一个基类中都会写相同的代码,此时我们就可以考虑使用父类继承的方式来进行代码的优化,此时我们可以定义一个实现 HtppServlet 接口的类并在其中设置service 方法,而此时的 HttpServlet + service 的实现方式就是我们的 BaseServlet

package com.controller;

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;

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取方法名
        String uri = req.getRequestURI();
        int idx = uri.lastIndexOf('/');
        String methodName = uri.substring(idx+1);
        // 获取字节码文件 就是Servlet
        Class<? extends BaseServlet> cls = this.getClass();
        //使用方法
        try {
            //获取方法 Method 对象
            Method method = cls.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //执行方法
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}
/**
 * BaseServlet 实现过程是设计一个 BaseServlet 基础类来简化繁杂的Servlet
 * 利用反射的基本原理 重写 HttpServlet 的 service 方法在其中获取方法名
 * 与传统的 Servlet 的访问方式相比,这种方式可以减少 Servlet 的创建,减小了内存的占用,
 * 在一个 Servlet 中构建多种的方法通过名称的不同来进入不同的方法,
 * 在这其中可以使用 switch 来进行跳转,但是当方法的数量过多时,case 语句也会造成冗杂
 * 所以说我们可以利用反射的原理来进行,从而避免了大量繁琐的判断语句
 * 1、获取方法的标识符
 * 2、根据方法名称调用相应的逻辑方法
 */

/**
 *  在 html 页面中提交表单的发送位置的 Servlet ,然后根据 Servlet 的名称来去往相应的 Servlet,由于该 Servlet 继承自 BaseServlet
 *  所以我们可以直接通过方法名称找到相对应的 Servlet 中的方法名称
 */

        此时我们在进行 UserServlet 的调用时只需要继承 BaseServlet  并且编写相应的方法即可,可以通过地址栏输入 /brand/selectAll 的访问路径访问相应的 Servlet

         最后,就是有关于原始的 doGet 和 doPost 的消失问题,我个人的理解是这样的,由于我们本来的 Servlet 是继承自 HttpServlet 所以是一种继承的关系,我们可以选择通过重写 doGet 和 doPost 的方式来进行请求方式不同的转发,而现在我们这种方式是通过对请求路径的不同来进行的转发,因此不用重写 doGet 和 doPost,在另外一方面,关于请求参数的获取问题,我们一般使用 json 进行数据的传输和接受,就算是有意外情况也会与前端开发人员进行沟通,所以这个问题不必要太纠结,因为我们前面只是在学习最初始版本的知识,所以会学到许多比较麻烦的知识。

 

@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
    private BrandService service = new BrandServiceImpl();
    public void selectAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取数据
        List<Brand> brands = service.selectAll();
        //将List集合转为json
        String jsonString = JSON.toJSONString(brands);
        //响应
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }
    public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        BufferedReader br = request.getReader();
        // 读取json数据  因为传入的形式和getParams形式不一样,所以需要使用 readLine的方法
        String params = br.readLine();
        Brand brand = (Brand) JSON.parseObject(params, Brand.class);
        service.add(brand);
        // 响应表示
        response.getWriter().write("success");
    }
    public void selectById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        BufferedReader br = request.getReader();
        //获取json数据
        String params = br.readLine();
        //转为brand
        int id= JSON.parseObject(params, int.class);
        //调用方法传入id
        Brand brand1 = service.selectById(id);
        // 将数据转为json
        String jsonString = JSON.toJSONString(brand1);
        // 响应数据
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }
    public void deleteById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        BufferedReader br = request.getReader();
        String params = br.readLine();
        Integer id = JSON.parseObject(params, int.class);
        service.deleteById(id);
        response.getWriter().write("success");
    }
    public void deleteByIds(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        BufferedReader br = request.getReader();
        String params = br.readLine();
        int[] ids = JSON.parseObject(params,int[].class);
        service.deleteByIds(ids);
        //
        response.getWriter().write("success");
    }
    public void updateInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        BufferedReader br = request.getReader();
        String params = br.readLine();
        Brand brand = (Brand) JSON.parseObject(params, Brand.class);
        service.updateInfo(brand);
        //
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write("success");
    }
    public void selectByPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //读取参数 当前页码  每页展示条数
        //下划线表示临时数据
        String _currentPage = request.getParameter("currentPage");
        String _pageSize = request.getParameter("pageSize");
        int currentPage = Integer.parseInt(_currentPage);
        int pageSize = Integer.parseInt(_pageSize);
        //调用service
        PageBean<Brand> pageBean = service.selectByPage(currentPage, pageSize);
        //json
        String jsonString = JSON.toJSONString(pageBean);
        //响应
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }
    public void selectByPageAndCondition(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //读取参数 当前页码  每页展示条数
        //下划线表示临时数据
        String _currentPage = request.getParameter("currentPage");
        String _pageSize = request.getParameter("pageSize");
        int currentPage = Integer.parseInt(_currentPage);
        int pageSize = Integer.parseInt(_pageSize);
        //
        BufferedReader br = request.getReader();
        String params = br.readLine();
        Brand brand = JSON.parseObject(params, Brand.class);
        //调用service
        PageBean<Brand> pageBean = service.selectByPageAndCondition(currentPage, pageSize,brand);
        //json
        String jsonString = JSON.toJSONString(pageBean);
        //响应
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵英英俊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值