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

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

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


 




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


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

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