首先,感谢您阅读我的问题..我是编程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和我松开之前的值。
我该怎么办?非常感谢!
答案 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);