gpt4 book ai didi

java - Struts servlet 使用 HttpServlet 对象,因此参数会被覆盖

转载 作者:行者123 更新时间:2023-11-30 03:25:41 25 4
gpt4 key购买 nike

好吧,这让我感到困惑。我有一个 servlet,它返回仪表板上一些图形图表的数据。 servlet 采用一个“action”参数来告诉它要运行哪个数据库查询。该 servlet 在仪表板页面上被调用 2 次,以返回 2 组不同的数据。我的 servlet 看起来像这样:

public class SrvData extends HttpServlet {
private static final long serialVersionUID = 1L;
String action;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

action = request.getParameter("action");
if ( action.equals("getStatus") ) {
// run some query
}
else if ( action.equals("getUsers") ) {
// run some query
}
response.getWriter().write(gson.toJson(data));
}

}

它在我的仪表板 jsp 中被称为 2 个不同的位置,如下所示:

$.get("/SrvData", { 'action' : 'getStatus' })
.done(function (dbData) {
// process the data and build chart
});
$.get("/SrvData", { 'action' : 'getUsers' })
.done(function (dbData) {
// process the data and build chart
});

每种类型的图表的操作都不同。在 Chrome 调试器中,我看到“网络”选项卡中进行了正确的调用:

SrvData?action=getStatus    GET 200 application/json    jquery-1.11.2.js:9659   277 B   15.47 s 
SrvData?action=getUsers GET 200 application/json jquery-1.11.2.js:9659 277 B 18.96 s

现在问题来了。有时(我无法弄清楚是什么触发了它)虽然发布到 servlet 的消息是正确的,但当调用上面的 servlet 代码时,操作始终等于“getUsers” - 对于每次调用!在 Eclipse 调试器中,我看到实际的 SrvData 对象是同一个对象!当我在 UI 和 Eclipse 调试器中放慢速度时,我实际上可以看到发送第二个 GET 请求后暂停的第一个调用 servlet 中的参数发生更改。

这太疯狂了! struts/tomcat 如何使用同一个 servlet 对象来处理多个请求?为什么它不为每个请求实例化一个新对象?我需要更改一些设置才能执行此操作吗?

最佳答案

How can struts/tomcat use the SAME EXACT servlet object for more than one request?

不仅可以,而且必须重用完全相同的对象。这就是 servlet 规范中指定的内容。 servlet 是一个单例。

当您应该使用局部变量时,请停止使用字段,以使您的代码线程安全:

public class SrvData extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String action = request.getParameter("action");
if ( action.equals("getStatus") ) {
// run some query
}
else if ( action.equals("getUsers") ) {
// run some query
}
response.getWriter().write(gson.toJson(data));
}
}

请注意,这与 Struts 完全无关:您使用的是一个普通的旧 servlet,它与 Struts 无关。

关于java - Struts servlet 使用 HttpServlet 对象,因此参数会被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30305699/

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