托管豆和TabContainer

时间:2012-03-13 08:31:09

标签: xpages managed-bean

我代表我的一位开发人员问这个问题。我自己没有看过细节。

假设您有一个简单的托管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本身应该做的事情。

所以,希望有助于对问题有所了解。 如果没有,请再次询问。

3 个答案:

答案 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进行大量的部分刷新(或者尝试将其更改为更高级别的范围)。