Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > selectOneMenu change


Автор: 4epT 4.10.2010, 00:51
Добрый вечер! Есть БД, в ней 2 таблицы Страны и Города (связь я думаю понятна, в каждый город может принадлежать только однйо стране. связь идет по ИД). С базой работаю через Hibernate. Описаны 2 класса country и city, также написан Bean в котором 2 метода:
Код

@SessionScoped
@ManagedBean (name = "ui")
public class UIBean {

    private String selected;

    public UIBean() {
    }

    public String getSelected() {
        return selected;
    }

    public void setSelected(String selected) {
        this.selected = selected;
    }

    public UISelectItems getAllCountrys(){

        List selectItems = new ArrayList();
        UISelectItems items = new UISelectItems();
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        ArrayList<Country> list = (ArrayList<Country>) session.createCriteria(Country.class).list();
        selectItems.add(new SelectItem("--", "--"));
        for (Country country : list) {

            selectItems.add(new SelectItem(country.getId(), country.getCountry()));

        }
        items.setValue(selectItems);
        session.getTransaction().commit();
        session.close();

        return items;
    }


    public UISelectItems getAllCitys(){

        UISelectItems items = new UISelectItems();
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        /*Country value = FacesUtils.getValue("#{ui.selected}", Country.class);*/
        
        if( selected == null || selected.equals("--") ){
            List selectItems = new ArrayList();
            selectItems.add(new SelectItem("-", "-"));
            items.setValue(selectItems);
            return items;
        }
        System.out.println(selected.getClass());
        System.out.println(selected.toString());
        int ol = Integer.parseInt(selected);
        ArrayList<City> list = (ArrayList<City>) session.createQuery("from City as c where c.country = :country").setParameter("country", ol).list();
        items.setValue(list);
        session.getTransaction().commit();
        session.close();

        return items;
    }

}


и есть страница, в которой 2 комбобокса. хочу что бы при выборе страны во второй комбо бокс выводились города) подскажите что я не так делаю?

вот страница:
Код

<ui:define name="content">
        <h:form id="form1">
            <ui:debug hotkey="O" />
            <p:growl id="growl" showDetail="true" life="4000" />
            <h:panelGrid columns="2" id="panelRigistration">
                <h:selectOneMenu id="countrys" required="true" value="#{ui.selected}">
                    <f:convertNumber integerOnly="true" />
                    <f:selectItems binding="#{ui.allCountrys}" />
                </h:selectOneMenu>
                <h:selectOneMenu id="citys" required="true">
                    <f:selectItems binding="#{ui.allCitys}" />
                </h:selectOneMenu>
                <h:commandButton id="Ololo" value="Ololololo" />
            </h:panelGrid>
        </h:form>
    </ui:define>


в бине есть поле selected оно не изменяется при выборе какой либо страны( оно всегда null

Автор: iluvatar 4.10.2010, 14:17
Я не силен в JSF, но насколько я понимаю, тут только аякс. 
Если он встроен в этот компонент, то проблема мэппинга. 
Если не встроен, то писать ручками.

Автор: 4epT 4.10.2010, 16:56
А может кто то объяснить как правильно это делать? Можно без кусков кода, но по шагам простым языком) буду очень признателен!))

Автор: m0zg 4.10.2010, 17:47
Если писать самому не хочется, можно заюзать a4j. Будет примерно так:

Код

<h:panelGrid columns="2" id="panelRigistration">
     <h:selectOneMenu id="countrys" required="true" value="#{ui.selected}">
          <f:convertNumber integerOnly="true" />
          <f:selectItems binding="#{ui.allCountrys}" />
          <a4j:support event="onchange" reRender="citys" />
     </h:selectOneMenu>
     <h:selectOneMenu id="citys" required="true">
          <f:selectItems binding="#{ui.allCitys}" />
          </h:selectOneMenu>
     <h:commandButton id="Ololo" value="Ololololo" />
 </h:panelGrid>



Также, в a4j:support можно параметры какие-нибудь передать, action или actionListner повесить, ну много чего. Хотя, если юзаешь JSF 2, то можно обойтись и без a4j.

Автор: 4epT 4.10.2010, 20:01
Цитата(m0zg @ 4.10.2010,  17:47)
Если писать самому не хочется, можно заюзать a4j. Будет примерно так:

Код

<h:panelGrid columns="2" id="panelRigistration">
     <h:selectOneMenu id="countrys" required="true" value="#{ui.selected}">
          <f:convertNumber integerOnly="true" />
          <f:selectItems binding="#{ui.allCountrys}" />
          <a4j:support event="onchange" reRender="citys" />
     </h:selectOneMenu>
     <h:selectOneMenu id="citys" required="true">
          <f:selectItems binding="#{ui.allCitys}" />
          </h:selectOneMenu>
     <h:commandButton id="Ololo" value="Ololololo" />
 </h:panelGrid>



Также, в a4j:support можно параметры какие-нибудь передать, action или actionListner повесить, ну много чего. Хотя, если юзаешь JSF 2, то можно обойтись и без a4j.

насколько я понимаю, если вешать actionListener то это уже будет не ajax ?

а можно это сделать без использования a4j ?

Автор: iluvatar 5.10.2010, 10:53
Могу написать как вообще должно работать.

Есть два селекта - с выбором страны и города.

1. На первый вешаем событие onchange, в нем шлем ajax-запрос на сервер по адресу "/getCity?country=" и прибавляем значение из select'a. Все это пишется на клиенте на JavaScript

2. Сервлет должен сделать запрос к БД, и вернуть результат в виде xml или json.

3. На клиенте на прием ответа ставим ф-цию, которая парсит ответ сервера и если все прошло удачно - очищает и заполняет второй селект полученными данными.


Рекомендую использовать jquery.

Автор: m0zg 5.10.2010, 11:42
Цитата(4epT @ 4.10.2010,  20:01)
Цитата(m0zg @ 4.10.2010,  17:47)
Если писать самому не хочется, можно заюзать a4j. Будет примерно так:

Код

<h:panelGrid columns="2" id="panelRigistration">
     <h:selectOneMenu id="countrys" required="true" value="#{ui.selected}">
          <f:convertNumber integerOnly="true" />
          <f:selectItems binding="#{ui.allCountrys}" />
          <a4j:support event="onchange" reRender="citys" />
     </h:selectOneMenu>
     <h:selectOneMenu id="citys" required="true">
          <f:selectItems binding="#{ui.allCitys}" />
          </h:selectOneMenu>
     <h:commandButton id="Ololo" value="Ololololo" />
 </h:panelGrid>



Также, в a4j:support можно параметры какие-нибудь передать, action или actionListner повесить, ну много чего. Хотя, если юзаешь JSF 2, то можно обойтись и без a4j.

насколько я понимаю, если вешать actionListener то это уже будет не ajax ?

а можно это сделать без использования a4j ?

Можно. Выше написали уже smile.

Или, если JSF 2.0, то почитай про <f:ajax />

Автор: 4epT 5.10.2010, 16:24
Насчет JavaScript, я понимаю что так можно сделать) но поставил себе задачу именно JSF 2.0 + Hibernate ...

насчет <f:ajax почитаю) буду пробовать ... спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)