可重用的JSF 2包含问题

时间:2017-08-21 21:29:56

标签: jsf facelets managed-bean uiinclude

我正在根据JSF 2.0中的ajax请求开发State-City Dropdown。问题是我想重用这个jsf模块(beans和xhtmls)以供将来实现。

是否有任何解决方案可以让 parentBean 从另一个文件中实现的下拉列表中轻松检索ID?

它出现的第一个解决方案是使用ui:include但是我在存储最终选定选项的变量中遇到空值。

这是片段。基本结构是:

  1. StateCityBean(Ajax菜单控制器)
  2. stateCityBean.xhtml(Ajax菜单)
  3. ParentBean(此处使用selectedCity变量)
  4. parentBean.xhtml(ui:include to stateCityBean.xhtml is here)
  5. 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"
    }
    
    }
    

1 个答案:

答案 0 :(得分:0)

确定。我解决了这个问题。

显然是s

stateCity.xhtml 我删除了:

<t:subform id="stateCitySelectMenu">

就是这样。