【问题标题】:How do I override a parent class method to perform some work at the beginning and the end of the method?如何覆盖父类方法以在方法的开头和结尾执行一些工作?
【发布时间】:2017-02-24 01:56:13
【问题描述】:

我已经扩展了javax.http.servlet.HttpServlet 类以向该类添加一些方法供我使用。我的应用程序的所有 servlet 都将扩展这个新类。这个类的基本版本如下:

public class MyCustomServletClass extends HttpServlet{

    protected void startWork(){
        // do some stuff
    }

    protected void finishWork(){
        // do more stuff
    }

}

这两个方法将在每个 HttpServlet 请求方法(例如 doGet、doPost 等)的开始/结束处执行。这是一个简单的 servlet 示例,我可以使用我的自定义 MyCustomServletClass 创建它:

public class SomeServlet extends MyCustomServletClass{

    protected void doGet(HttpServletRequest request, HttpServletResponse response){
        this.startWork();

        // some servlet specific work here

        this.finishWork();
    }

}

所以我的问题是这样的Java 中有什么方法可以让 doGet 方法在方法的开头/结尾自动运行这两个方法

我正在尝试找到一种好方法,不必在我拥有的每个 servlet 中的每个 doGet、doPost 等中手动调用 startWork() 和 endWork()。我希望能够扩展 MyCustomServletClass,实现 doGet,并在幕后开始时调用 startWork(),并在幕后结束时调用 endWork()。

理想情况下,在我扩展 MyCustomServletClass 的 servlet 中,doGet 方法应该是:

protected void doGet(HttpServletRequest request, HttpServletResponse response){
    // doGet specific work here
}

无需每次都手动调用我的两个父方法。

我想我可以在构造函数中执行 startWork(),但我认为我对 servlet 的生命周期没有足够的控制权来在析构函数中执行 endWork()。

有没有办法让这两个方法在 doGet 的开始/结束时自动和在幕后执行?

【问题讨论】:

  • 想想在startWorkfinishWork之间调用一个抽象函数doWork

标签: java class servlets inheritance jakarta-ee


【解决方案1】:

您可以使用template method 自动调用您的方法并将实现委托给另一个可覆盖的方法:

public class MyCustomServletClass extends HttpServlet {
    @Override
    protected final void doGet(HttpServletRequest request, HttpServletResponse response) {
        startWork();
        get();
        endWork();
    }

    protected void get(HttpServletRequest request, HttpServletResponse response) {
        // default implementation, should be overridden
        super.doGet(request, response);
    }
}

请注意,doGet() 被声明为 final 以防止实现者错误地覆盖它。

另一种选择可能是使用AOP 注入您的方法。

【讨论】:

    【解决方案2】:

    这就是 servlet 过滤器旨在解决的问题:

    @WebFilter(servletNames={ "MyCustomServlet", ... })
    public class WorkWrapperFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            try {
                startWork();
                chain.doFilter(request, response);
            } finally {
                finishWork();
            }
        }
    
        private void startWork(){
            // do some stuff
        }
    
        private void finishWork(){
            // do more stuff
        }
    
    }
    

    这允许您以完全解耦的方式执行与您的 servlet 函数正交的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 2021-05-03
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      相关资源
      最近更新 更多