Struts servlet 使用 HttpServlet 对象,因此参数被覆盖
Struts servlet reusing HttpServlet object so parms get overwritten
好吧,这让我感到莫名其妙。我有一个 servlet,它 returns 仪表板上某些图形图表的数据。 servlet 接受一个 'action' 参数,该参数告诉它 运行 哪个数据库查询。此 servlet 在仪表板页面上被调用 2 次以 return 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.
无关
好吧,这让我感到莫名其妙。我有一个 servlet,它 returns 仪表板上某些图形图表的数据。 servlet 接受一个 'action' 参数,该参数告诉它 运行 哪个数据库查询。此 servlet 在仪表板页面上被调用 2 次以 return 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.
无关