gpt4 book ai didi

java - 在业务逻辑之前执行方法

转载 作者:行者123 更新时间:2023-11-28 22:37:47 24 4
gpt4 key购买 nike

我知道 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 或任何其他第 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 无论如何都不会有任何状态。

关于java - 在业务逻辑之前执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22232168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com