Как создать экземпляр второго управляемого компонента на xpage

У меня есть страница xpage, на которой я хочу, чтобы пользователь ввел четыре поля ввода, а затем создал новый документ, и немедленно отобразил документ в сетке данных dojo на той же странице. Я использую управляемые bean-компоненты для всех внутренних данных. У меня есть один компонент для основного документа и второй компонент для каждой связанной информации. Я свяжу их вместе, используя UNID. Все поля ввода связаны с shipperBean.

Моя проблема заключается в том, что родитель и только первый поддокумент создан. Кажется, мне нужно создать новый бин, но я подумал, что это было сделано для вас, как в "управляемом" для вас.

В моей кнопке у меня есть следующие SSJS:

var POdata:NotesDatabase = session.getDatabase(database.getServer(), "PO\\PO-data");
lineItemBean.saveLineItem(POdata);  //MUST save line item in order to tie Shipper to Line Item
var liUNID = lineItemBean.getThisUNID();
var poUNID = lineItemBean.getParentUNID();
shipperBean.saveShipper(POdata, liUNID, poUNID);
shipperBean.deleteCurrentShipper();

Кнопка выполняет частичное обновление таблицы, содержащей ввод. Метод saveShipper() сохраняет бин в новый документ в другом файле nsf. Метод deleteCurrentShipper() просто устанавливает для экземпляра vars значение null. Это заставляет их быть уничтоженными и готовыми к следующему документу. Внешний интерфейс корректно обновляется, чтобы отразить стирание значений. Любой ввод значений после первого раза не сохраняется в новом документе, хотя они очищаются каждый раз во внешнем интерфейсе.

Нужно ли мне каждый раз создавать новый экземпляр, или я могу использовать один и тот же экземпляр, как пытался?

Должен ли я использовать POJO вместо этого и создать его сам?

Я не должен использовать SSJS и делать все это в другом методе Java и вызывать это?

Должен ли я сделать второй боб свойством первого?

Есть что-то простое, что мне не хватает?

3 ответа

Решение

Я бы посоветовал не использовать управляемый компонент, так как он, по-видимому, не добавляет ценности вашему процессу. Фактически, попытка сброса bean-компонента и его содержимого может вызвать проблемы. Вместо этого определите серию классов Java и используйте источник данных объекта, который ограничен ожидаемым жизненным циклом (обычно просмотр или запрос). Затем метод create будет устанавливать новый экземпляр родительского класса каждый раз, когда создается новый "объект". Попробуйте использовать как можно меньше бизнес-логики, закодированной в SSJS. Целью SSJS должно быть связывание внешнего интерфейса (XSP). код) на сервер (классы Java). То есть, когда я нажимаю кнопку A, он должен вызывать один вызов метода, применимый к родительскому классу. Создание дополнительных (дочерних) классов для инкапсуляции различных объектов. Как Кнут предложил нам коллекцию классы, если у вас есть отношение многие-к-одному. Затем метод save вашего родительского класса может инициировать сохранение дочерних классов обратно в документы Notes.

Я бы предложил использовать этот подход: http://www.mindoo.de/web/blog.nsf/dx/16.07.2009095816KLEBCY.htm

Ваш бин должен реализовывать интерфейс Map и в методе get() предоставлять дочерние объекты в соответствии с ключевым параметром. Таким образом, вы можете иметь очень простые и "красивые" привязки.

Допустим, у вас есть bean-компонент "table", предоставляющий объектам "line" (дочерние объекты не определены как bean-компоненты в faces-conig.xml!). В методе get() таблицы вы создадите и кешируете или извлекаете из кеша соответствующий объект строки. EL для некоторой ячейки это "#{table[row_key].attribute}".

Если вы определяете "управляемый" bean-компонент в face-config.xml, то это означает, что он автоматически создается при первом использовании. Но это будет только один экземпляр в пределах определенной вами области (например, сеанс). Каждое использование управляемого компонента ссылается на этот экземпляр.

В вашем примере это означает, что lineItemBean создается только при первом нажатии кнопки, а затем один и тот же экземпляр используется для каждого следующего нажатия кнопки.

Я думаю, что в вашем случае лучше пойти по этому пути:

  • создать List<lineItemBean> в вашем shipperBean
  • добавить новый lineItemBean к списку в методе saveShipper() и создавать документы в базе данных там
  • добавить метод getAllLineItems() который возвращается List<lineItemBean> для предоставления данных в вашей сетке данных
Другие вопросы по тегам