Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF, передача значений множества select-ов 
V
    Опции темы
3,14
Дата 4.3.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Такая ситуация, есть форма на к-ой может располагаться произвольное кол-во select-ов (h:selectOneMenu). У каждого select-А должен быть свой уникальный числовой id. Как правильно средаствами JSF передать все эти значения с формы в actionListener? И соотвественно как в нём их получить?


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
fics
Дата 4.3.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 21.2.2008
Где: Луганск

Репутация: нет
Всего: нет



Ceйчас может быть запинают но все же, могу подсказать как в JSP делаеться:
к примеру
<select name="sel">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<select>


String[] option = requestgetparameterValues("sel")
--------------------
Ушел на пары
PM MAIL   Вверх
ivg
Дата 4.3.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



3,14, Value Binding ? smile
Например через Map (т. е. в бине mybean поле допустим selvalues типа Map<String, String>), а на странице:
Код

<h:selectOneMenu value="${mybean.selvalues['select1']}" ... >
  ...
</h:selectOneMenu>


Это сообщение отредактировал(а) ivg - 4.3.2008, 17:41
PM MAIL   Вверх
3,14
Дата 5.3.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Всё равно что то не поулчилось, вот что у меня есть:
Код

                    <tr jsfc="ui:repeat"  value="#{boxBean.configList}" var="box">
                        <td>#{box.descr}:</td>
                        <td>
                            <h:selectOneMenu required="true" value="#{configBean.addressesId[box.id]}">
                                <f:selectItem itemValue="0" itemLabel="None" />
                                <c:forEach items="#{ipBean.addresses}" var="addr">
                                    <f:selectItem itemValue="#{addr.id}" itemLabel="TLan: #{addr.tlanIp} ELan: #{addr.elanIp}" />
                                </c:forEach>
                            </h:selectOneMenu>
                        </td>
                    </tr>

Те селекты выводятся внутри цикла, и id-ком для Map должен быть id перебираемого элемента. Те есть ряд боксов, для каждого из них будет выбираться ip-ник. Но не работает.
Код

    public void save(ActionEvent event) {
        ConfigBean cfg = (ConfigBean) getFromRequest(ConfigBean.bname);
        Map<String, String> adresses = cfg.getAddressesId();
        Iterator<String> keys = adresses.keySet().iterator();
        while (keys.hasNext()) {
            String key = keys.next();
            String val = adresses.get(key);
            System.out.println("BOX ID: " + key + ", IP ID: " + val);
        }
    }

