在我的JSF文件中,我在开始时就在下面。
<h:form><h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/></h:form>
。
通过使用此功能,当我在Create New Staff Account
上创建时,我会重新定向到我创建新帐户的页面。
但是,当我在dataTable
内使用相同内容时,会采取无操作。我还在同一页上:(
<h:dataTable var="c" value="#{newStaffMemberServiceBean.newStaffMemberDataBeanList}"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row"
border="1" id="staffListDataTable" width="100%">
<h:column>
<f:facet name="header">
Staff Member Name
</f:facet>
<h:form><h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/></h:form>
</h:column>
</h:dataTable>
实际上我想要打印的是我将使用f:setPropertyActionListener
的相应工作人员的详细信息。但由于上述情况不起作用,我不会继续。
请建议我去哪里 错误 。
我的newStaffMemberServiceBean
位于RequestScoped
@ManagedBean(name = "newStaffMemberServiceBean")
@RequestScoped
public class NewStaffMemberServiceBean {
// some code
}
HTML生成如下
dataTable
以外
<div align="right">
<form id="j_idt35" name="j_idt35" method="post" action="/adminManageStaffMember" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt35" value="j_idt35" />
<a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt35'),{'j_idt35:j_idt36':'j_idt35:j_idt36'},'');return false">Create New Staff Account</a><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="2664682277023387375:-3250423983171933030" autocomplete="off" />
</form>
内部dataTable
<form id="staffListDataTable:0:j_idt43" name="staffListDataTable:0:j_idt43" method="post" action="/adminManageStaffMember" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="staffListDataTable:0:j_idt43" value="staffListDataTable:0:j_idt43" />
<a href="#" onclick="mojarra.jsfcljs(document.getElementById('staffListDataTable:0:j_idt43'),{'staffListDataTable:0:j_idt43:j_idt45':'staffListDataTable:0:j_idt43:j_idt45'},'');return false">Create New Staff Account</a><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="2664682277023387375:-3250423983171933030" autocomplete="off" />
</form>
答案 0 :(得分:5)
我建议您对原始代码进行一些修改。首先,不要对h:form
的每一个使用commandLink
,而是为dataTable
使用一个表单。其次,action
只有在找到触发aciton的组件时才会执行。如果您为datatable
使用请求范围列表,那么当视图恢复时该列表将不存在,或者可能与用于创建视图的原始列表不匹配。您可能必须将托管bean从请求范围更改为查看范围或更高。
第三,作为建议,你可以使用h:outputLink或h:link而不是commandLink,并提供f:param来简化这一点,在这种情况下你也不需要表格。
答案 1 :(得分:2)
你的桌子被其他表格包裹了吗?
如果是这种情况并且您在表单中获得了表单...
删除包装<h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>
类似这样的事情
<h:column>
<f:facet name="header">
Staff Member Name
</f:facet>
<h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>
</h:column>
答案 2 :(得分:0)
我猜你的commandLink动作方法设置错误。你有这个代码:
<h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>
你应该有这样的东西:
<h:commandLink value="Create New Staff Account"
action="#{newStaffMemberServiceBean.adminCreateStaffMember"/>
此外,就像@Daniel发布的那样,您必须只有一个表单才能将dataTable
和commandLink
包装在dataTable中。
更新:
你必须知道一件重要的事情:
如果你有一个列表作为托管bean的属性,这个列表用于显示信息(即使用dataTable),你想在数据表中包含一些按钮或链接,你的托管bean必须有一个参考创建者中的列表。这可以通过至少两种方式实现:
a4j:keepAlive
标记或MyFaces的t:saveState
。说完这个,并且由于你使用的是JSF 2,你可以在你的bean上使用ViewScope。这样,在对同一视图执行请求后将不会重新创建bean,因此列表将在bean内自动保存。 bean应该是这样的:
@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托管bean中的staffmember对象来显示数据(详细信息)。我自己尝试过这个代码(我在一台新电脑上,所以我必须在发布,安装软件等之前检查代码......)。