ServletContext变量不保留值

时间:2013-10-29 19:17:48

标签: java servlets

我来自.NET背景并尝试Java(Servlets / JSP)的一些基础知识。在.NET中,我们有ViewState,Session,Application变量。从我读到的,应用程序变量在Java中有一个叫做ServletContext的兄弟。所以我创建了一个简单的servlet程序

public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

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

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    String userName = request.getParameter("userName");

    ServletContext context = request.getServletContext();
    context.setAttribute("savedContextUserName", userName);

    out.println("Hello! " + context.getAttribute("savedContextUserName"));
}

我打开浏览器并传递以下内容并获得正确的输出,即Hello!斯图尔特

 http://localhost:8080/ServletProject/SimpleServlet?userName=Stuart

然后我打开另一个浏览器实例并传递以下内容但获取Hello!空

 http://localhost:8080/ServletProject/SimpleServlet

当我打开新的浏览器实例时,上下文是否应该保留Stuart的值? .NET的Application变量肯定会保留它。这里有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

如果你有类似下面的代码(在setAttribute(...)之前观察打印语句),肯定会这样做:

    ServletContext context = request.getServletContext();
   out.println("Hello! " + context.getAttribute("savedContextUserName"));
    context.setAttribute("savedContextUserName", userName);

使用当前代码,首先使用null覆盖上下文变量(当您在新浏览器中进行第二次调用时),然后进行打印。

答案 1 :(得分:2)

它保留了它的价值但是当你致电http://localhost:8080/ServletProject/SimpleServlet时,它会将ServletContext属性覆盖为空

String userName = request.getParameter("userName");
//now userName is null
ServletContext context = request.getServletContext();
context.setAttribute("savedContextUserName", userName); //null is now set into the context

所以你应该放置一个条件,以避免将null设置为上下文

String userName = request.getParameter("userName");
if(userName != nul && !userName.isEmpty()) {
    ServletContext context = request.getServletContext();
    context.setAttribute("savedContextUserName", userName);
}

或者只是在设置值之前打印它,这取决于您的使用情况。