Многоразовый JSF 2 включает проблемы

Я работаю над раскрывающимся списком State-City на основе запросов ajax в JSF 2.0. Дело в том, что я хочу повторно использовать этот модуль jsf (beans и xhtml) для будущих реализаций.

Есть ли какое-либо решение, упрощающее получение parentBean идентификатора из раскрывающегося списка, реализованного в другом файле?

Первым решением, которое пришло мне в голову, было использование ui:include, но я получаю нулевое значение в переменной, в которой хранится окончательный выбранный параметр.

Вот фрагмент. Базовая структура:

  1. StateCityBean (контроллер меню Ajax)
  2. stateCityBean.xhtml (меню Ajax)
  3. ParentBean (здесь используется переменная selectedCity)
  4. parentBean.xhtml (здесь находится ui:include to stateCityBean.xhtml)

StateCityBean

@ManagedBean(name = "stateCityBean")
@ViewScoped
public class StateCityBean implements Serializable {
  private static final long serialVersionUID = 7344375121014662582L;

  private static final Logger LOG = Logger.getLogger(MenuEstadoCidadeBean.class);

  private Collection<SelectItem> stateList;
  private Collection<SelectItem> stateCity;

  private String selectedState; //not used yet, test purpose
  private Integer selectedCity; //not used yet, test purpose

  //All the code here is perfectly fine. Cities are loading based on the selected state in parentBean. 

}

stateCityBean.xhtml

<t:subform id="stateCitySelectMenu">
 <span class="label tamanho20">STATE:</span> 
 <span aria-live="polite">
  <h:selectOneMenu class="tamanho10" id="stateList" name="stateList" value="#{bean.selectedState}" title="State">
  <f:selectItems value="#{stateCityBean.stateList}" />
  <f:ajax event="valueChange" render="CityList" listener="#{stateCityBean.searchCities(bean.selectedState)}" onevent="loadingGif"/>
</h:selectOneMenu>
</span> 

<span class="tamanho20">CITY:</span> 
<span aria-live="polite"> 
<h:selectOneMenu class="tamanho20" title="City" id="CityList" name="CityList" value="#{bean.selectedCity}">
  <f:selectItems value="#{stateCityBean.cityList}" />
</h:selectOneMenu>
</span>
</t:subform>

parentBean.xhtml

<ui:include src="stateCityBean.xhtml">
 <ui:param name="bean" value="#{parentBean}" />
</ui:include>

parentBean.java

@ManagedBean
@RequestScoped
public class parentBean implements Serializable {

private static final long serialVersionUID = -874412419784226660L;

private static final Logger LOG = Logger.getLogger(parentBean.class);

String selectedState;
Integer selectedCity;

public String getSelectedState() {
    return selectedState;
}

public void setSelectedState(String selectedState) {
    this.selectedState = selectedState;
}

public Integer getSelectedCity() {
    return selectedCity;
}

public void setSelectedCity(Integer selectedCity) {
    this.selectedCity= selectedCity;
}

public void doSomethingWithTheSelectedCityId(){
 //bla bla bla
 return "anotherPage"
}

}

person Max    schedule 21.08.2017    source источник
comment
Я бы порекомендовал другой подход, вы должны создать собственный компонент и один управляемый компонент для управления, а затем просто внедрить его в свой МБ по вашему желанию.   -  person Jorge Campos    schedule 22.08.2017
comment
@JorgeCampos Но я делаю это именно так. stateCityBean и stateCityBean.xhtml — это компоненты, вам не кажется? или вы имеете в виду компонент JSF?   -  person Max    schedule 22.08.2017
comment
Почти так. Составной компонент JSF. Вот один из примеров: tutorialspoint.com/jsf/jsf_composite_components.htm   -  person Jorge Campos    schedule 22.08.2017
comment
Или этот: stackoverflow.com/questions/6822000/   -  person Kukeltje    schedule 22.08.2017
comment
Я думаю, что проблема связана не с самим созданием компонента, а с тем, как выбранный идентификатор в раскрывающемся меню в stateCityBean.xhtml передается через parentBean. Это настоящая проблема. Вставка выпадающего html внутри parentBean.xhtml, кажется, работает. Используя ui:include и выпадающий html в stateCityBean.xhtml, не делайте этого.   -  person Max    schedule 22.08.2017


Ответы (1)


В порядке. Я решил проблему.

видимо был с

в stateCity.xhtml я удалил:

<t:subform id="stateCitySelectMenu">

И это все.

person Max    schedule 23.08.2017