有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

业务逻辑之前的java执行方法

我知道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()首先执行,然后再执行web应用程序中的任何其他业务逻辑

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    这完全取决于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可能会获得更好的性能,但需要同步检查属性是否存在

    从这个意义上讲,{}可能更合适,因为{}无论如何都不会有任何状态