从JavaBean获取要在JSP页面上显示的数据

从JavaBean获取要在JSP页面上显示的数据,jsp,servlets,usebean,Jsp,Servlets,Usebean,我有一个论坛,用户可以在那里注册详细信息,然后发送到Servlet和Javabean。我遇到的问题是,当请求JavaBean时,我无法在另一个JSP页面上显示数据。因此,CreateAccount.jsp允许用户在论坛中输入内容 论坛被发布到一个Servlet(RegisterDetails.java)并将其发送到一个Javabean(Register.java)。然后error.jsp显示来自bean的数据。下面是我的代码。当前代码将每个值显示为null Register.java: pack

我有一个论坛,用户可以在那里注册详细信息,然后发送到Servlet和Javabean。我遇到的问题是,当请求JavaBean时,我无法在另一个JSP页面上显示数据。因此,
CreateAccount.jsp
允许用户在论坛中输入内容

论坛被发布到一个Servlet(
RegisterDetails.java
)并将其发送到一个Javabean(
Register.java
)。然后
error.jsp
显示来自bean的数据。下面是我的代码。当前代码将每个值显示为
null

Register.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);
    }
}
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; }
}
RegisterDetails.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);
    }
}
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>

首先,您的类
RegisterDetails
不是bean,因为它没有实现
java.io.Serializable
接口

其次,您确实需要对来自请求的数据实施某种输入净化(以防止SQL/HTML/跨站点脚本注入),如果您要使用bean,我想您应该将其放在bean类中

第三,您还可以省去bean概念(这意味着您不需要jsp:useBean),只需将类RegisterDetails的实例作为常规类对象保存到会话中,然后您可以在任何页面上从会话中提取它,如下所示:

在servlet中:

 session.setAttribute("details", details); //saving your object to the session
在任何其他页面中:

RegisterDetails details = (RegisterDetails)session.getAttribute("details");

developerwjk-很好地抓住了bean不可序列化的问题,但这不应该引起问题

user3258979-我觉得您的servlet看起来不错。我可以看到你的表格写得很好。您是否尝试过在servlet上进行跟踪?您能否在此行上设置断点以确认请求值是否通过:


details.setName(request.getParameter(“全名”)

我也打算提出这个建议。类似于:HttpSession session=request.getSession();RegisterDetails=新的RegisterDetails();details.setName(request.getParameter(“全名”);setEmail(request.getParameter(“EmailAddress”);setPassword(request.getParameter(“密码”));setUsername(request.getParameter(“用户名”));session.setAttribute(“详细信息”,详细信息);他已经在一个变量details中设置了所有的值,但随后将其保存在request对象而不是session对象中。因此,他可以更改为将其保存在会话对象中。由于请求只是转发(而不是使用
response.sendRedirect()
)重定向,
RegisterDetails
的对象存储为请求属性,如
request.setAttribute(“详细信息”,详细信息)可供JSP使用。不需要将其存储到会话中。请不要介意,jsp业务是全新的,我正在尝试了解jsp/servlets/beans在进入安全性和使用数据库之前是如何进行交互的。无论如何,我将使用session属性更新我的代码,因为它现在可以工作了。然而,我仍然想知道,我如何能够在不进行训练的情况下仍然像以前那样做。谢谢。如果您不想使用会话,请将bean保存在servlet中的请求对象中并转发到JSP,然后在JSP中执行`RegisterDetails=(RegisterDetails)request.getAttribute(“details”);'由于您正在Servlet中创建一个新的
RegisterDetails
实例,
标记一文不值。您可以安全地将其移除。您可以访问bean的属性,例如,
((RegisterDetails)request.getAttribute(“details”).getfullName()
,以及其他字段的属性。按照惯例,输入字段的名称应以小写字母开头。另外,如果您使用JSTL/EL,那么您可以简单地获得
RegisterDetails
的属性,比如
${details.fullName}
${details.emailAddress}
${details.password}
${details.username}
。我已经对它进行了测试,以便您能够从控制台中的servlet打印表单的值。我还对它进行了测试,因此如果我从bean中使用getUsername(),它也会得到数据。