2014-03-06 29 views
0

我知道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因为我希望在Web应用程序中的任何其他业务逻辑之前先执行方法increment()

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

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

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

+1

过滤器可能是合适的。不要忘记并发问题。 –

+0

或面向方面的编程 – robermann

+0

您**不应**在您的Servlet中不小心添加任何字段。过滤器可以解决这个非现实世界的问题。请发布有关您真正问题的更多详细信息以获取详细建议。 –

回答

3

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

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,您发布的示例带来了许多可能的并发问题。 A Servlet通常不应该有任何可变状态。

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

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

+0

@ThreaT在多线程环境中。如果您每次访问同一个计数器都获得多个请求。如果您没有正确处理同步,则可能会丢失计数器的更新。 –

+0

@ ThreaT是的,您的Servlet只有一个实例将由Servlet容器创建。同步正确取决于您的用例。我已经解释了你如何用你的'counter'例子来做到这一点。您应该阅读多线程教程,因为如果您要开发Web应用程序,了解并发性非常重要。 –

+0

@ThreaT启动[Java教程](http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html)。然后,只需按照线索(无双关语)来处理您不明白的事情。另外,javadoc。 –