私はprimefaces datatableを使用しています。 rowSelectイベントでは、リスナーonRowSelectを呼び出します。選択された行は、selectedRowとeditRowの2つのオブジェクト変数に割り当てられます。オブジェクト変数は同じ値を保持しますeventhougオブジェクト変数は1つだけ変更されます
「編集」ボタンをクリックすると、editRowオブジェクト変数で入力が行われ、beanの値を更新すると、編集された変数は 'selectedRow'オブジェクトと 'editRow'オブジェクトの両方で同じ値になります。
モデルクラスは以下の通りです。次のようにセールスマンの詳細情報を閲覧する
public class SalesMen {
private int salesMen_id;
private String salesMen_email1;
public SalesMen() {
}
public int getSalesMen_id() {
return salesMen_id;
}
public void setSalesMen_id(int salesMen_id) {
this.salesMen_id = salesMen_id;
}
public String getSalesMen_email1() {
return salesMen_email1;
}
public void setSalesMen_email1(String salesMen_email1) {
this.salesMen_email1 = salesMen_email1;
}
}
私のXHTMLがあります。
<ui:define name="contentPanel">
<div style="margin-bottom: 10px; margin-top: 10px">
<p:growl id="growl" showDetail="true"/>
<h:form id="form1">
<div class="w3-margin-top">
<h:commandButton type="cmdAdd" action="frmSalesMenAdd.xhtml?faces-redirect=true" value="Add" />
<h:outputText value=" "/>
<h:commandButton type="cmdEdit" action="frmSalesMenEdit.xhtml?faces-redirect=true" value="Edit" disabled="#{salesMenBean.selectedSalesMen eq null}" />
<h:outputText value=" "/>
</div>
</h:form>
<div>
<h:form id="frmDgvBanking">
<p:dataTable id ="dgvBanking"
var = "dtBanking"
value="#{salesMenBean.salesMens}"
selectionMode="single"
selection="#{salesMenBean.selectedSalesMen}"
rowKey="#{dtBanking.salesMen_id}"
scrollable="true"
resizableColumns="true"
scrollHeight="450"
scrollRows="50"
scrollWidth="100%"
widgetVar="SaleMen Table">
<p:ajax event="rowSelect" listener="#{salesMenBean.onRowSelect}" update=":form1 :frmDgvBanking :growl :frmDgvBanking:dgvBanking "/>
<p:column headerText="SalesMenEmail" >
<h:outputText value="#{dtBanking.salesMen_email1}" />
</p:column>
</p:dataTable>
</h:form>
</div>
</div>
</ui:define>
オン[編集]ボタンをクリックすると、次のXhtmlが実行されます。
<ui:define name="contentPanel">
<div style="margin: auto; width: 60%">
<p:growl id="growl" showDetail="true"/>
<h:form id="form1">
<p:panelGrid id="pg" columns="2">
<p:outputLabel for="txtEmail" value="Email id:"/>
<p:inputText id="txtEmail" value="#{salesMenBean.editSalesMen.salesMen_email1}" />
</p:panelGrid>
<h:commandButton id="cmdSave" action="#{salesMenBean.UpdateSalesMen(salesMenBean.editSalesMen)}" value="Save" />
</h:form>
</div>
</ui:define>
salesmenBeanは次のとおりです。 selectedRowとEditRowが、私は、変数(salesMenBean.editSalesMen.salesMen_email1)をオブジェクトEditRowのみ編集本家と同じ値を取得する変数オブジェクトなぜ
@SessionScoped
@Named("salesMenBean")
public class SalesMenBean implements Serializable {
private SalesMen salesmen;
private List<SalesMen> salesMens;
private SalesMen selectedSalesMen;
private SalesMen editSalesMen;
public SalesMenBean() {
salesmen = new SalesMen();
}
public List<SalesMen> getSalesMens() {
salesMens = loadSalesMenListFromDb();
return salesMens;
}
public void setSalesMens(List<SalesMen> salesMens) {
this.salesMens = salesMens;
}
private List<SalesMen> loadSalesMenListFromDb() {
List<SalesMen> list = new ArrayList<>();
... reading values from table and adding to list
return list;
}
public void onRowSelect(SelectEvent event) {
selectedSalesMen = ((SalesMen) event.getObject());
editSalesMen = ((SalesMen) event.getObject());
FacesMessage msg = new FacesMessage(selectedSalesMen.getSalesMen_Name());
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, msg);
}
public String UpdateSalesMen(SalesMen editSm) {
System.out.println("Selected Salesmen email id is " + this.selectedSalesMen.getSalesMen_email1());
System.out.println("Edited Salesmen email id is " + editSm.getSalesMen_email1());
// The values above printed are same.
// I expect the editSm.getSalesMen_email1 should have the new value entered in the edit xhtml and selectedSalesMen.getSalesMen_email1 should hold the old value. But not happening
.... other updating codes are here
}
は誰か、私を助けます。
ありがとうございます。
のプロパティの値を
editSalesMen
ための新しいオブジェクトを作成し、それに割り当てることができる2つの異なるオブジェクトであることをあなたのすべてをありがとうございます。私はエラーの背後にある理由を理解しました(オブジェクトへの参照は渡されます)。 「この質問にはすでに回答があります:」というリンクには、質問に答えがないようですか、それとも何かが欠けていますか?今のところ、私は自分の要件を満たすためにコピーコンストラクタを使用しています。もう一度ありがとうございます。 –