javaWeb实例之抽取BaseServlet
  TEZNKK3IfmPf 2023年11月13日 17 0

首先说下为什么要抽取BaseServlet.java呢?

javaWeb实例之抽取BaseServlet

看图可以知道每当前端页面有一个请求时,后台就需要创建一个Servlet类实现相关的逻辑,如果需求多了,就会有很多Servlet.java类。

抽取BaseServlet目的就是为了减少Servlet类数量

javaWeb实例之抽取BaseServlet

即现在只有两个Servlet类了,而前端请求可以写作方法在UserServlet中,只需要在前端请求中写方法名即可反射。

如下图,发现Servlet类确实减少了:

javaWeb实例之抽取BaseServlet

其中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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   25天前   51   0   0 java
  TEZNKK3IfmPf   2024年05月31日   55   0   0 java
TEZNKK3IfmPf