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.

无关