1

在我的 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。但由于上述不起作用,我不会继续。

请建议我哪里出错了

更新 1

newStaffMemberServiceBeanRequestScoped

@ManagedBean(name = "newStaffMemberServiceBean")
@RequestScoped
public class NewStaffMemberServiceBean {
    // some code
}

更新 2

生成的 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>
4

3 回答 3

7

我建议对您的原始代码进行一些修改:

  1. 不要h:form为你的每一个commandLink使用,而是为你的dataTable.

  2. action只有在找到触发 aciton 的组件时才会执行。如果您使用请求范围列表,datatable那么当视图恢复时该列表将不存在,或者可能与用于创建视图的原始列表不匹配。您可能必须将托管 bean 从请求范围更改为查看范围或更高。

  3. 作为建议,您可以使用h:outputLinkorh:link代替commandLinkandf:param来简化此操作,在这种情况下您也不需要该表单。

于 2012-03-11T08:32:31.953 回答
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>
于 2012-03-11T07:58:50.997 回答
0

我猜您的 commandLink 操作方法设置错误。你有这个代码:

<h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>

你应该有这样的东西:

<h:commandLink value="Create New Staff Account"
    action="#{newStaffMemberServiceBean.adminCreateStaffMember"/>

此外,就像@Daniel 发布的那样,您必须只有 1 个表单来将您的dataTablecommandLinks 包装在 dataTable 中。

更新:

有一个重要的事情你必须知道:

如果您有一个列表作为托管 bean 的属性,此列表用于显示信息(即使用数据表)并且您想在数据表中包含一些按钮或链接,您的托管 bean 必须在创造者。这可以通过至少两种方式来实现:

  • 保存并从会话加载列表(非常糟糕的设计,并且很难维护代码)。
  • 将 bean 设置为 ViewScoped(JSF2.x 透视图。如果您使用的是 JSF 1.2,则可以尝试使用a4j:keepAliveRichFaces 或t:saveStateMyFaces 中的标记)。

话虽如此,并且由于您使用的是 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 对象来显示数据(详细信息)。我自己试过这段代码(我在一台新电脑上,所以我必须在发布、安装软件等之前检查代码……)。

于 2012-03-11T08:29:43.663 回答