我真的很喜欢JBoss Seam应用程序框架.由于JSF / EJB / JPA之间的注入/拒绝和紧密集成的概念在
Java应用程序框架中相对稀少,因此我一直在寻找一些用于设计模式和使用此框架的最佳实践的良好资源.我已经倾注了关于这个主题的例子和几本书.但是,我对与传统J2EE设计模式相比的实际设计模式更感兴趣.例如,传统DAO与EntityHome / EntityQuery.业务逻辑应该在哪里执行?在Action类中?还是在专门的服务类?我非常感谢Seam开发人员可以提供的任何经验.谢谢!
解决方法
您可以使用许多有用的模式.
传统方法
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元素创建别名
<factory name="account" value="#{accountHome.instance}"/> /** * view * * Notice account will be evaluated as accountHome.instance */ <h:commandButton value="Deposit" action="#{account.remove}"/>
没有其他的.使用Either EntityHome(JPA)或HibernateEntityHome(Hibernate)时请记住,通常需要覆盖一些方法以提高性能,如下所示
@Name("accountHome") public class AccountHome extends EntityHome<Account> { /** * Override any method you want right here */ }
关于业务逻辑???您可以将其放在服务层中,也可以使用域驱动设计方法.请参阅here,它更符合您的要求
测试:使用Seam捆绑的测试组件.查看Seam示例目录了解如何在不进行部署的情况下执行测试
如果可能,请使用seam-gen生成项目. Seam in Action书,第2章,可以很好地了解如何启动seam-gen功能.仔细读.任何seam-gen生成的项目都可以在NetBeans和Eclipse中打开和测试
JSF组件:看看here
还有更多:不要再使用@ Out-jction了.请改用@Factory. @ Out-jection将被弃用,以支持@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>
好的,不要
另一个资源在这里(pdf格式)