Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




我真的很喜欢JBoss Seam应用程序框架。由于Java应用程序框架中相对缺乏注入(inject)/注入(inject)和JSF/EJB/JPA之间紧密集成的概念,因此我一直在寻找一些好的资源来使用该框架的设计模式和最佳实践。我已经仔细阅读了有关该主题的示例和几本书。但是,我对与传统J2EE设计模式相比的实际设计模式更感兴趣。例如,传统的DAO与EntityHome/EntityQuery。应该在哪里执行业务逻辑?在 Action 课上?还是在专门的服务类(class)中?非常感谢经验丰富的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组件,请使用上面显示的 Controller 是一个不错的主意

您也可以使用
view >> service >> domain

基本上与所示的方法相同,但没有 Controller

或通过使用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}"/>

没有其他的。使用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功能。 仔细阅读。可以在NetBeans和Eclipse中打开任何由seam-gen生成的项目,并对其进行测试

JSF组件:看一看here

还有更多:不要再使用@ Out-jection。使用@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格式)

    JBoss Seam:Agile RIA Development Framework

    关于jsf - JBoss接缝设计模式? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3391592/

    10-10 19:22