Я пытаюсь разобраться с хорошо известной «проблемой», когда метод действия h: commandLink не вызывается, когда помещается в dataTable, который получает свои данные из bean-объекта с ограниченным объемом запроса. Из-за ограничений проекта я ограничен в использовании JSF 2.0 и RichFaces 3.x (которые частично его поддерживают), поэтому я не могу полагаться на решение Томагавка (preserveDataModel).
После дня, потраченного на поиск и пробу / ошибку:
- Я читал, что "модель данных", которой питается dataTable, должна храниться в сеансе. Как я могу сделать это, не делая весь боб сессионным? Я пытался использовать статическую переменную, которая содержит данные, но не работает.
- Я пытался использовать a4j: keepAlive с моим bean-компонентом (который реализует Serializable, если это имеет значение), но не смог заставить его работать.
- Создание bean-компонента ViewScoped также не работает.
Любая помощь по этому вопросу будет принята.
EDIT:
Вот что я пытаюсь сделать:
На странице есть комбо, отображающий ряд опций, извлеченных из базы данных. Когда пользователь выбирает один, 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;
}