Servlets 在servlet外部将类变量设置为null

Servlets 在servlet外部将类变量设置为null,servlets,jdbc,Servlets,Jdbc,我编写了一个简单的servlet,在doPost中,我从一个JS获取用户名和密码,并通过将用户输入的密码发送到数据库(mysql)对用户进行身份验证。我正确地获取了数据,并将用户重定向到另一个名为welcome.jsp的jsp页面 我的问题是,我编写了这个方法公共字符串getUser(){return userNmae;};我把它放在dopost方法之外,但是它返回null。我已将变量userNmae声明为类变量,并且在调试时,该变量在dopost方法中包含一个值,但在dopost方法之外该变量

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

我的问题是,我编写了这个方法公共字符串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;
    }

}

我将通过给您一个简单的示例来回答您的代码实际在做什么:

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

Bottle bottle2 = new Bottle();
System.out.println(bottle2.getMessage());
您希望此程序显示什么?我希望
null
,因为您在瓶子1上设置了一条消息,然后从瓶子2读取消息。这是两个不同的瓶子。当你把信息放在瓶子里时,信息就在那个瓶子里,而不是其他瓶子里

你的代码做同样的事情

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

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

  • 您介意在这里发布您的jsp和servlet吗?您到底如何从jsp调用getUser()?您是否意识到servlet的一个实例正在为来自所有用户的所有请求提供服务?当前用户应该存储在HTTP会话中,而不是servlet中。这就是我如何调用方法welcome非常感谢您的帮助,我正在学习Jsp和servlet,但仍然不知道很多事情。我非常感谢你的评论。
    <c:out value="${userName}"/>