Управляемые компоненты и TabContainer - PullRequest
2 голосов
/ 13 марта 2012

Я задаю этот вопрос от имени одного из моих разработчиков. Сам не разбирался в деталях.

Предположим, у вас есть простой управляемый компонент (= контакт). Этот компонент имеет метод для получения контактов firstName.

Я могу открыть xpage и привязать bean-компонент к полю computedText # {contact.firstName}

В нашем приложении мы используем tabContainer для открытия нескольких документов одного типа (контакта). Как мне использовать мой боб в контейнере?

лица-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. Он должен получить «ссылку» на открытый документ, когда документ открывается на вкладке и каждый раз, когда переключается обратно на эту вкладку. И это без использования какого-либо источника данных, потому что это то, что должно быть сделано самим управляемым компонентом.

Так что, надеюсь, это помогло немного лучше понять проблему. Если нет, пожалуйста, спросите еще раз.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Мой совет: сделать еще один метабол, реализующий интерфейс карты. Измените его метод get для создания экземпляра и возврата вашего компонента данных. Связывание может быть тогда:

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 голос
/ 13 марта 2012

Я не уверен, будет ли этот bean работать в requestScope, потому что у вас, вероятно, много частичных обновлений с помощью tabcontainer (возможно, попробуйте изменить его на область более высокого уровня).

1 голос
/ 13 марта 2012

Франтишек указывает в правильном направлении.Ваш запросный бин будет не бобом, а бобом.Затем вы можете использовать выражение типа

#{people[index].name}

для ссылки на конкретного человека.Люди будут управляемым компонентом, а индекс может быть либо UNID, либо номером табуляции.Я считаю, что позже легче реализовать.вам нужно иметь функцию loadPerson (index) = UNID для загрузки существующего человека.Более подробную информацию об использовании языка Expression можно найти здесь: Sun Документация Oracle JSF или некоторые Материалы курса .Надеюсь, это поможет.

...