2010-08-02 5 views
6

Мне очень понравилась рамка приложения JBoss Seam. Поскольку понятие инъекции/выброса и тесное интеграция между JSF/EJBs/JPA относительно ограничено среди фреймворков Java-приложений, я искал некоторые хорошие ресурсы для шаблонов проектирования и лучших практик для использования этой структуры. Я вылил примеры и несколько книг по этому вопросу. Тем не менее, меня больше интересуют модели реального мира, которые сравниваются с традиционными шаблонами проектирования J2EE. Например, традиционные DAO или EntityHome/EntityQuery. Где должна выполняться бизнес-логика? В классах Action? Или в специализированных классах обслуживания? Я бы очень признателен за понимание, которое могут дать разработчики Seam. Благодаря!JBoss Seam Design Patterns?

ответ

8

Существует много полезных шаблонов, которые вы можете использовать.

Традиционный подход

view >> controller >> service >> domain 

Что можно перевести

/** 
    * view 
    */ 
<h:commandButton value="Deposit" action="#{accountController.removeAccount(account)}"/> 

/** 
    * controller 
    */ 
@Name("accountController") 
public class AccountController implements Serializable { 

    /** 
     * Usually a plain POJO or EJB 
     */ 
    private @In AccountService accountService; 

    public void removeAccount(Account account) { 
     accountService.removeAccount(account); 
    } 

} 

/** 
    * service 
    */ 
@Name("accountService") 
public class AccountServiceImpl implements AccountService { 

    private @In EntityManager entityManager; 

    public void removeAccount(Account account) { 
     entityManager.remove(account); 
    } 

} 

Если у вас есть какие-то действия , которая должна работать с компонентами JSF на серверной стороне, использовать контроллер, как показано выше может быть хорошей идеей

Вы также можете использовать

view >> service >> domain 

Это в основном Такой же подход показан выше , но без контроллера

или с помощью встроенного медиатора шаблона с помощью EntityHome/EntityQuery

view >> domain 

Зарегистрируйте свой EntityHome следующим образом /WEB -INF/components.xml

<framework:entity-home name="accountHome" entity-class="br.com.ar.seam.Account"/> 

Теперь вы можете создать псевдоним путем не используя ФАБРИКА элемент

<factory name="account" value="#{accountHome.instance}"/> 

/** 
    * view 
    * 
    * Notice account will be evaluated as accountHome.instance 
    */ 
<h:commandButton value="Deposit" action="#{account.remove}"/> 

ничего другого. Имейте в виду, при использовании Либо EntityHome (JPA) или HibernateEntityHome (Hibernate) обычно требуется, чтобы переопределить некоторые методы, чтобы улучшить производительность следующим

@Name("accountHome") 
public class AccountHome extends EntityHome<Account> { 

    /** 
     * Override any method you want right here 
     */ 

} 

О бизнес-логики ??? Вы можете поместить его в свой уровень обслуживания или использовать подход, основанный на домене. См. here, который подходит лучше всего, что вы хотите

Тестирование: использование компонентов, связанных с швом. Взгляните на Seam примеры каталоги Чтобы получить информацию о том, как вы можете выполнить Тестирование без развертывания

Если возможно, используйте seam-gen. Чтобы создать проект. Книга Seam в книге действий, глава 2, может дать хорошее представление о том, как запустить функции seam-gen. внимательно прочитал.Любой шов поколения создается проект может быть открыт и испытано в NetBeans и Eclipse,

компонентов JSF: Посмотрите на here

Существует еще: Не используйте @ Out-jection больше. Вместо этого используйте @Factory. @ Out-ject будет устаревать в пользу метода @Factory.

Думает запросы лучше хранятся внутри внешний файл, так как

  • Читает
  • Это ремонтопригодно

Как следует

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <query name="GIFT_CARDS_WITH_BUYER"> 
     <![CDATA[ 
      from 
       GiftCard c 
      left join fetch 
       c.buyer 
      where 
       c.recipientNotificationRequested = 1 
     ]]> 
    </query> 
    <query name="GIFT_CARDS_WITHOUT_NO_RELATIONSHIP"> 
     <![CDATA[ 
      from 
       GiftCard 
     ]]> 
    </query> 
</hibernate-mapping> 

Nice один, дон» t

Другой ресурс идет здесь (формат PDF)

JBoss Seam: Agile RIA Development Framework

+0

Wow! Теперь это подробный ответ. Большое спасибо за понимание! – Shadowman

+0

Справа, Артур - парней здесь :) – BalusC

+0

Хороший ответ. Но я бы держался подальше от Seam Application Framework. (EntityHome, EntityQuery и т. Д.) –