0

データベースからjsfデータブルデータにデータを表示しようとしていますが、同じ行に編集用のリンクが表示されています。ユーザーが編集ボタンをクリックすると、outputText からの inputText になります。ここで私はそのためのコーディングを行いましたが、テキストボックスを変更できません助けてもらえますか? 前もって感謝します。

ShowData.xhtml

<h:dataTable value="#{customerdata.customerList}" var="c" 
            styleClass="order-table" binding="#{customerdata.dataTable}"
            headerClass="order-table-header" border="1" width="100%"
            rowClasses="order-table-odd-row,order-table-even-row" rows="3">

        <h:column>
            <h:selectBooleanCheckbox></h:selectBooleanCheckbox>
        </h:column>
        <h:column>
        <f:facet name="heder">User ID</f:facet>
            <h:inputText value="#{c.cust_id}" size="10" rendered="#{c.editable}"/>
            <h:outputLabel value="#{c.cust_id}" rendered="#{not c.editable}" />
        </h:column>

        <h:column>
        <f:facet name="heder">User Name</f:facet>
            <h:inputText value="#{c.cust_name}" size="10" rendered="#{c.editable}"/>
            <h:outputLabel value="#{c.cust_name}" rendered="#{not c.editable}" />
        </h:column>

        <h:column>              
            <h:commandLink value="Update" rendered="#{c.editable}" action="#{customerdata.editAction(c)}" />
            <h:commandLink value="Edit" action="#{customerdata.editAction(c)}" rendered="#{not c.editable}"/>
        </h:column>

        <h:column>              
            <h:commandLink value="Delete" action="#{customerdata.deleteAction(c)}" />
        </h:column>


        <!-- Footer Setting -->
        <f:facet name="footer">
        <h:panelGroup>
            <h:commandButton value="prev" action="#{customerdata.pagePrevious}"
                disabled="#{customerdata.dataTable.first == 0}" />
            <h:commandButton value="next" action="#{customerdata.pageNext}"
                disabled="#{customerdata.dataTable.first + customerdata.dataTable.rows
                    >= customerdata.dataTable.rowCount}" />


         </h:panelGroup>
        </f:facet>

    </h:dataTable>

CustomerData.java

    package model;

@ManagedBean(name="customerdata")
public class CustomerData implements Serializable {

    private static final long serialVersionUID = 1L;

    Connection con;
    Statement smt;
    HtmlDataTable dataTable;
    //Customer cust=new Customer();

    public List<Customer> getcustomerList() throws SQLException{
        //System.out.println("in getcustomerlist");
        List<Customer> list= new ArrayList<Customer>();
        try{

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/openid","root","root");
            smt = con.createStatement();

            String query="select * from jsftable";
            ResultSet rs= smt.executeQuery(query);

            while(rs.next()){

                Customer cust = new Customer();

                cust.setCust_id(rs.getInt("cust_id"));
                cust.setCust_name(rs.getString("cust_name"));
                cust.setHas_attachment(rs.getBoolean("has_attachment"));
                System.out.println("in cusotomer data"+cust.isEditable());
                //store all data into a List
                list.add(cust);
            }

        }
        catch(Exception e){
            e.printStackTrace();
        }
    return list;
    }

    public void pageFirst() {
        dataTable.setFirst(0);
    }

    public void pagePrevious() {
        dataTable.setFirst(dataTable.getFirst() - dataTable.getRows());
        System.out.println("Prevoius"+dataTable.getFirst());
    }

    public void pageNext() {
        dataTable.setFirst(dataTable.getFirst() + dataTable.getRows());
        System.out.println("Next"+dataTable.getFirst());
    }

    public void pageLast() {
        int count = dataTable.getRowCount();
        int rows = dataTable.getRows();
        dataTable.setFirst(count - ((count % rows != 0) ? count % rows : rows));
    }

    public HtmlDataTable getdataTable() {
        return dataTable;
    }

    public void setdataTable(HtmlDataTable dataTable) {
        this.dataTable = dataTable;
    }

    public void showRow(){
        System.out.println(dataTable.getRows());
    }
    public String deleteAction(Customer customer) throws SQLException{

        //list.remove(customer);
        //System.out.println(customer.cust_id);

        try{
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/openid","root","root");
            smt = con.createStatement();

            String query="delete from jsftable where cust_id="+customer.cust_id+"";
            //ResultSet rs= smt.executeQuery(query);
            smt.executeUpdate(query);

        }
        catch(Exception e){

            e.printStackTrace();
        }

        return null;
    }

    public String editAction(Customer customer) {

        //list.remove(customer);
        System.out.println(customer.cust_id);

        customer.setEditable(true);
        return null;
    }


}

Customer.java

public class Customer {

int cust_id;
String cust_name;
boolean has_attachment;
boolean editable;
String edit_value;


public String getEdit_value() {
    System.out.println("in getter");
    return edit_value;
}
public void setEdit_value(String editvalue) {
    this.edit_value = editvalue;
}
public boolean isHas_attachment() {
    System.out.println("in getter of has_attach");
    return has_attachment;
}
public void setHas_attachment(boolean hasAttachment) {
    has_attachment = hasAttachment;
}
public int getCust_id() {
    System.out.println("in getter of cust_id");
    return cust_id;
}
public void setCust_id(int custId) {
    cust_id = custId;
}
public String getCust_name() {
    return cust_name;
}
public void setCust_name(String custName) {
    cust_name = custName;
}
public boolean isEditable() {
    //System.out.println("in isEditable"+editable);
    return editable;
}
public void setEditable(boolean editable) {

    this.editable = editable;
    //System.out.println("in set editable"+editable);
}

}

4

2 に答える 2

2

正直なところ、あなたのコードがどのように機能するのか疑問に思っています。いくつかの大きな欠陥があります。

あなたはから始めるべきです

  • マネージド Bean にスコープを指定する@ViewScopedと、これが最も適切と思われます (こちらを参照)
  • getter メソッドからデータベース アクセスを削除します。Beanの@PostConstruct注釈付きメソッド内に配置します。Getter メソッドは、JSF ライフサイクル中に何度か呼び出すことができます。@PostConstructBean 構築後のメソッドのみ。
  • 完了したら、SQL ステートメントと接続を閉じます (stmt.close()およびcon.close())
  • Bean フィールドとメソッドの命名規則に従います。プライベート フィールドxxxにはゲッターgetXxxとセッターがありますsetXxx(大文字の使用が重要です)。
  • データテーブル バインディングを削除します。ここでは必要ありません。

BalusC によるこの単純な CRUD の例を試して、機能要件に合わせて調整することをお勧めします。

于 2012-04-10T07:34:17.683 に答える
1
  1. データテーブルの id タグを追加します。

<h:dataTable value="#{customerdata.customerList}" var="c" id="customerDT"
            styleClass="order-table" binding="#{customerdata.dataTable}"
            headerClass="order-table-header" border="1" width="100%"
            rowClasses="order-table-odd-row,order-table-even-row" rows="3">

  1. Edit CommandButton update タグに追加します。

しかし、プライムフェイスを使用してインプレース コンポーネントを使用しないのはなぜですか? http://www.primefaces.org/showcase-labs/ui/inplace.jsf (保存ボタンが必要)

于 2012-04-10T07:38:42.630 に答える