JSF 2 DataTable-单击commandlink后,所有现有项都将重置为新项()
在我单击commandlink后,无法完全理解为什么datatable中的所有现有项都被重置为new Item()。此应用程序为用户提供联系人列表以及编辑(commandlink)按钮,用户可以单击该按钮将所选项目更改为编辑模式。当我单击commandlink时,它调用bean的edit(),getRowData()将获得预期的行。但行中的exist数据不知何故是空的(确切地说是新的MSAMContactJTO()。事实上,datatable中的所有现有行都显示了如何重置为空白 下面是xhtml:JSF 2 DataTable-单击commandlink后,所有现有项都将重置为新项(),jsf,Jsf,在我单击commandlink后,无法完全理解为什么datatable中的所有现有项都被重置为new Item()。此应用程序为用户提供联系人列表以及编辑(commandlink)按钮,用户可以单击该按钮将所选项目更改为编辑模式。当我单击commandlink时,它调用bean的edit(),getRowData()将获得预期的行。但行中的exist数据不知何故是空的(确切地说是新的MSAMContactJTO()。事实上,datatable中的所有现有行都显示了如何重置为空白 下面是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;
}
}
package com.arch.myaccount.jsf;
导入java.io.Serializable;
导入java.util.List;
导入java.util.ArrayList;
导入com.arch.database.myaccount.MSAMAddressBookDatabase;
导入com.arch.myaccount.MSAMContactDTO;
导入javax.faces.model.DataModel;
导入javax.faces.model.ListDataModel;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
导入javax.annotation.PostConstruct;
@抑制警告(“串行”)
@ManagedBean(name=“MSAMAddressBook2ListBean”)
@视域
公共类MSAMAddressBook2ListBean扩展了JSFBean,实现了可序列化
{
//表列表信息
私有瞬态数据模型contactListTable;
private ArrayList contactList=null;
@施工后
公共void init(){
getContactList();
}
公共字符串编辑(){
String result=“成功”;
MSAMContactJTO item=getContactListTable().getRowData();
item.setEditMode(真);
返回结果;
}
公共列表getContactList(){
if(contactList==null){
试一试{
loadContactList();
}
捕获(例外情况除外){}
}
返回联系人列表;
}
public void loadContactList(){
试一试{
List contacts=new MSAMAddressBookDatabase().findContactsByLoginName(getLoginID());
如果(contactList==null)contactList=new ArrayList();
else contactList.clear();
用于(MSAMContactDTO联系人:联系人){
MSAMContactJTO abDTO=新的MSAMContactJTO();
abDTO.copyFromMSAMContactDTO(联系人);
联系人列表。添加(abDTO);
}
}
捕获(例外情况除外){
addFatalMessage(“我们无法满足您的请求,请稍后再试”);
例如printStackTrace();
}
}
公共数据模型getContactListTable(){
如果(contactListTable==null){
contactListTable=新的ListDataModel(contactList);
}
返回contactListTable;
}
public void setContactList(ArrayList contactList){
this.contactList=联系人列表;
}
}
我刚刚注意到,如果我将其更改为sessionscope,它就会工作。问题是我没有在Websphere中正确设置JSF2.0。在遵循以下设置说明后,它工作正常: