JSP-javabean返回null,但为什么?

JSP-javabean返回null,但为什么?,java,jsp,servlets,Java,Jsp,Servlets,当用户按下JSP上的登录按钮时,请求被提交到my servlet,它通过getParameter()从登录表单中获取输入的用户名和密码 用户名和密码存储在javabean中。如果我放入一个println()语句,其中显示bean.getUsername()和bean.getPassword()的值,那么它会在日志中打印用户名和密码 但是下面是我的母版页上的代码片段 <jsp:useBean id="bean" class="package.Bean" scope="session" /&g

当用户按下JSP上的登录按钮时,请求被提交到my servlet,它通过
getParameter()
从登录表单中获取输入的用户名和密码

用户名和密码存储在javabean中。如果我放入一个
println()
语句,其中显示
bean.getUsername()
bean.getPassword()
的值,那么它会在日志中打印用户名和密码

但是下面是我的母版页上的代码片段

<jsp:useBean id="bean" class="package.Bean" scope="session" />
<jsp:getProperty name="bean" property="username" />

可能您没有让servlet将bean存储在会话范围中。但是,既然您使用的是servlet,那么就忘了
这件事吧。这在技术上毫无价值。它还将模型与视图紧密耦合

只需让servlet将bean放入会话范围:

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user); // Store logged-in user in session.
    response.sendRedirect("home"); // Redirect to login home page or whatever.
} else {
    request.setAttribute("message", "Unknown login, please try again"); // Store error message for redisplay in login page.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to login page.
}
然后在用户主页中,只需使用EL(表达式语言)访问
user
bean

<p>Welcome, <c:out value="${user.username}" /></p>
欢迎光临

${foo}
基本上是在页面、请求、会话和应用程序范围中搜索以名称
foo
存储的属性,并返回第一个非空值。在本例中,
${user}
将引用存储在会话范围中的
user
bean。
${user.username}
基本上将显示
user.getUsername()
的返回值

顺便说一下,
不是必需的,但它可以防止您的页面受到潜在的XSS攻击

另见:

与具体问题无关,
package
是一个关键字,因此是一个非法的包名。发布过于简单的代码示例时请小心;)如果您想混淆包名,可以使用
com.example
或其他方法



更新:根据您的更新,您正在会话范围中设置用户名,而不是bean本身。即使您可以通过
${username}
来显示它,为了能够使用
${bean.username}
,您需要按照上面的回答相应地修复它。

为您的servlet显示。您是否将bean添加到servlet中的会话范围中?真的吗?我创建了bean对象来存储用户名和密码。困惑。我在会话范围中设置了用户名,但没有看到我的代码与您的代码有什么不同。您试图使用
访问一个bean,而您根本没有将其放入会话范围,因此JSP正在创建一个全新的bean,而不是在会话中重用现有的bean。但毕竟您不需要创建一个新的,所以只需去掉JSP中的这两行,只需使用
${username}
来显示用户名。再次阅读答案(不仅是代码,还包括文本),找出细微的差异和链接,进一步了解所有这些应该如何工作。
<p>Welcome, <c:out value="${user.username}" /></p>