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