从JavaBean获取要在JSP页面上显示的数据
我有一个论坛,用户可以在那里注册详细信息,然后发送到Servlet和Javabean。我遇到的问题是,当请求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
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(),它也会得到数据。