1


首先,感谢您阅读我的问题。我是 servlet 编程的新手,我遇到了这个问题:在我的 webApplication 中,不同的用户可以访问相同的变量,这是我不想发生的事情。我有一种感觉,我没有很好地构建我的 webApplication,所以我将介绍它。在我的 JSP 页面中,当我想调用 servlet 进行某些处理时,我总是用这种方式调用它:

<a href="MyServlet?check">Some Html Code</a>
<a href="MyServlet?show">Some Html Code</a>

我选择这种方式是因为我想从 jsp 向 servlet 传递一个参数(在这种情况下是“检查”,以便通知 servlet“嘿,你,用户单击了按钮检查”) - (我可以这样做吗?另一种方式?)无论如何!所以,在 MyServlet 我写了这个:

MyServlet

import javax.servlet.http.HttpServlet
//i import and many others..

public class MyServlet extends HttpServlet{
    private int count1; //these are the variables that see all the users
    private String Title;

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

           if(request.getQueryString().equals("check")){
                 //do some stuff and then put a value (its not random) in the count1
                 count1 = 10; //lets say this value its 10 for a user1.
                 request.setAttribute("count", count1);           
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page1.jsp");
                 disp.forward(request, response);
           }
           else if (request.getQueryString().equals("show")){
                 //do some stuff and then put a value in the count1
                 title = "title"; //same here
                 request.setAttribute("title", title);
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page2.jsp");
                 disp.forward(request, response);
           }
     }

所以在 MyServlet 中,我为我的 jsp 中的所有链接嵌套了 if-else 语句。正如我在一开始所说的那样,我的应用程序中的所有用户都可以访问相同的变量。因此,如果 user1 在单击按钮后检查变量 count1 取值 10,然后另一个 user2 单击相同的按钮并且变量取另一个值(例如 20),那么 user1 的值也为 20...

我试图将变量的定义放在方法 processRequest 中,但是我必须首先初始化变量,因为我使用的 IDE 环境提醒我,在我使用这些变量的行中,变量可能尚未初始化。但是我不想初始化变量,因为每次我调用 servlet 时,所有变量都会初始化并且我会丢失之前的值。

我应该怎么办?多谢!

4

2 回答 2

2

servlet 引擎在整个 Web 应用程序生命周期中创建并保持一个 Servlet 实例,线程不安全。

这意味着,在 servlet 级别设置的每个属性都将在访问这些功能的所有线程(调用、用户...)之间共享。

所以你永远不应该设置 Servlet 属性来处理请求或会话值。

Adiotionally,要通过 GET 发送参数,您应该将它们作为键/值集合通知。

这样,您就可以通过 Request 的 getParameter() 方法访问这些参数。

因此,适用于您的代码:

<a href="MyServlet?action=check">Some Html Code</a>
<a href="MyServlet?action=show">Some Html Code</a>

现在,您正在向 Servlet 发送一个名为“action”的参数。要检索它:

public class MyServlet extends HttpServlet{

   //removed instance level properties

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

           String action=request.getParameter("action");
           //add some validation code here on the "action" value
           if(action.equals("check")){
                 //do some stuff and then put a value (its not random) in the count1
                 int count1 = 10; //lets say this value its 10 for a user1.
                 request.setAttribute("count", count1);           
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page1.jsp");
                 disp.forward(request, response);
           }
           else if (action.equals("show")){
                 //do some stuff and then put a value in the count1
                 String title = "title"; //same here
                 request.setAttribute("title", title);
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page2.jsp");
                 disp.forward(request, response);
           }
     }

就是这样。

于 2013-08-30T08:32:05.137 回答
2

在大多数 Servlet 容器中,将有一个 Servlet 类的实例,为所有用户提供所有请求。

如果您想要每个用户的变量,那么您需要创建一个 HTTP 会话并将变量存储在那里。就像是

HttpSession session = request.getSession(true);
Integer count = (Integer) session.getAttribute("count");
if (count == null) {
    count = Integer.valueOf(10);
}
// Do stuff with count
session.setAttribute("count", count);
于 2013-08-30T08:36:11.827 回答