当用户按下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
}
答案 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}
,您需要相应地修改它,如上面的答案中所述。