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

newStaffMemberServiceBeanは入っていますRequestScoped

@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代わりに、1 つのフォームに 1 つのフォームを使用してくださいdataTable

  2. これactionは、アクションをトリガーしたコンポーネントが見つかった場合にのみ実行されます。リクエストスコープのリストを使用するdatatableと、ビューが復元されたときにそのリストが存在しないか、ビューの作成に使用された元のリストと一致しない可能性があります。マネージド Bean をリクエスト スコープからビュー スコープ以上に変更する必要がある場合があります。

  3. 提案として、h:outputLinkorh:linkの代わりに使用して、これを簡素化commandLinkするためにf: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"/>

dataTableさらに、@Daniel が投稿したように、dataTable 内に yourとcommandLinksをラップするフォームは 1 つだけ必要です。

アップデート:

知っておくべき重要なことがあります。

マネージド Bean の属性としてリストがあり、このリストを使用して情報を表示し (つまり、dataTable を使用)、データテーブル内にボタンまたはリンクを含めたい場合、マネージド Bean にはリストの参照が含まれている必要があります。クリエイター。これは、少なくとも 2 つの方法で実現できます。

  • セッションからリストを保存してロードします (非常に悪い設計であり、コードを維持するのはかなり困難です)。
  • Bean を ViewScoped (JSF2.x パースペクティブ。JSF 1.2 を使用している場合はa4j:keepAlive、RichFaces または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 オブジェクトを使用してデータ (詳細) を表示できます。私はこのコードを自分で試しました(私は新しいPCを使用しているので、投稿する前にコードを確認したり、ソフトウェアをインストールしたりする必要があります...)。

于 2012-03-11T08:29:43.663 に答える