首先说下为什么要抽取BaseServlet.java呢?
看图可以知道每当前端页面有一个请求时,后台就需要创建一个Servlet类实现相关的逻辑,如果需求多了,就会有很多Servlet.java类。
而抽取BaseServlet目的就是为了减少Servlet类数量。
即现在只有两个Servlet类了,而前端请求可以写作方法在UserServlet中,只需要在前端请求中写方法名即可反射。
如下图,发现Servlet类确实减少了:
其中BaseServlet.java
// 不需要访问到该servlet
// 如果不抽取BaseServlet,那么所有请求都需要写一个XXXServlet.java类
// 如:ActiveUserServlet.java、ExitServlet.java、FindUserServlet.java、LoginServlet.java、RegisterServlet.java
public class BaseServlet extends HttpServlet {
// 只需要实现service()方法,然后在该方法中分发请求
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 分发方法即分发activeUser、exit、findUser、login、register等方法
// 完成方法分发
// 1.获取请求路径
String uri = req.getRequestURI();// /demo/user/login
System.out.println("请求uri: "+uri);
// 2.获取方法名称
String methodName = uri.substring(uri.lastIndexOf('/') + 1);// login
System.out.println("方法名称:"+methodName);
// 3.获取方法对象Method,根据方法名称反射方法对象
//获取方法
try {
// getMethod(String methodName, Object... args); 传入方法名称和参数
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//4.执行方法
method.invoke(this,req,resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
UserServlet.java
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
public void register(HttpServletRequest request, HttpServletResponse response) {
// 注册逻辑
System.out.println("注册逻辑");
}
public void activeUser(HttpServletRequest request, HttpServletResponse response) {
// 激活用户逻辑
System.out.println("激活用户逻辑");
}
public void exit(HttpServletRequest request, HttpServletResponse response) {
// 退出登录逻辑
System.out.println("退出登录逻辑");
}
public void findUser(HttpServletRequest request, HttpServletResponse response) {
// 发现用户逻辑
System.out.println("发现用户逻辑");
}
public void login(HttpServletRequest request, HttpServletResponse response) {
// 登录逻辑
System.out.println("登录逻辑");
}
}
浏览器输入:http://localhost:8080/demo/user/exit即可访问对应方法,处理对应请求的逻辑。
本项目的完整代码地址:GitHub的Demo