【问题标题】:Why method in Java servlet class return null when called from another java servlet or java class?为什么从另一个 java servlet 或 java 类调用 Java servlet 类中的方法时返回 null?
【发布时间】:2019-07-15 06:50:22
【问题描述】:

我有两个 Java Servlet Organization1 和 Organization2。我已将 Organization1 的响应值保存到一个名为 org1 的全局变量中。然后我在 Organization1 中创建了一个方法 getOrg1Name(),它返回保存在该全局变量 org1 中的值。请检查以下代码:

   public class Organization1 extends HttpServlet {

    private String org1;

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

        this.org1 = request.getParameter("org1_name");

}
    public String getOrg1Name()
    {
        return this.org1;
    }

} 然后在我创建了第二个 servlet Organization2 之后。在 Organization2 的 doPost() 方法中,我创建了 Organization1 的一个实例,这样我就可以调用该方法 getOrg1Name(),它返回保存在全局变量 org1 中的值。请检查以下代码:

    public class Organization2 extends HttpServlet {

        private String org2;

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

            this.org2 = request.getParameter("org2_name");

            Organization1 organization1 = new Organization1();
            String org1 = organization1.getOrg1Name();

            // org1 is always null. Why??   
    }
    }

但是每次方法 getOrg1Name() 都返回 null。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 在这种情况下,“全局变量”是什么意思?看起来您正在使用第一个 servlet 类的字段(实例变量),在这种情况下,您无法从另一个实例中检索它也就不足为奇了。
  • 不要在 servlet 中使用字段,尤其是全局变量。因为多个用户可以同时运行 servlet。例如,您可以将内容存储在用户的 session 中。
  • 就我们所知,有一个 if (isEven(getRandomNumber()) { return null; } return "5"; 在那里。我们怎么知道?
  • 此外,您永远不应该创建 servlet 类的实例。 Servlet 实例只能由 servlet 容器管理。
  • 我已经添加了代码。请立即检查。

标签: java servlets


【解决方案1】:

在您的情况下,Organization1 中的字段 org1 不是全局变量 - 它是 Organization1 类的私有字段。这意味着当您创建 Organization1 字段的新实例时,org1 被设置为其默认值。 String 的默认值为 null。

如果您希望一切按照我认为的方式工作,您必须将字段 org1 声明为静态。

private static String org1;

在这种情况下,Organization1 类的所有实例都将具有指向一个 org1 实例的链接。

但是,这种方法有一个问题。对 servlet Organization1 的每个请求都会重写字段 org1 的值。因此,了解静态字段的工作原理是一项很好的任务,但在实际编程中会产生代码异味。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2012-07-05
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多