从Java bean获取数据以在JSP页面上显示

3
我有一个论坛,用户可以在那里注册他们的详细信息,这些信息会被发送到一个Servlet,然后是一个Java bean。我遇到的问题是,当请求Java bean时,我无法让数据显示在另一个JSP页面上。因此,CreateAccount.jsp允许用户输入论坛信息。
论坛被发布到一个Servlet(RegisterDetails.java),并将其发送到一个Java bean(Register.java)。然后error.jsp从bean中显示这些数据。以下是我的代码。当前代码将每个值显示为nullRegister.java:
package com.cassandra.MrBlabber.servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Register")
public class Register extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Register() {
        super();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RegisterDetails details = new RegisterDetails();
        details.setName(request.getParameter("FullName"));
        details.setEmail(request.getParameter("EmailAddress"));
        details.setPassword(request.getParameter("Password"));
        details.setUsername(request.getParameter("Username"));
        request.setAttribute("details", details);
        getServletContext().getRequestDispatcher("/WEB-INF/Error.jsp").forward(request, response);
    }
}

RegisterDetails.java:

package com.cassandra.MrBlabber.servlets;

public class RegisterDetails  {
    private String fullName;
    private String emailAddress;
    private String password;
    private String username;

    public RegisterDetails() {}

    public String getName() { return fullName; }
    public String getEmailAddress() { return emailAddress; }
    public String getPassword() { return password; }
    public String getUsername() { return username; }

    public void setName(String value) { this.fullName = value; }
    public void setEmail(String value) { this.emailAddress = value; }
    public void setPassword(String value) { this.password = value; }
    public void setUsername(String value) { this.username = value; }
}

CreateAccount.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" type="text/css" href="/MrBlabber/css/stylesheet.css"/>
<title>MrBlabber/Create an Account</title>
</head>
<body>      
    <!-- Section -->
    <section>
        <!-- Sign Up -->
        <article>
            <div id="articleWrapper">
                <h3>No Account? Sign Up</h3>
                <form id="createAccount" onsubmit="return validateForm();" action="Register" name="createAccount" method="POST">
                    <input type="text" id="name" name="FullName" placeholder="Full Name"/>
                    <input type="text" id="email" name="EmailAddress" placeholder="Email Address"/>
                    <input type="password" id="password" name="Password" placeholder="Create a password"/>
                    <input type="text" id="username" name="Username" placeholder="Choose your username"/>
                    <input type="submit" value="Sign up for MrBlabber"/>
                </form>
            </div>
        </article>

        <article>
            <div id="errorMessage" class="errorMessage">
                <script src="/MrBlabber/javascript/CreateAccountValidation.js" type="text/javascript"></script>
            </div>
        </article>
    </section>
</body>
</html>

Error.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="com.cassandra.MrBlabber.servlets.RegisterDetails" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>shit</h1>

    <jsp:useBean id="RegisterDetails" class="com.cassandra.MrBlabber.servlets.RegisterDetails" scope="session"/>
    <jsp:setProperty name="RegisterDetails" property="*"/>
    <h1>
    Name: <%=RegisterDetails.getName()%><br>
    Email: <%=RegisterDetails.getEmailAddress()%><br>
    Password: <%=RegisterDetails.getPassword()%><br>
    Username: <%=RegisterDetails.getUsername()%><br>
    </h1>
</body>
</html>

由于您在Servlet中创建了RegisterDetails的新实例,因此<jsp:useBean>标记无效。 您可以安全地将其删除。 您可以访问bean的属性,例如 ((RegisterDetails)request.getAttribute("details")).getfullName(),以及其他字段。 传统上,输入字段的名称应以小写字母开头。 此外,如果您使用JSTL / EL,则可以像${details.fullName}${details.emailAddress}${details.password}${details.username}一样简单地获取RegisterDetails的属性。 - Tiny
2个回答

4
首先,你的类RegisterDetails不是一个bean,因为它没有实现java.io.Serializable接口。
其次,你需要对来自请求的数据实施某种输入过滤(以防止SQL/HTML/Cross-site scripting注入),如果你将使用bean,我想你应该将其放在bean类中。
第三,你也可以放弃bean的概念(这意味着你不需要jsp:useBean),只需将RegisterDetails类的实例作为常规类对象保存到会话中,然后你就可以在任何页面上从会话中检索它,如下所示:
在servlet中:
 session.setAttribute("details", details); //saving your object to the session

在任何其他页面上:
RegisterDetails details = (RegisterDetails)session.getAttribute("details");

我也想建议这样做。类似于: HttpSession session = request.getSession(); RegisterDetails details = new RegisterDetails(); details.setName(request.getParameter("FullName")); details.setEmail(request.getParameter("EmailAddress")); details.setPassword(request.getParameter("Password")); details.setUsername(request.getParameter("Username")); session.setAttribute("details", details); - John Lee
他已经在一个变量“details”中设置了所有值,但然后将其保存到请求对象而不是会话对象中。所以他可以改为将其保存在会话对象中。 - developerwjk
由于请求只是被转发(而非使用response.sendRedirect()被重定向),因此像request.setAttribute("details", details);这样存储为请求属性的RegisterDetails对象可以在JSP中使用。不需要将其存储到会话中。请不要介意。 - Tiny
JSP业务对我来说是全新的,我正在尝试理解jsp/servlets/beans在进入安全性和使用数据库之前如何相互作用。无论如何,我将使用会话属性更新我的代码,因为现在它可以工作了。然而,我仍然想知道如果没有会话,我还能以我之前的方式做到什么。谢谢。 - user3258979
如果您不想使用session,则在servlet中将bean保存在请求对象中并转发到JSP,然后在JSP中执行 RegisterDetails details = (RegisterDetails)request.getAttribute("details"); - developerwjk

-2

developerwjk - 对于bean无法序列化的问题,你发现得很好,但这不应该导致问题。

user3258979 - 我认为你的servlet看起来没问题。我可以看到你的表单正在正确地进行POST。你尝试过在servlet上进行跟踪吗?你能否在此行设置断点以确认请求值是否传递:

details.setName(request.getParameter("FullName"));


我已经测试过了,你可以在控制台中打印出servlet表单的值。我还测试过了,如果我从bean中使用getUsername()方法,也能获取到数据。 - user3258979

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接