在Business Logic之前执行方法

时间:2014-03-06 17:49:49

标签: java tomcat servlets

我知道Servlet Filters and Event Listeners,但我不确定这是否是我需要使用的。

假设我有一个方法:

Integer count = 0;

public void increment() {
     count++;
}

然后是doGet

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    System.out.println(count);
}

第一次执行Get请求时,我希望count=1而不是count=0,因为我希望首先执行方法increment(),然后再执行{{1}} Web应用程序中的其他业务逻辑。

此外,每个用户的计数应该不同。它应该基于特定用户的请求数量。

我可以用什么来解决这个问题?

我不想使用Spring或任何其他第三方库

1 个答案:

答案 0 :(得分:3)

这一切都取决于count应该可用的位置,但您可以创建一个abstract HttpServlet子类,在处理请求之前调用一些abstract方法来执行逻辑

public abstract class BaseServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // wrap it in try-catch if you need to
        prePerformLogic(req, resp);
        // call super implementation for delegation to appropriate handler
        super.service(req, resp);
    }

    protected abstract void prePerformLogic(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException;
}

现在,您自己的Servlet实现将从此类扩展。你会按照自己的意愿实施它。但是,as Luiggi has stated in the comments,您发布的示例会带来许多可能的并发问题。 Servlet通常不应具有任何可变状态。

如果您只想向HttpSession添加计数器属性,请在HttpSession上进行同步,检查属性是否存在。如果没有,请从0开始添加一个。如果是,请将其递增并将其作为属性添加回来。使用AtomicInteger可能会获得更好的性能,但您需要同步检查是否存在属性。

Filter在这个意义上可能更合适,因为Servlet无论如何都不会有任何状态。