javaWeb实例之抽取BaseServlet

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaWeb实例之抽取BaseServlet相关的知识,希望对你有一定的参考价值。

首先说下为什么要抽取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

以上是关于javaWeb实例之抽取BaseServlet的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb之文件上传下载

javaWeb实例之邮件注册激活

javaWeb实例之使用Redis保存分类数据

JavaWeb基础—上传于下载

JavaWeb07-HTML篇笔记

Javaweb学习笔记之Spring的依赖注入方式