不同的用户可以在我的servlet中访问相同的变量

时间:2013-08-30 07:23:31

标签: jsp variables servlets


首先,感谢您阅读我的问题..我是编程servlet的新手,我想出了这个问题:在我的webApplication中,不同的用户可以访问相同的变量,这是我不想发生。我有一种感觉,我没有很好地构建我的webApplication所以我将呈现它。在我的JSP页面中,当我想调用servlet来执行某个过程时,我总是这样调用它:

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

我选择这种方式因为我想从jsp传递给servlet一个参数(在这种情况下是“check”,为了通知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 ... < br />我试着把变量的定义放在方法processRequest中,但是我必须首先初始化变量,就像我使用的IDE环境一样,提醒我在行中我使用这些变量来表示变量可能没有初始化。但我不想初始化变量,因为每次我调用servlet所有的变量init和我松开之前的值。

我该怎么办?非常感谢!

2 个答案:

答案 0 :(得分:2)

servlet引擎为所有Web应用程序生命周期创建并保留一个不安全的Servlet实例。

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

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

另外,要通过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);
           }
     }

就是这样。

答案 1 :(得分: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);