2012-03-13 4 views
2

Я прошу этого скриста от имени одного из моих разработчиков. Я сам не заглядывал в детали.Управляемые бобы и TabContainer

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

Я могу открыть XPage и связать компонент с 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 Class:

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 

Таким образом, проблема заключается в конструкторе Класс личности. Он должен получить «ссылку» на открытый документ, когда документ открывается на вкладке и каждый раз при переключении на эту вкладку. И это без использования какого-либо источника данных, потому что это то, что должно делать сам управляемый компонент.

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

+0

Я думаю, что этот вопрос нужно больше информации. что вы пробовали? вы поместили поле computedText в контейнер табуляции? Что ты пытаешься сделать? любые ошибки? –

+1

Для каждого контакта мы открываем новую tabPane в tabContainer. Каждая tabPane содержит все элементы из контакта (firstname - только пример). Теперь у нас есть источник данных с идентификатором базового документа. Это работает до сих пор. теперь мы хотим заменить источник данных управляемым компонентом. Мой разработчик сказал мне, что он не может передать идентификатор в конструкторе. –

+0

Не могли бы вы отправить какой-то код из управляемого bean-компонента и вашего face-config и где этот управляемый bean-компонент извлекает свои данные? Звуки звучат так, как будто код работает неправильно. Вместо того, чтобы иметь управляемый компонент, который представляет контакт и заполняется данными с вашей xpage. Он должен быть управляемым компонентом, который извлекает данные контакта сам по себе и возвращает список контактных объектов, извлеченных из представления или что-то в этом роде, но это просто дикие гусы. – jjtbsomhorst

ответ

3

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

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

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

#{people[index].name} 

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

+0

Означает ли это, что я должен сначала прочитать ВСЕ-контактные документы, чтобы построить компонент pople bean и сохранить ВСЕ эту информацию в памяти? Или я полностью ошибаюсь? –

+1

Нет, у вас может быть «ленивый» загрузочный боб. Всякий раз, когда элемент управления хочет получить человека, он будет извлекать свои данные и помещать полученные контакты в карту. Всякий раз, когда кто-то хочет восстановить контакты снова, вы проверяете представление, откуда вы извлекли контакты, если он изменился. Если так восстановить данные и вернуть контакты. Если не вернуть кэшированные контактные объекты. – jjtbsomhorst

1

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

+0

не уверен, что вы прокомментировали мой метабайт или человеческий фасон Роберта. что касается метабайта, я не упомянул, чтобы он рассматривался как область видимости, просто потому, что переключение табуляции может потерять данные для компонента с запросом, если поля отсутствуют в опубликованных данных (скрытые вкладки) –