【问题标题】:Reusable JSF 2 include problems可重用的 JSF 2 包含问题
【发布时间】:2018-01-30 00:59:53
【问题描述】:

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

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

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

这里是sn-p。基本结构是:

  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"
}

}

【问题讨论】:

  • 我会推荐另一种方法,您应该创建一个自定义组件和一个托管 bean 进行管理,然后将其注入您想要的 MB 中。
  • @JorgeCampos 但我就是这样做的。 stateCityBean 和 stateCityBean.xhtml 是“组件”,你不觉得吗?还是您的意思是 JSF 组件?
  • 差不多了。一个 JSF 复合组件。这是一个例子:tutorialspoint.com/jsf/jsf_composite_components.htm
  • 我认为这个问题与组件创建本身无关,而是在 stateCityBean.xhtml 的 DropDown 菜单中选择的 id 如何通过 parentBean 传递。这才是真正的问题。将下拉 html 粘贴到 parentBean.xhtml 中似乎可以工作。使用 ui:include 和下拉 html 进入 stateCityBean.xhtml,不要。

标签: jsf facelets managed-bean uiinclude


【解决方案1】:

好的。我解决了这个问题。

显然是s

stateCity.xhtml 我删除了:

<t:subform id="stateCitySelectMenu">

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 2011-07-26
    • 2014-07-27
    • 1970-01-01
    • 2011-05-04
    • 2011-08-13
    • 2011-09-18
    • 2013-04-03
    相关资源
    最近更新 更多