BaseServlet——servlet优化servlet函数一般来说,servlet是专门用来接收client的请求的,具体来说就是接收client的请求数据,然后调用底层服务对数据进行处理并产生结果。传统的写servlet方式从图中可以看出,我们只有两个类,一个用户类,一个任务类,功能都很简单,登录注册,添加修改查询任务,已经有了5个servlet,所以以后如果我们一个功能一个servlet,会很冗余,而且user和task的servlet写在一起,很难区分什么是什么,增加了后期维护的难度。优化思路MVC三层架构能不能设计一个易于管理的方式统一管理?参考我们MVC三层架构中的service和dao层我们试着像他们一样,一个具体的类由对应的dao或service类来管理。我们设计了BaseServlet。是不是感觉清晰了很多?然后把各个模块中的功能抽象成一个方法。(图为UserServlet中的方法)然后我们的前端请求路径就这样写servlet运行流程客户端发送请求——init初始化servlet——调用服务方法,自动识别post或获取请求方法。上面我们把每个函数都设计成了一个方法,那么我们如何自动识别是哪个方法呢?我们想到了反思。那我们把服务方法和反射结合起来改造一下,让它自动识别是哪个方法。优化过程本来我们直接继承HttpServlet,但是现在多了一层BaseServlet,那么我们原来的类就必须继承BaseServlet,然后BaseServlet继承HttpServlet,然后重写里面的service方法。/*BaseSevlet继承HttpServlet*/publicclassBaseServletextendsHttpServlet{@Overrideprotectedvoidservice(HttpServletRequestreq,HttpServletResponseresp){//1.先获取请求路径StringrequestUrl=req.getRequestURI();//2。获取请求路径last方法名(详见上面url图片)intindex=requestUrl.lastIndexOf('/');StringmethodName=requestUrl.substring(index+1);//3。获取调用对象的字节码文件Classclazz=this.getClass();尝试{//4。通过方法名获取类中的方法。方法method=clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);//5。执行方法method.invoke(this,req,resp);}catch(NoSuchMethodException|IllegalAccessException|InvocationTargetExceptione){e.printStackTrace();}}}原类继承BaseServlet/***@program:BaseServlet*@description:*@author:stop.yc*@create:2022-04-1315:42**///user,*代表任意@WebServlet("/user/*")publicclassUserServletextendsBaseServlet{/***@Description:Loginservlet*@Param:[req,resp]*@return:void*@Author:stop.yc*@Date:2022/4/13*/publicvoidlogin(HttpServletRequestreq,HttpServletResponseresp)throwsIOException{//1.获取前端数据(post)请求体BufferedReaderreader=req.getReader();StringuserStr=reader.readLine();//2...}}前端请求写法//只是url的例子,其他具体代码按照你的代码来。axios({method:"post",url:"http://localhost:8080/qg-engineering-management-system/user/login",data:_this.user,}).then(function(resp){//。。。}
