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 {}
}
后记:
如果解答了你的疑惑,请记得点赞啊!