类变量在servlet外部设置为null

时间:2014-02-22 12:14:40

标签: servlets jdbc

我写了一个简单的servlet,在doPost中我从jspand获得了用户名和密码,通过将用户输入的密码发送到数据库(mysql)来验证用户。我正确地获取了数据,并且我将用户重定向到另一个名为welcome.jsp的jsp页面。

我的问题是,我写了这个方法public String getUser(){return userNmae;};我把它放在dopost方法之外,但它返回null。我已经将变量userNmae声明为类变量,当我调试时,变量在dopost方法中包含一个值,但在dopost方法之外它是null。为什么它在dopost方法之外是null?

我在welcome.jsp页面中调用了getUser()方法。 这是我的代码

public class UIclass extends HttpServlet {
    public UIclass() { };
    private String passWord = null;
    private String userNmae = null;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("userName");
        String password = request.getParameter("password");
        Connection connection = null;

        try {
            connection = Connections.getConnection();
            java.sql.PreparedStatement statement = connection.prepareStatement("SELECT PASSWORD,USERNAME FROM LOGIN where username =?");
            statement.setString(1, name);
            ResultSet resultset = statement.executeQuery();
            while (resultset.next()) {
                passWord = resultset.getString("PASSWORD");
                userNmae = resultset.getString("USERNAME");
            }

        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            if (connection != null)
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                };
        }

        if (passWord.equalsIgnoreCase(password)) {
            RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");
            rd.forward(request, response);

        }

    }

    public String getUser() {

        return userNmae;
    }

}

1 个答案:

答案 0 :(得分:0)

我将通过向您提供代码实际执行情况的更简单示例来回答:

Bottle bottle1 = new Bottle();
bottle1.setMessage("Hi there");

Bottle bottle2 = new Bottle();
System.out.println(bottle2.getMessage());

您希望此程序显示什么?我期待null,因为你在bottle1上设置了一条消息,并从bottle2读取消息。这是两个不同的瓶子。当你在瓶子里放一条信息时,信息就在那个瓶子里,而不是在其他瓶子里。

你的代码做同样的事情。

  1. servlet容器创建UIclass的实例(唯一)。这相当于在我的示例中创建第一个瓶子。
  2. 发送HTTP请求时调用servlet。它在servlet中设置用户属性。这相当于我的示例中的bottle1.setMessage("Hi there")
  3. 容器执行JSP,其中包含代码

    <jsp:useBean id="uiclass" class="com.servlet.UIclass" scope="request">
    

    这将创建一个新的UIClass实例。它相当于在我的例子中创建第二个瓶子。

  4. JSP调用uiclass.getUser()。这相当于在我的示例中从第二个瓶子获取消息。
  5. 您的代码中存在许多错误:

    1. 您不应该使用scriptlet和jsp:useBean标记
    2. 您永远不应该自己创建servlet实例。 servlet旨在实现并由容器调用。
    3. 您应该意识到调用一个唯一的servlet实例来同时为这个servlet URL提供所有用户的所有请求。因此,在servlet属性中存储用户特定数据是非常错误的
    4. 您可能希望用户名可用于此用户的所有后续请求。这就是HTTP会话的用途。您应该将用户存储为HTTP会话的属性:request.getSession().setAttribute("userName", userName)
    5. JSP应该使用JSP ELJSTL来访问servlet中存储在请求或会话中的bean:

      <c:out value="${userName}"/>