コマンドリンクをクリックした後、datatable 内のすべての既存のアイテムが new Item() にリセットされる理由がよくわかりませんでした。このアプリは、連絡先のリストと、ユーザーがクリックして選択した項目を編集モードに変更できる編集 (コマンドリンク) ボタンを提供します。コマンドリンクをクリックすると、Bean の edit() が呼び出され、getRowData() が期待される行を取得しています。しかし、行の存在データはどういうわけか空白です (正確には new MSAMContactJTO())。実際、データテーブル内のすべての既存の行は、showhow が空白にリセットされています。
以下はxhtmlです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:c="http://java.sun.com/jstl/core">
<!-- saved from url=(0049)http://usmodev/my_send_a_message/address_book.htm -->
<h:head><title>My Send a Message</title>
</h:head>
<h:body>
<h:form id="addressBookForm" prependId="false">
<h:dataTable id="contactListTable" border="0" cellspacing="0" cellpadding="0"
value="#{MSAMAddressBook2ListBean.contactListTable}"
rendered="#{not empty MSAMAddressBook2ListBean.contactList}"
var="item">
<h:column>
<h:panelGrid id="contactNameColumn" >
<h:panelGroup style="text-align:left; white-space:nowrap;" rendered="#{!item.editMode and !item.newAdd}">
<h:outputText value="#{item.contactName}"/>
</h:panelGroup>
<h:panelGroup style="text-align:left; white-space:nowrap;" rendered="#{item.editMode || item.newAdd}">
<h:inputText id="contactName" value="#{item.contactName}" maxlength="30" size="30" />
</h:panelGroup>
</h:panelGrid>
</h:column>
<h:column>
<h:panelGrid id="actionColumn" cellpadding="0" cellspacing="0">
<h:commandLink id="editContact" action="#{MSAMAddressBook2ListBean.edit}" value="EDIT"/>
<!-- f:ajax event="action" execute="@form" render="contactListTable"/ -->
</h:panelGrid>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
以下は、管理 Bean です。
package com.arch.myaccount.jsf;
import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import com.arch.database.myaccount.MSAMAddressBookDatabase;
import com.arch.myaccount.MSAMContactDTO;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.annotation.PostConstruct;
@SuppressWarnings("serial")
@ManagedBean(name="MSAMAddressBook2ListBean")
@ViewScoped
public class MSAMAddressBook2ListBean extends JSFBean implements Serializable
{
// table list info
private transient DataModel<MSAMContactJTO> contactListTable;
private ArrayList<MSAMContactJTO> contactList = null;
@PostConstruct
public void init() {
getContactList();
}
public String edit() {
String result = "successful";
MSAMContactJTO item = getContactListTable().getRowData();
item.setEditMode(true);
return result;
}
public List<MSAMContactJTO> getContactList() {
if (contactList == null) {
try {
loadContactList();
}
catch (Exception ex) {}
}
return contactList;
}
public void loadContactList() {
try {
List<MSAMContactDTO> contacts = new MSAMAddressBookDatabase().findContactsByLoginName(getLoginID());
if (contactList == null) contactList = new ArrayList<MSAMContactJTO>();
else contactList.clear();
for (MSAMContactDTO contact :contacts) {
MSAMContactJTO abDTO = new MSAMContactJTO();
abDTO.copyFromMSAMContactDTO(contact);
contactList.add(abDTO);
}
}
catch (Exception ex) {
addFatalMessage("We are unable to fulfill your request. Please try again later");
ex.printStackTrace();
}
}
public DataModel<MSAMContactJTO> getContactListTable() {
if (contactListTable == null) {
contactListTable = new ListDataModel<MSAMContactJTO>(contactList);
}
return contactListTable;
}
public void setContactList(ArrayList<MSAMContactJTO> contactList) {
this.contactList = contactList;
}
}