Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServletContext变量不';保留价值_Java_Servlets - Fatal编程技术网

Java ServletContext变量不';保留价值

Java ServletContext变量不';保留价值,java,servlets,Java,Servlets,我来自.NET背景,正在尝试一些Java基础知识(servlet/JSP)。在.NET中,我们有ViewState、Session和Application变量。据我所知,应用程序变量在Java中有一个兄弟,叫做ServletContext。所以我创建了一个简单的servlet程序 public class SimpleServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected

我来自.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的应用程序变量肯定会保留它。这里有什么我遗漏的吗?

如果您有下面这样的代码(请注意
setAttribute(…)
之前的print语句):


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

如果您有下面这样的代码(请注意
setAttribute(…)
之前的打印语句):


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

它保留它的值,但当您调用
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);
}

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

它保留它的值,但当您调用
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);
}

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

哦,谢谢@Petr。我明白了:)哦,谢谢你@Petr。我明白了:)
context
声明在正在使用的行的正下方。
context
声明在正在使用的行的正下方。