Помещение JavaBean в HttpSession в JSP

Я пытался сделать "простое" приложение об опросе. Где у вас есть некоторые варианты (флажки), а затем результаты (голоса) отображаются на другой странице.

У меня есть этот класс, в котором я могу постоянно хранить результаты (я хочу обновить этот класс, используя HttpSession). Я использовал класс HashMap, но я изменил, я думаю, это не имеет значения:

package beans;
import java.util.ArrayList;
import java.util.List;

public class SurveyBean {

    private List<String> keys;
    private List<String> values;

    public SurveyBean() {
        keys = new ArrayList<String>(); //keys: {"Cat", "Dog", "Other animal"}
        values = new ArrayList<String>(); //Values: {"12","5","4"}
        // By example, a value of 12 means, 12 people like cats.

        keys.add("Cat");
        keys.add("Dog");
        keys.add("Bird");

        // Don't ask me why did I use Strings instead of Integers.
        values.add("0"); // Zero votes 
        values.add("0");
        values.add("0");

    }

    // add one vote to the list of values
    public void addVote( String key, int value ) {
        int index = keys.indexOf(key);
        int newValue = Integer.parseInt(values.get(index)) + value;
        values.set(index, "" + newValue);
    }


    /********* Get and set methods *********/

Теперь это основная форма (jsp), которая пытается поместить JavaBean в сеанс: Примечание: я использую старый синтаксис JSP, потому что я все еще учусь.

<%@page contentType="text/html" session="true" pageEncoding="UTF-8"%>
<!DOCTYPE html>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>
    <!-- Create the JavaBean "SurveyBean" (Scope: session) -->
    <jsp:useBean id="survey" class="beans.SurveyBean" scope="session"  />

    What's your favorite animal ?
    <form action="page2.jsp" method="POST">
        <%
            java.util.List<String> list = survey.getKeys();

            /* It prints:
             * What's your favorite animal? (Bird,Dog,Cat, etc.)    
            */
            for( int i = 0; i < list.size(); i++ ) {
                out.println("<input type=\"radio\" name=\"name\" value=\"" + list.get(i) +"\">" + list.get(i) + "<br>");
            }
        %>

        <input type="submit" value="Send" />
    </form>

</body>

And here's the page for the results:

<%@page import="beans.SurveyBean, java.util.*"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>

    <%

      // getting the checKbox selected
      String name = request.getParameter("name");

      // Trying to get the object survey from the session
      HttpSession ses = request.getSession(false);
      SurveyBean sv = (SurveyBean) request.getAttribute("survey");

      // Add one vote to the list of values
      List<String> keys = sv.getKeys();
      List<String> values = sv.getValues();

      // I can't use the objects "Keys" and "values", because they are marked as Null.
      // Why they are Null !!!! ???

    %>

</body>

The problem here is I can't use the object SurveyBean. I'm not sure if the first page (form) initializes the bean correctly. And I can't get the object from the session.
Note: Sorry, my English is really bad.


person CristianC    schedule 30.12.2012    source источник
comment
Хорошо, вы можете распечатать request.getSession().getId()? я думаю, они отличаются, потому что сеансы не разрешены в вашем браузере.   -  person Grim    schedule 31.12.2012
comment
@ Питер Рейдер. Я получил следующий идентификатор: Идентификатор сеанса: 69f612591dc32c32951afac24d66. Тогда как я могу решить проблему.   -  person CristianC    schedule 01.01.2013
comment
Изменяется ли sessionid, если вы обновляете веб-страницу?   -  person Grim    schedule 01.01.2013
comment
Нет, идентификатор не меняется, если я обновляю веб-страницу. Один вопрос, когда я пишу следующий код: ‹jsp:useBean id=survey class=beans.SurveyBean scope=session /›. Опрос JavaBean доступен для других страниц (или даже сервлетов), где я его использую. Не так ли? ... Как вы думаете, что-то не так с моим кодом? (В любом случае, я попытаюсь сделать пример снова).   -  person CristianC    schedule 01.01.2013
comment
Сначала ваш сеанс (sessioncookies) работает нормально.   -  person Grim    schedule 01.01.2013
comment
Хорошо, ваши вопросы лучше обсудить в чате. Присоединяйтесь к chat.stackoverflow.com/rooms/139/java, я буду там   -  person Grim    schedule 01.01.2013
comment
О, спасибо, Питер. Я решил проблему. (Посмотрите на мой другой ответ). Но спасибо за попытку помочь мне. (Кстати, с Новым годом).   -  person CristianC    schedule 02.01.2013


Ответы (1)


Теперь я решил проблему. В первом jsp, который ставит объект съемки в сессию. Я добавляю эту строку:

request.setAttribute("survey2",survey2);

И на второй странице, которая получает объект, я добавляю еще одну строку:

<%@page contentType="text/html" pageEncoding="UTF-8" session="true"%>

Я предполагаю, что было необходимо добавить атрибут «сессия» в директиву @page.

Изменить: на самом деле это не решение. Я думаю, что это работает, потому что я поместил код в сервлет, например:

PrintWriter out = response.getWriter();
    try {

        //Getting the parameter and the object survey
        String name = request.getParameter("name");
        HttpSession ses = request.getSession(false);
        SurveyBean survey = (SurveyBean) ses.getAttribute("survey");

        // Adding one vote
        survey.addVote(name,1);

        // Forwarding
        ses.setAttribute("survey", survey);
        RequestDispatcher rd = request.getRequestDispatcher("/page2.jsp");
        rd.forward(request, response);

    } finally {            
        out.close();
    }
person CristianC    schedule 01.01.2013