0

我来自 .NET 背景并尝试一些 Java(Servlet/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 变量肯定会保留它。我在这里有什么遗漏吗?

4

2 回答 2

2

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

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);
}

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

于 2013-10-29T19:21:26.533 回答
2

如果您有如下代码(在之前观察打印语句setAttribute(...)),它肯定会:

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

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

于 2013-10-29T19:20:36.983 回答