Я полагаю, ваш метод действия commandLink установлен неправильно.У вас есть этот код:
<h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>
У вас должно быть что-то вроде этого:
<h:commandLink value="Create New Staff Account"
action="#{newStaffMemberServiceBean.adminCreateStaffMember"/>
Кроме того, как выложил @Daniel, у вас должна быть только 1 форма для упаковки dataTable
и commandLink
s внутри dataTable.
ОБНОВЛЕНИЕ:
Есть важные вещи, которые вы должны знать:
Если у вас есть список в качестве атрибута вашего управляемогоbean, этот список используется для отображения информации (т.е. с использованием dataTable), и вы хотите включить некоторую кнопку или ссылку в таблицу данных, ваш управляемый bean-компонент ДОЛЖЕН иметь ссылку на список в создателе.Этого можно достичь как минимум двумя способами:
- Сохранить и загрузить список из сеанса (очень плохой дизайн, и довольно сложно поддерживать код).
- Установить компонентв ViewScoped (в перспективе JSF2.x. Если вы работаете с JSF 1.2, вы можете попробовать тег
a4j:keepAlive
от RichFaces или t:saveState
от MyFaces).
Сказав это, и так как выВы используете JSF 2, вы можете использовать ViewScope для вашего компонента.При этом бин не будет воссоздан после выполнения запроса в том же представлении, поэтому список будет сохранен автоматически внутри бина.Боб должен выглядеть так:
@ManagedBean(name = "newStaffMemberServiceBean")
@ViewScoped
public class NewStaffMemberServiceBean implements Serializable {
private List<StaffMember> lstStaffMember;
//getters and setters...
public NewStaffMemberServiceBean() {
//populate the list...
lstStaffMember = new ArrayList<StaffMember>();
}
//managing the navigation using the id as a parameter
//additional, this can (and MUST BE) improved.
public String viewStaffMemberDetails() {
//get the id parameter from the link
int id = Integer.valueOf(FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap().get("id"));
//searching that id in our staff member list
for(StaffMember sm : lstStaffMember) {
if (sm.getId() == id) {
//setting the staff member object in session
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put("staffMember", sm);
//returning the name of the page we want to navigate
return "adminCreateStaffMember";
}
}
return "";
}
}
Теперь давайте проверим xhtml.Все довольно просто:
<h:form>
Welcome
<br />
<h:dataTable
value="#{newStaffMemberServiceBean.lstStaffMember}"
var="staffMember">
<h:column>
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{staffMember.name}" />
</h:column>
<h:column>
<f:facet name="header">
View Details
</f:facet>
<h:commandLink value="Show details"
action="#{newStaffMemberServiceBean.viewStaffMemberDetails}">
<f:param name="id" value="#{staffMember.id}" />
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
И все!Вы можете без проблем перейти к adminCreateStaffMember.xhtml и использовать объект персонала в управляемом компоненте adminCreateStaffMember для отображения данных (подробностей).Я сам попробовал этот код (у меня новый компьютер, поэтому я должен проверить код перед публикацией, установить программное обеспечение и т. Д.).