问题分析:平常我们写Servlet时,一个功能就会对应一个Servlet,比如登录、注册对应LoginServlet、RegisterServlet,当一个管理系统有许多的功能时,那么就会有10-30个Servlet,让人看代码时就会非常的凌乱
抽取Servlet的目的:减少Servlet的文件数目,按照实体来对Servlet进行分类,增加代码的可读性,降低代码的耦合度
步骤:
1、创建一个BaseServlet,通过反射来调取对应WebServlet(具体Servlet)相应的功能方法
2、创建相需要的实体Servlet,每一个实体Servlet继承BasicServlet,并定义该实体的所有功能方法
BasicServlet如下:
/*
基本Servlet
*/
public class BasicServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String methodName = req.getParameter("method");
//如果Servlet选择重定向或者是转发,方法会返回一个不为null的字符串
if(methodName != null){
try {
//反射
Method method = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//调用对应方法名称的方法
Object actionObj = method.invoke(this,req,resp);
if(actionObj != null){
String action = actionObj.toString();
if(action.startsWith("redirect:")){
System.out.println(action.split("redirect:")[1]);
//重定向
resp.sendRedirect(action.split("redirect:")[1]);
}else{
//转发
req.getRequestDispatcher(action);
}
}else{
System.out.println("空");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
这里写一个UserServlet作为一个例子,模板如下:
@WebServlet("/user")
public class UserServlet extends BasicServlet {
public String login(HttpServletRequest request,HttpServletResponse response){
/*
此处省略,根据需求写业务代码....
*/
//重定向index.jsp
return "redirect:index.jsp";
}
public String register(HttpServletRequest request,HttpServletResponse response){
/*
此处省略,根据需求写业务代码....
*/
//转发login.jsp
return "login.jsp";
}
}
login.jsp例子如下,重点看action发送的请求路径
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<center>这是登录页</center>
<form action="user?method=login" method="post">
<span>用户名:</span><input name="username">
<div><input type="submit" value="提交"></div>
</form>
</body>
</html>
这里可能有一些读者有以下疑问❔:
1) 为何BasicServlet不注册为一个WebServlet?
BasicServlet用于判断每一个WebServlet具体请求的功能(登录、注册等等)和跳转方向(转发或重定向),然后使用反射调用WebServlet对应的功能方法,并且利用if分支进行重定向或者转发。而WebServlet只需要专注于功能实现的具体业务代码,从而在整体上达到减低代码耦合度的效果!
2)为何在WebServlet没有去编写DoGet和DoPost方法,而在BasciServlet中编写这两个方法?
首先理清上面的继承体系,是UserServlet -> BasicServlet -> HttpServlet,虽然UserServlet被注册为WebServlet,但是它没有DoGet或是DoPost方法,那么它就会调用父类的DoGet或是DoPost方法的方法,父类也就是BasicServlet,然后再通过父类去调用WebServlet对应的功能方法。
这样就不用在每个WebServlet中去编写DoGet或者是DoGet方法了,从而降低代码的耦合度。
注意:在上面的回答中,我提到的WebServlet指的是在Tomcat中注册为Servlet的具体类,它是用户请求的入口。

海内存知己,天涯若比邻,如果你觉得该篇文章对你有一定的启发和帮助,或者你是大神路过,都可以点赞💖+关注😋。2022年,和未谋面的你一起进步💪
本文探讨如何通过创建BaseServlet和实体Servlet,减少Servlet数量,提高代码可读性和耦合度。介绍了如何通过反射调用具体功能方法,并举例说明了UserServlet和相关页面逻辑。
599

被折叠的 条评论
为什么被折叠?



