0

私の JSF 2.0 アプリケーションのページは、特定の学校 (データベース操作) からの教師の数を (teacherIds の形式で) dataTable に取り込みます。各行に対して、整数値 (intValue) と文字列値 (strValue) の 2 つのプロパティを割り当てる必要があります。ページをデータベースに保存するために送信すると、teachList のすべての教師に対して同じ strValue と intValue が保存されます。たぶん、データテーブルの使い方がわからないので、「http://www.primefaces.org/showcase/ui/datatableRowEditing.jsf」に従っています。誰かが他の代替案や修正を提案できますか? 私のコードを以下に貼り付けます。ありがとう!

@ManagedBean(name="myBean")
@SessionScoped
public class MyBean implements Serializable{

    private Integer indId;
    private Integer teacherId;
    private Integer schoolId;
    private String strValue;
    private Integer intValue;
    private List<Teacher> teacherList;
    private List<Att> tList;

    public myBean(){
        tList = new ArrayList<Att>();

        // Some database operations to load the att.xhtml page
        indId = findId();
        teacherList = teacherDataProvider(schoolId);    
    }

    public void attEntry(){

        for (int i = 0;i<teacherList.size();i++){

            tList.add(new Att(this.teacherList.get(i).getTeacherId(),
                                                            this.indId,
                                                            this.strValue,
                                                            this.intValue,
                                                            );
            dataProvider.addAtt(tList.get(i)); // call for database archival from the DAO   
        }
    }

    // getters & setters

}   

att.xhtml

<h:dataTable id="teachers" class="table table-condensed" 
    value="#{myBean.teacherList}" var="t">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Teacher Id" />
        </f:facet>
        <h:outputText value="#{t.teacherId}" />
    </h:column> 

    <h:column>
        <f:facet name="header">
            <h:outputText value="Att" />
        </f:facet>
        <h:inputText value="#{myBean.intValue}" />
    </h:column>

    <h:column>
        <f:facet name="header">
            <h:outputText value="Comments" />
        </f:facet>
        <h:inputTextarea value="#{myBean.strValue}" />
    </h:column>
</h:dataTable>      
<div>
    <h:commandButton action="#{myBean.attEntry}" value="Submit" />
</div>
4

1 に答える 1

1

あなたの問題はデータテーブルに関するものではなく、JSF の基本を理解できていないことです。JSF は、ユーザーが指示したことを正確に実行します。そして、基本的には、Bean の 1 つのプロパティとオブジェクトリスト1持つように指示するため、明らかに矛盾が生じます。 Integer StringTeacher

あなたの質問から暗黙のうちに続くのは正反対です。クラスのすべてのインスタンスに整数と文字列のペアをアタッチする必要があります。これは、クラス内にこれら 2 つの値を格納するか、ラッパー クラスで 2 つの値と共にオブジェクトをTeacher囲むことを前提としています。Teacher

  1. Teacherクラスに 2 つのフィールドを追加します。

    public class Teacher {
    
        private int intValue;//getter+setter
        private String stringValue;//getter+setter
    
    }
    
  2. ラッパー クラスでオブジェクトを囲みます。

    public class TeacherWrapper {
    
        private int intValue;//getter+setter
        private String stringValue;//getter+setter
        private Teacher teacher;//getter+setter
    
    }
    

もちろん、Teacherサーブレット 3.0 を使用していて EL 2.2 を使用している場合は、これらの 2 つの値のペアを Bean の list of のすぐ隣にある 2 つの個別のリストに格納し、パラメーターを指定して EL メソッド呼び出しを使用することもできます。

このように、必要なバインディングを入力コンポーネントに追加すると、コマンド ボタンは希望どおりに機能します。

補足として、ビュー/リクエスト スコープに属する可能性が最も高いデータに対してセッション スコープを使用する理由を必ず確認してください。Teacherまた、ジョブを処理するためにすべてのデータ テーブル行にコマンド ボタンを追加できる行ごとのデータ (単一のオブジェクトなど) を永続化することもできますが、それは別の問題です。

于 2013-03-27T18:17:50.653 に答える