【java Web】BaseServlet的原理深入分析以及封装一个BaseServlet

本文探讨了BaseServlet如何简化Servlet开发,通过方法分发减少代码冗余,提高开发效率。介绍了Servlet体系结构,包括GenericServlet和HttpServlet,并展示了BaseServlet的实现原理及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.BaseServlet解决了什么问题

让servlet不冗余:使得一个Servlet可以对应一个Service如下图:它让图一中转变为图二:

图一:在这里插入图片描述
图二:

在这里插入图片描述

2.Servlet的体系结构

在这里插入图片描述

1.servlet:

这个在之前的博客有详细的介绍:下面是博客链接
https://blog.youkuaiyun.com/jerry11112/article/details/98045018

2.GenericServlet(不做重点研究)

将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象 * 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可!

3.HttpServlet

(1) 定义类继承HttpServlet
(2) 复写doGet/doPost方法
对http协议的一种封装,简化操作,注解@WebServlet代替了xml配置文件

@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
3.BaseServlet原理分析
(1)分析:

综上的代码可以看出,前端页面需要调用一个叫做findUserServlet的方法,后台就需要定义一个有相关的findUserServlet的方法的serlvlet,这个方法是查找用户,如果我们还需要一个和用户相关的方法,那么还得重新定义一个Servlet,这就导致了servlet的冗余!所以我们要解决这个问题,此时BaseServlet站了出来,它说它可以!

然后咱们简单的谈谈浏览器访问服务器的过程:
每次网页在发送get请求或者post请求的时候,都会先走service方法,HttpServlet,对get,post ,put等共七个请求进行了封装,然后get调用对应的doget(下面是service 方法的源码,如果这不明白,还是看我之前的那个博客)
在这里插入图片描述
看了上面的源码,大家都明白了吧,其实它就是完成了分发方法的功能,启发了我们抽离Servlet。在BaseServlet完成方法的分发即可!

(2)BaseServlet代码:
 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //完成方法分发:

        //1.获取请求路径
        String uri = req.getRequestURI(); //   /travel/user/add
        //2.获取方法名称
        String methodName = uri.substring(uri.lastIndexOf('/') + 1);
        System.out.println(methodName);
        //3.获取方法对象Method
        try {
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //4.执行方法
            method.invoke(this, req, resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
(3)让对应的Servlet继承BaseServlet

UserServlet 继承了BaseServlet
此时我们在前台获得此Servlet的路径就为:user/findUser

@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
    public void findUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
    }

后记:

如果解答了你的疑惑,请记得点赞啊!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值