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

时间:2011-02-20 16:28:18

标签: java jsp servlets

当用户按下JSP上的登录按钮时,请求将提交给我的servlet,后者通过getParameter()从登录表单中获取输入的用户名和密码。

用户名和密码存储在javabean中。如果我输入显示println()bean.getUsername()值的bean.getPassword()语句,则会在日志中输入用户名和密码。

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

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

显示null而不是用户名。我做错了什么?

protected void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException
{
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    // Store username and password in bean from login.jsp
    Bean bean = new bean();
    bean.setUsername(username);
    bean.setPassword(password);

    // check login details with database

       if (login success)
    {   
        HttpSession session = request.getSession();
        session.setAttribute("username", username);

        // redirect user to welcome page
    }
    else
        // login failed
}

1 个答案:

答案 0 :(得分:2)

可能你没有让servlet将bean存储在会话范围内。但是既然你正在使用servlet,那就忘记<jsp:useBean>了。它在技术上毫无价值。它还将模型与视图紧密结合在一起。

让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()的返回值。

<c:out>不是必需的,但会阻止您的网页遭受潜在的XSS攻击。

另见:


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


更新:根据您的更新,您在会话范围内设置用户名,而不是bean本身。即使您可以${username}显示它,但为了能够使用${bean.username},您需要相应地修改它,如上面的答案中所述。