Получение данных из Java-бина для отображения на странице JSP

У меня есть форум, где пользователь может зарегистрировать там детали, и это будет отправлено в сервлет, а затем в Java-бин. У меня проблемы с тем, что я не могу отобразить данные на другой странице JSP, когда запрашивается Java-бин. Таким образом, CreateAccount.jsp позволяет пользователю входить в форум.

Форум публикуется в сервлете (RegisterDetails.java) и отправляет его в Java-бин (Register.java). Затем error.jsp показывает эти данные из бина. Ниже мой код. Текущий код показывает каждое значение как 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);
    }
}

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>

person user3258979    schedule 03.02.2014    source источник
comment
Поскольку вы создаете новый экземпляр RegisterDetails в своем сервлете, тег <jsp:useBean> ничего не стоит. Вы можете безопасно удалить его. Вы можете получить доступ к свойствам bean-компонента, например, ((RegisterDetails)request.getAttribute("details")).getfullName() и то же самое для остальных полей. Условно имена полей ввода должны начинаться со строчной буквы. Кроме того, если вы используете JSTL/EL, вы можете просто получить свойства RegisterDetails, такие как ${details.fullName}, ${details.emailAddress}, ${details.password} и ${details.username}.   -  person Tiny    schedule 04.02.2014


Ответы (2)


Прежде всего, ваш класс RegisterDetails не является bean-компонентом, потому что он не реализует интерфейс java.io.Serializable.

Во-вторых, вам действительно нужно реализовать какую-то очистку ввода для данных, поступающих из запроса (чтобы предотвратить инъекции SQL/HTML/межсайтовых сценариев), и если вы собираетесь использовать bean-компоненты, я думаю, вы должны поместить это внутри bean-компонента сорт.

В-третьих, вы также можете отказаться от концепции компонента (это означает, что вам не понадобится jsp:useBean) и просто сохранить экземпляр класса RegisterDetails как обычный объект класса в сеансе, а затем вы можете извлечь его из сеанса в любой момент. страницу следующим образом:

В сервлете:

 session.setAttribute("details", details); //saving your object to the session

На любой другой странице:

RegisterDetails details = (RegisterDetails)session.getAttribute("details");
person developerwjk    schedule 03.02.2014
comment
Я тоже собирался это предложить. Что-то вроде: HttpSession session = request.getSession(); Детали регистрации = новые детали регистрации(); details.setName(request.getParameter(FullName)); details.setEmail(запрос.getParameter(EmailAddress)); details.setPassword (запрос. GetParameter (Пароль)); details.setUsername(request.getParameter(Username)); session.setAttribute(подробности, подробности); - person John Lee; 04.02.2014
comment
Он уже устанавливает все значения в деталях переменной, но затем сохраняет их в объекте запроса, а не в объекте сеанса. Поэтому он может просто изменить его на сохранение в объекте сеанса. - person developerwjk; 04.02.2014
comment
Поскольку запрос просто перенаправляется (а не перенаправляется с использованием response.sendRedirect()), объект RegisterDetails, хранящийся как атрибут запроса, такой как request.setAttribute("details", details);, может быть доступен для JSP. Не должно быть необходимости хранить его в сеансе. Пожалуйста, не возражайте. - person Tiny; 04.02.2014
comment
Бизнес jsp совсем новый, и я пытаюсь понять, как должны взаимодействовать jsp/servlets/beans, прежде чем перейти к безопасности и использованию базы данных. В любом случае я обновлю свой код, используя атрибут сеанса, так как теперь это работает. Тем не менее, я все еще хотел бы знать, как я все еще мог делать то, что я делал, без сеанса. Спасибо. - person user3258979; 04.02.2014
comment
Если вы не хотите использовать сеанс, продолжайте сохранять bean-компонент в объекте запроса в своем сервлете и перенаправлять в JSP, затем в JSP выполните `RegisterDetails details = (RegisterDetails)request.getAttribute(details);' - person developerwjk; 06.02.2014

developerwjk - хорошая зацепка за то, что bean-компонент не сериализуем, но это не должно вызывать проблемы.

user3258979 - ваш сервлет выглядит нормально. И я вижу, как ваша форма выполняет правильный POST. Вы пытались выполнить трассировку сервлета? Можете ли вы поставить точку останова в этой строке, чтобы подтвердить, что значения запроса проходят:

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

person John Lee    schedule 04.02.2014
comment
Я протестировал его, чтобы вы могли распечатать значения формы из сервлета в консоли. Я также протестировал его, поэтому, если бы я использовал getUsername() из bean-компонента, он также получил бы данные. - person user3258979; 04.02.2014