【发布时间】:2011-05-20 00:21:01
【问题描述】:
我正在尝试处理众所周知的“问题”,其中 h:commandLink 的操作方法在放置在从请求范围 bean 获取其数据的 dataTable 中时不会被调用。由于项目限制,我仅限于使用 JSF 2.0 和 RichFaces 3.x(部分支持它),所以我不能依赖 Tomahawk 的解决方案(preserveDataModel)。
经过一天的搜索和试错:
- 我读到需要将 dataTable 提供的“数据模型”存储在会话中。在不使整个 bean 成为会话范围的情况下,我该如何做到这一点?我尝试使用保存数据的静态变量,但不起作用。
- 我尝试将 a4j:keepAlive 与我的 bean 一起使用(实现 Serializable,如果重要的话),但未能成功。
- 使 bean ViewScoped 也不起作用。
对此的任何帮助将不胜感激。
编辑:
这是我想要做的:
在页面中有一个组合显示从数据库中检索到的许多选项。当用户选择一个时,dataTable 会填充与所选选项相关的信息。第一列的数据呈现为命令链接。如果用户点击链接,它应该调用指定的方法,但它不会被调用。
mypage.xhtml
<h:form>
<!-- Placed a <a4j:keepAlive beanName="myBean"> in this line, but didn't work -->
<h:selectOneMenu value="#{myBean.selectedOption}">
<f:selectItems value="#{myBean.optionsList}" var="option"
itemLabel="#{option.labelProperty}" itemValue="#{option.valueProperty}"/>
<a4j:support event="onchange" action="#{myBean.getDataBasedOnSelectedOption}"
reRender="table_panel" ajaxSingle="true"/>
</h:selectOneMenu>
<a4j:outputPanel id="table_panel" >
<rich:dataTable id="table" value="#{myBean.data}" var="dataRow"
rendered="#{not empty myBean.selectedOption}">
<f:facet name="header">
<rich:columnGroup>
<rich:column>Some column header</rich:column>
</rich:columnGroup>
</f:facet>
<rich:column>
<a4j:commandLink action="#{myBean.linkClickedAction}"
value="#{dataRow.someProperty}"/>
</rich:column>
</a4j:outputPanel>
MyBean.java
@ManagedBean(name="myBean")
@RequestScoped //Tried with @ViewScoped but didn't work
private List<MyPOJO1> optionsList;
private List<MyPOJO2> data; //Made this variable static, but didn't work
private String selectedOption;
@PostConstruct
public void init()
{
optionsList = getOptionsListFromDatabase();
}
public String getDataBasedOnSelectedOption()
{
data = getRelevantDataFromDatabase(selectedOption);
return null;
}
//This method doesn't get called
public String linkClickedAction()
{
System.out.println("I'm here!");
return null;
}
public List<MyPOJO1> getOptionsList()
{
return optionsList;
}
public void getSelectedOption()
{
return selectedOption;
}
public void setSelectedOption(String selectedOption)
{
this.selectedOption = selectedOption;
}
【问题讨论】:
-
使用视图范围或
应该绝对有效。您能否发布更多详细信息,您是如何尝试的?
标签: jsf datatable commandlink