我代表我的一位开发人员问这个问题。我自己没有看过细节。
假设您有一个简单的托管bean(= contact)这个bean有一个方法来获取联系人firstName。
我可以打开一个xpage并将bean绑定到computedText字段#{contact.firstName}
在我们的应用程序中,我们使用tabContainer打开多个相同类型(联系人)的文档。 我如何在容器中使用我的bean?
faces-config.xml中:
<managed-bean>
<managed-bean-name>person</managed-bean-name>
<managed-bean-class>com.package.Person</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Java Bean类:
public class Person implements Serializable {
private String strDocumentID;
private Document docData;
private String strFirstName;
private String strLastName;
private static final long serialVersionUID = 2934723410254681213L;
public Person() {
//setting the DocumentUniqueID of the current in a tab opened document
//attention: there could be more than one open tab, all with different documents
//and even different document types; and it is possible to switch back and forth between tabs
//DocumentId = ???;
//Setting the values from the stored document to the object
//setValues();
}
private void setValues() {
try {
Session session=NotesContext.getCurrent().getCurrentSession();
Database currdb=session.getCurrentDatabase();
docData=currdb.getDocumentByUNID(DocumentId);
setStrFirstName(docData.getItemValueString("FirstName"));
setStrLastName(docData.getItemValueString("LastName"));
} catch (NotesException e) {
throw new FacesException("Could not open document for documentId "+ DocumentId, e);
}
}
public Document getDataDocument() {
return docData;
}
public void setDataDocument(Document docData) {
this.docData = docData;
}
public String getDocumentId() {
return DocumentId;
}
public void setDocumentId(String documentId) {
DocumentId = documentId;
}
public String getStrFirstName() {
return strFirstName;
}
public void setStrFirstName(String strFirstName) {
this.strFirstName = strFirstName;
}
public String getStrLastName() {
return strLastName;
}
public void setStrLastName(String strLastName) {
this.strLastName = strLastName;
}
}
带有计算字段的自定义控件:
person.strFirstName
所以,问题是Person Class的构造函数。当在选项卡中打开文档并且每次切换回此选项卡时,它需要获取打开文档的“链接”。而且这不使用任何数据源,因为这是托管bean本身应该做的事情。
所以,希望有助于对问题有所了解。 如果没有,请再次询问。
答案 0 :(得分:3)
我的建议: 使另一个meta bean实现map接口。改变它的getter来实例化并返回你的数据bean。然后可以绑定:
meta[someparamwithunid].field
保存将是:
meta[someparamwithunid].setValues()
像这样:
public class People implments java.util.Map {
Map<String,Person> people = new HashMap<String,Person>();
public Person get(String unid) {
if people.keySet().contains(unid) {
return people.get(unid)
} else {
// make instance and store it in people map, return it
}
// implement other methods
}
对于视图范围,我认为并发没有问题。
答案 1 :(得分:1)
弗兰蒂谢克指出正确的方向。您的请求bean不是人bean,而是人bean。然后,您可以使用像
这样的表达式#{people[index].name}
指特定的人。人们将是托管bean,索引可以是UNID或标签号。我发现后一个更容易实现。你需要有一个loadPerson(index)= UNID函数来加载现有的人。有关表达式语言使用的更多信息,请访问:
Sun Oracle JSF documentation或某些Course materials。
希望有所帮助。
答案 2 :(得分:1)
我不确定这个bean是否可以在requestScope中工作,因为你可能会使用tabcontainer进行大量的部分刷新(或者尝试将其更改为更高级别的范围)。