Map-а в bean-е не оказывается. Метод getAddressesId возвращает null. :(


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 5.3.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Да, чуть не забыл:
Код

    public static Object getFromRequest(String name) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(name);
    }



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 10.3.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(3 @ 14, 5.3.2008,  14:18 Найти цитируемый пост)
Map-а в bean-е не оказывается. Метод getAddressesId возвращает null. :(

А что не попробовали создать инстанс Map в конструкторе бина? JSF сам его не создает.
Тип ключа для Map<>, должен соответствовать типу box.id, правда я не уверен что вот такая конструкция сработает
Цитата(3 @ 14, 5.3.2008,  14:18 Найти цитируемый пост)

Код

<h:selectOneMenu ... value="#{configBean.addressesId[box.id]}">
    ....
</h:selectOneMenu>


, хотя по идее должна. Надо пробовать.
PM MAIL   Вверх
3,14
Дата 10.3.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



ivg, имено такая конструкция и не работает. Добавлю ещё что там проблемы с использованием тэга ui:repeat, данные не передаются. Вместо этого нужно использовать c:forEach. Но вот проблема с тем что индексация не работает осталась... (


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 10.3.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



а 
Код

<tr jsfc="ui:repeat"  value="#{boxBean.configList}" var="box">

на
Код

<h:dataTable ...>

заменить не пробовали?
Вроде ничего не мешает.
PM MAIL   Вверх
3,14
Дата 11.3.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



С dataTable всё отображается нормально, но тоже не работает, как и с forEach  smile 
Добавляем на форму:
Код

<h:dataTable value="#{boxBean.configList}" var="box">
  <h:column>
    <f:facet name="header">
    #{box.descr}
    </f:facet>
    <h:selectOneMenu required="true" value="#{configBean.test[box.id]}">
    <f:selectItem itemValue="0" itemLabel="None" />
    <c:forEach items="#{ipBean.addresses}" var="addr">
        <f:selectItem itemValue="#{addr.id}" itemLabel="TLan: #{addr.tlanIp} ELan: #{addr.elanIp}" />
    </c:forEach>
    </h:selectOneMenu>
  </h:column>
</h:dataTable>

Все селекты отбражаются нормально.

В обработчике:
Код

ConfigBean cfg = (ConfigBean) getFromRequest(ConfigBean.bname);
Map<String, String> test = cfg.getTest();
Iterator<String> ikeys = test.keySet().iterator();
while (ikeys.hasNext()) {
    String key = ikeys.next();
    String val = test.get(key);
    System.out.println("ID: " + key + ", val: " + val);
}

В лог не валится никаких значений :( Впрочем и ошибок тоже...


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 13.3.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



В чём проблема я кажется понял. Рзбор EL выражения для binding-а (#{configBean.test[box.id]}) происходит после нажатия на кнопку Save на форме, а не при создании формы. Поэтому ни о каких bean-ах обьявленных циклом forEach или dataTable (в данном случае box) он знать не знает :(
Но вот как решить проблему так и не понятно :(


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 13.3.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Нашёл время попробовать ваш пример  smile
Могу сказать, что у меня первый вариант с jsfc="ui:repeat" работает так как надо. Похоже проблема у вас в чём то другом.
В версиях библиотек, каких то конфиг параметрах, ....
Я использовал JSF Sun RI 1.2, faselets 1.1.12, Tomcat 6, JVM 6.0, дебажил из под Eclipse 3.3 с WTP.
На всякий случай запощу сюда несколько файликов:
web.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>wwwtest</display-name>
  
  <!-- Context Parameters -->
  <context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
  </context-param>

  <context-param>
    <param-name>facelets.REFRESH_PERIOD</param-name>
    <param-value>2</param-value>
  </context-param>
  
  <context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
  </context-param>
  
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  
  <context-param>
    <param-name>com.sun.faces.validateXml</param-name>
    <param-value>true</param-value>
  </context-param>
  
  <context-param>
    <param-name>com.sun.faces.verifyObjects</param-name>
    <param-value>true</param-value>
  </context-param>
  
  <!-- Servlets -->
  <servlet id="Fases_Servlet">
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
  <!-- Servlets Mapping -->
  
  <servlet-mapping id="ServletMapping_Faces_Servlet">
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
 
  <!-- Session Config -->
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  
</web-app>

faces-config.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">

  <managed-bean>
    <managed-bean-name>boxBean</managed-bean-name>
    <managed-bean-class>com.mycompany.myapp.BoxBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  
  <managed-bean>
    <managed-bean-name>configBean</managed-bean-name>
    <managed-bean-class>com.mycompany.myapp.ConfigBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  
  <managed-bean>
    <managed-bean-name>ipBean</managed-bean-name>
    <managed-bean-class>com.mycompany.myapp.IPBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  
  <!-- Application -->
  <application>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
    <locale-config>
      <default-locale>ru</default-locale>
      <supported-locale>en</supported-locale>
      <supported-locale>ru</supported-locale>
    </locale-config>
  </application>
</faces-config>

Страница index.xhtml
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:c="http://java.sun.com/jstl/core">
  
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title><h:outputText value="wwwwww: " /></title>
  </head>
<body bgcolor="#ffffff" style="margin: 0px 0px 0px 0px;">
<h:form>
  <table style="border: 1px solid #CAD6E0;" align="center"
    cellpadding="0" cellspacing="0" border="0">
    <tbody>
      <tr jsfc="ui:repeat"  value="#{boxBean.configList}" var="box">
        <td>#{box.descr}:</td>
        <td>
          <h:selectOneMenu required="true" value="#{configBean.addressesId[box.id]}">
            <f:selectItem itemValue="0" itemLabel="None" />
            <c:forEach items="#{ipBean.addresses}" var="addr">
              <f:selectItem itemValue="#{addr.id}" itemLabel="TLan: #{addr.tlanIp} ELan: #{addr.elanIp}" />
            </c:forEach>
          </h:selectOneMenu>
        </td>
      </tr>
    </tbody>
  </table>
  <h:commandButton value="Submit" actionListener="#{boxBean.save}" />
</h:form>
  <h:messages />
  <ui:debug hotkey="q"/>
</body>
</html>

com.mycompany.myapp.ConfigBean .java:
Код

package com.mycompany.myapp;

import java.util.HashMap;
import java.util.Map;

import javax.faces.event.ActionEvent;

public class ConfigBean {

    private Map<Integer, String> addressesId = new HashMap<Integer, String>();

    public Map<Integer, String> getAddressesId() {
        return addressesId;
    }

    public void setAddressesId(Map<Integer, String> addressesId) {
        this.addressesId = addressesId;
    }

    public void save(ActionEvent ev) {
        for (Integer key : this.addressesId.keySet()) {
            String val = this.addressesId.get(key);
            System.out.println("BOX ID: " + key + ", IP ID: " + val);
        }
    }
}

PM MAIL   Вверх
3,14
Дата 13.3.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Подожди, что то я не совсем понял, вроде как метод save у вызывается для boxBean, а реализация написанна в configBean????


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 13.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



м-да, проблема и не в библиотеках. сделал отдельно этот же пример, работает, буду копать что не так в основном коде...


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 13.3.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



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

    <tr jsfc="ui:repeat"  value="#{boxBean.configList}" var="box">
      <td>#{box.descr}:</td>
      <td>
        <h:selectOneMenu required="true" value="#{configBean.addressesId[box.id]}">
          <f:selectItem itemValue="0" itemLabel="None" />
          <c:forEach items="#{ipBean.addresses}" var="addr">
            <f:selectItem itemValue="#{addr.id}" itemLabel="TLan: #{addr.tlanIp} ELan: #{addr.elanIp}" />
          </c:forEach>
        </h:selectOneMenu>
      </td>
    </tr>

А теперь самое интересное, при этой ф-ии для boxBean.configList всё равботает и данные передаются:
Код

    public List<BoxBean> getConfigList() {
        List<BoxBean> boxes = new Vector<BoxBean> ();
        for(int i = 0; i < 5; i++) {
            boxes.add(new BoxBean(i, i, i, "box_" + i));
        }
        return boxes;
    }

А вот для этого отображаются правильно, но не передаются:
Код

    public List<BoxBean> getConfigList() {
        List<BoxBean> boxes = new Vector<BoxBean> ();
        try {
            String sql = "SELECT * FROM em_boxes WHERE config_id=?";
            PreparedStatement stmt = DBConnectionProvider.getPreparedStatement(sql);
            stmt.setInt(1, configId);
            ResultSet data = stmt.executeQuery();
            while (data.next()) {
                boxes.add(new BoxBean(data.getInt("id"),
                                      data.getInt("ip_id"),
                                      data.getInt("config_id"),
                                      data.getString("descr")));
            }
            data.close();
            stmt.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return boxes;
    }


 smile  smile  smile 


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 13.3.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(3 @ 14, 13.3.2008,  15:51 Найти цитируемый пост)
Подожди, что то я не совсем понял, вроде как метод save у вызывается для boxBean, а реализация написанна в configBean????

Ну класс для boxBean  приводить не стал, там код для save() полностью ваш.
Что касается последних непоняток, то попробую предположить, что в классе BoxBean перепутаны id и, допустим, config_id. Например в вызываемом конструкторе, или геттер для id возвращает значение config_id. В этом случае, в интересующей нас Map'е окажется всего одно значение, вместо нескольких. По сути, приведённые реализации метода getConfigList(), отличаются только значениями параметров конструктора BoxBean(). В первом случае, для всех элементов вектора они разные, а во втором значение config_id одно.
Если мое предположение не верное, тогда покажите код класса BoxBean что ли.
Интересуют конструкторы, геттеры/сеттеры, equals(), hashCode().

И вот значение configId из 6 строки второй реализации, когда изменяется и при каких условиях?

Это сообщение отредактировал(а) ivg - 13.3.2008, 22:57
PM MAIL   Вверх
3,14
  Дата 14.3.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



ivg, нет, там что то не то, и совсем не понятное. Вот так работает (кусок из getConfigList):
Код

            String sql = "SELECT * FROM em_boxes WHERE config_id=?";
            PreparedStatement stmt = DBConnectionProvider.getPreparedStatement(sql);
            stmt.setInt(1, configId);
            ResultSet data = stmt.executeQuery();
            for(int i = 0; data.next(); i++) {
            }
            for(int i = 0; i < 1; i++) {
                boxes.add(new BoxBean(i, i, i, "box_" + i));
            }
            data.close();
            stmt.close();

Вот так не работает:
Код

            String sql = "SELECT * FROM em_boxes WHERE config_id=?";
            PreparedStatement stmt = DBConnectionProvider.getPreparedStatement(sql);
            stmt.setInt(1, configId);
            ResultSet data = stmt.executeQuery();
            for(int i = 0; data.next(); i++) {
                boxes.add(new BoxBean(i, i, i, "box_" + i));
            }
            data.close();
            stmt.close();

Причём в обоих случаях bean создаётся, и создатся ровно один bean. В обоих случаях select-ы отображаются, но при первом варианте данные передаются на сервер (кусок лога):
Цитата

12:02:07,827 INFO  [STDOUT] ========= save
12:02:07,843 INFO  [STDOUT] BOX ID: 0, IP ID: 2
12:02:07,843 INFO  [STDOUT] ========= /save

а во втором нет
Цитата

12:07:38,674 INFO  [STDOUT] ========= save
12:07:38,674 INFO  [STDOUT] ========= /save



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 14.3.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(ivg @  13.3.2008,  22:47 Найти цитируемый пост)
И вот значение configId из 6 строки второй реализации, когда изменяется и при каких условиях?

Тогда вот с этим вариантом вопрос остаётся. В процессе обработки запроса метод getConfigList() вызывается несколько раз на разных фазах и каждый раз идёт обращение к БД. Проверьте под отладчиком, например, что каждый раз возвращаются одни и те же данные. А вообще если у вас bean request scope, может имеет смысл в бине хранить List<BoxBean> boxes, а не ходить в БД каждый раз.
PM MAIL   Вверх
3,14
Дата 17.3.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Действиетльно метож вызывается 2 раза, с первым всё понятно, он вызывается при создании таблицы. Там всё отрабатывает правильно. Но зачем он вызывается второй раз, при нажатии кнопки save (там то как раз configId не выставляется). Формы, на к-ой выводятся select-ы, после нажатия save уже не отображается. Да и configBean там уже другой используется, список в классе не сохранишь :(


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 17.3.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(3 @ 14, 17.3.2008,  12:45 Найти цитируемый пост)
Действиетльно метож вызывается 2 раза

По идее, должен больше. В процессе обработки одного запроса почти на каждой фазе, а их там штук 6, если мне память не изменяет.
Цитата(3 @ 14, 17.3.2008,  12:45 Найти цитируемый пост)
Но зачем он вызывается второй раз, при нажатии кнопки save (там то как раз configId не выставляется)

Кстати говоря, это уже другой запрос, и следовательно объекты reques scope бинов тоже уже другие.
А вызывается он каждый раз, потому что JSF не хранит данные, она работает только с информацией о биндинге (Что то типа ссылки на значение) т. е. value="#{boxBean.configList}", и каждый раз когда данные необходимы этот биндинг резолвится. (Ссори за корявое выражение, лучше не придумал  smile ). Ну естественно, если на фазе UPDATE_VALUES, или как там её, List<BoxBean> возвращается пустой никакого update values не происходит.

Ну вобщем проблема ясна. Сложно предложить какое то решение, ибо специфика не известна.
Как насчёт, вынести переменную configId в session scope?
Ну и 
Цитата(ivg @  14.3.2008,  12:52 Найти цитируемый пост)
может имеет смысл в бине хранить List<BoxBean> boxes, а не ходить в БД каждый раз.

а данные получать при первом вызове (lazy loading).

Это сообщение отредактировал(а) ivg - 17.3.2008, 13:19
PM MAIL   Вверх
3,14
Дата 17.3.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Не помогло :( Сделал срок жизни boxBean-у: session, список сделал членом класса. Один фиг, когда запрашивает configList второй раз, список оказывается пустым:
Код

    public List<BoxBean> getConfigList() {
        System.out.print("====== getConfigList");
        if (boxes == null || boxes.size() == 0) {
            System.out.print("if");
            boxes = new Vector<BoxBean> ();
            try {
                String sql = "SELECT * FROM em_boxes WHERE config_id=?";
                PreparedStatement stmt = DBConnectionProvider.getPreparedStatement(sql);
                stmt.setInt(1, configId);
                ResultSet data = stmt.executeQuery();
                for(int i = 0; data.next(); i++) {
                    System.out.print("creating bean");
                    boxes.add(new BoxBean(i, i, i, "box_" + i));
                    System.out.print("bean created");
                }
                data.close();
                stmt.close();
            } catch(Exception e) {
                e.printStackTrace();
            }
            System.out.print("/if");
        }

        System.out.print("====== /getConfigList");
        return boxes;
    }


Вот что вывалилось в лог:
Цитата

16:47:27,425 INFO  [STDOUT] ====== getConfigList
16:47:27,425 INFO  [STDOUT] if
16:47:27,441 INFO  [STDOUT] creating bean
16:47:27,441 INFO  [STDOUT] bean created
16:47:27,441 INFO  [STDOUT] /if
16:47:27,441 INFO  [STDOUT] ====== /getConfigList
16:47:30,644 INFO  [STDOUT] ====== getConfigList
16:47:30,707 INFO  [STDOUT] if
16:47:30,707 INFO  [STDOUT] /if
16:47:30,707 INFO  [STDOUT] ====== /getConfigList

Список, кроме как в этой ф-ии, нигде больше не изменяется.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 17.3.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(3 @ 14, 17.3.2008,  16:54 Найти цитируемый пост)
Сделал срок жизни boxBean-у: session

Уверены? Добавьте в начало метода
Код

System.out.println("boxBean identity hash code: " + System.identityHashCode(this));

Если значения будут разные при обоих вызовах, значит объекты бинов тоже разные. Тогда этим и объясняется, почему при втором вызове метода поле boxes == null.
Вот ещё, кстати, я кажется понял, почему всего два раза этот метод вызывается. У вас на кнопке save установлен атрибут immediate="true" и action="...", который перенаправляет на другую страницу?
Уберите immediate="true". Потому что иначе обработка запроса не дойдёт до фазы UPDATE_MODEL_VALUES, в которой значения в интересующей нас Map<...> и обновляются.

PM MAIL   Вверх
3,14
Дата 18.3.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Объекты бинов разные, но почему не понятно :( Как же там сохранять список, если метод вызывается для разных объектов...  smile 
Кнопку save изменил:
Код

      <h:commandButton actionListener="#{configBean.save}" value="Save" />

Тоже не помогло...  smile 



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 18.3.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(3 @ 14, 18.3.2008,  12:50 Найти цитируемый пост)
Объекты бинов разные, но почему не понятно

Вот, вот...
Покажите faces-config.xml.
Что за контейнер (или апп-сервер)?
В браузере кукисы включены?

Это сообщение отредактировал(а) ivg - 18.3.2008, 13:04
PM MAIL   Вверх
3,14
Дата 18.3.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



faces-config.xml:
Код

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">

   <!-- from project setup -->
   <application>
     <view-handler>
       com.sun.facelets.FaceletViewHandler
     </view-handler>    
   </application>
   
   <managed-bean>
    <managed-bean-name>
    ipBean</managed-bean-name>
    <managed-bean-class>
    com.nortelnetworks.beans.ip.IpBean</managed-bean-class>
    <managed-bean-scope>
    request</managed-bean-scope>
   </managed-bean>
   <managed-bean>
    <managed-bean-name>
    ipManagerBean</managed-bean-name>
    <managed-bean-class>
    com.nortelnetworks.beans.ip.IpManagerBean</managed-bean-class>
    <managed-bean-scope>
    request</managed-bean-scope>
   </managed-bean>
   <managed-bean>
    <managed-bean-name>
    configBean</managed-bean-name>
    <managed-bean-class>
    com.nortelnetworks.beans.config.ConfigBean</managed-bean-class>
    <managed-bean-scope>
    request</managed-bean-scope>
   </managed-bean>
   <managed-bean>
    <managed-bean-name>
    configManagerBean</managed-bean-name>
    <managed-bean-class>
    com.nortelnetworks.beans.config.ConfigManagerBean</managed-bean-class>
    <managed-bean-scope>
    request</managed-bean-scope>
   </managed-bean>
   <managed-bean>
    <managed-bean-name>
    boxBean</managed-bean-name>
    <managed-bean-class>
    com.nortelnetworks.beans.config.BoxBean</managed-bean-class>
    <managed-bean-scope>
    session</managed-bean-scope>
   </managed-bean>

</faces-config>


контейнер: jboss-4.2.0.GA
куки включенны.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 18.3.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



с tomcat 6 та же проблема.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 18.3.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Даа, интересно... Что ж с сессиями то... Как я понимаю, это вроде единственная нерешённая проблема?
Может вы выложите проект? А то что то ходим всё вокруг да около....
Ну или хотя бы покажите код класса com.nortelnetworks.beans.config.BoxBean, web.xml, context.xml (если есть), ну и какие там у вас конфиги...
Версия JSF? Чья имплементация?
PS: В List<BoxBean> boxes класс BoxBean это то же самое что и com.nortelnetworks.beans.config.BoxBean?
PM MAIL   Вверх
3,14
Дата 19.3.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Цитата(ivg @  18.3.2008,  18:54 Найти цитируемый пост)
Как я понимаю, это вроде единственная нерешённая проблема?

Да

Цитата(ivg @  18.3.2008,  18:54 Найти цитируемый пост)
Может вы выложите проект? А то что то ходим всё вокруг да около....

Прикрепил к сообщению, вырезал только jar-ы, и файлы БД чтоб архив меньше места занимал.

Цитата(ivg @  18.3.2008,  18:54 Найти цитируемый пост)
Версия JSF? Чья имплементация?

Библиотеки для JSF идут вместе с jboss.
jsf-api.jar 
Specification-Version: 1.2MR1
Implementation-Vendor-Id: com.sun
Extension-Name: javax.faces
Implementation-Version: 1.2_04-b10-p01
Implementation-Vendor: Sun Microsystems, Inc. 

jsf-impl.jar 
Specification-Version: 1.2MR1
Implementation-Vendor-Id: com.sun
Extension-Name: com.sun.faces
Implementation-Version: 1.2_04-b10-p01
Implementation-Vendor: Sun Microsystems, Inc.

jboss-faces.jar
Specification-Version: 4.2.0.GA
Implementation-Vendor-Id: http://www.jboss.org/
Implementation-Version: 4.2.0.GA (build: SVNTag=JBoss_4_2_0_GA date=20
 0705111440)
Implementation-Vendor: JBoss Inc.


Ещё используется (не jboss-кий jar, включаю в приложение): jsf-facelets
Created-By: 1.5.0_09-b03 (Sun Microsystems Inc.)
Implementation-Version: 1.1.13



Цитата(ivg @  18.3.2008,  18:54 Найти цитируемый пост)
PS: В List<BoxBean> boxes класс BoxBean это то же самое что и com.nortelnetworks.beans.config.BoxBean? 

Да


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  prj.zip 41,10 Kb


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 20.3.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Разобрался. Хотя bean scope я обьявил как session, но этот bean у меня добавлялся ручками,а не создавался автоматом. И я просто забыл поменять, чтоб он добавился в Map сессии, а не запроса.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Fedrus
Дата 21.3.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Предлагаю вам написать статью-урок и разместь здесь на форуме очь полезно будет))
(ну если конечьно не лень)
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
3,14
Дата 21.3.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Fedrus, где нить через неделю-другую, как времени больше свободного будет.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Fedrus
Дата 21.3.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



О спасибо думаю и не только я скажу тебе спасибо, будет полезная статья с этой проблеммой думаю многие сталкиваются!!
Я и сам думал предложить разобраться и написать статью но опыта маловато и тоже время....
PS я в свое время в проекте зделал все через ж и оставил до лучьших времен(так как сроки поджимали) вот руки дойдут переделаю)))
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.