JSF / Java Design Вопрос - PullRequest
       22

JSF / Java Design Вопрос

0 голосов
/ 13 января 2011

Я использую JSF 2.0

В настоящее время у меня есть один контроллер Java, который называется Contacts.java.Там у меня есть список адресов, хранящихся в виде переменной-члена

List<Addresses> addresses;

Когда мое приложение загружает, оно отображает группу контактов, и вы можете нажать на контакт, чтобы «открыть его», чтобы просмотреть его данные.,Когда вы нажимаете на контакт, contactId передается методу, который заполняет список на основе contactId.Затем он отображает данные.

У меня также есть набор функций, которые добавляют адрес в список, удаляют адрес, обновляют и т. Д., Все они зависят от этого contactId.

Я рассматривал возможность разделения моего Contacts.java на два контроллера Contacts.java и Addresses.java, потому что в адресах так много логики, что я полагал, что это должен быть отдельный класс.

Проблема, с которой я борюсь, заключается в том, что, если я переместлю всю логику, связанную с адресами, в Addresses.java, ей нужно каким-то образом иметь ссылку на contactId, выбранный после времени компиляции.

Во время компиляции адресаскомпилирует поиск текущего contactId при заполнении списков адресов в конструкторе.Он не будет установлен на этом этапе, потому что contactId устанавливается, когда пользователь выбирает контакт в приложении.

Это плохая идея дизайна?Я очень новичок в Java и ООП и не до конца понял, как их разбить на части.Любая помощь будет оценена.

1 Ответ

2 голосов
/ 13 января 2011

В целом, один компонент на представление / форму предпочтительнее, но это также зависит от того, используете ли вы асинхронные запросы или нет (ajax или нет).Что касается передачи данных, существует несколько способов в зависимости от источника, цели и / или маршрута.

Во время компиляции адреса будут компилироваться в поисках текущего contactId, когда он заполняет список адресов в конструкторе.Однако он не был установлен в этот момент, потому что contactId устанавливается, когда пользователь выбирает контакт в приложении.

В вашем конкретном случае вы, вероятно, ожидаете, что конструктор /postconstruct - единственный способ загрузить данные.Это неправда.Вы также можете сделать это в методах события (действия).Например,

<h:dataTable value="#{contacts.list}" var="contact">
  <h:column>
    #{contact.name}
  </h:column>
  <h:column>
    <h:commandButton value="View info" action="#{contacts.view(contact)}">
  </h:column>
</h:dataTable>

И затем в компоненте поддержки Contacts (вам нужно только сделать List<Address> и List<Phone> свойством Contact с соответствующими методами получения и установки)

public String view(Contact contact) {
    this.contact = contact;
    contact.setAddresses(addressDAO.list(contact));
    contact.setPhones(phoneDAO.list(contact));
    return "view";
}

А затем на странице, связанной с view:

<h:dataTable value="#{contacts.contact.addresses}" var="address">
    ...
</h:dataTable>
<h:dataTable value="#{contacts.contact.phones}" var="phone">
    ...
</h:dataTable>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...