首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JBoss Seam设计模式?

JBoss Seam设计模式?
EN

Stack Overflow用户
提问于 2010-08-03 04:44:41
回答 1查看 1.9K关注 0票数 6

我真的很喜欢JBoss Seam应用程序框架。由于在Java应用程序框架中,JSF/EJB/JPA之间的注入/退出和紧密集成的概念相对较少,因此我正在寻找一些关于设计模式的好资源和使用此框架的最佳实践。我已经在这个主题上倾注了大量的例子和几本书。然而,与传统的J2EE设计模式相比,我对现实世界的设计模式更感兴趣。例如,传统DAOs与EntityHome/EntityQuery。业务逻辑应该在哪里执行?在Action类中?还是在专用的服务类别中?我真的很感激有经验的Seam开发人员能给出的任何见解。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-03 08:14:39

你可以使用很多有用的模式。

传统方法

代码语言:javascript
运行
复制
view >> controller >> service >> domain

它可以被翻译成

代码语言:javascript
运行
复制
/**
  * 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组件的操作,那么使用如上所示的控制器可能是个不错的主意

您还可以使用

代码语言:javascript
运行
复制
view >> service >> domain

它基本上与上面所示的相同,但没有控制器

或者通过使用EntityHome / EntityQuery的内置中介器模式

代码语言:javascript
运行
复制
view >> domain

按照以下方式注册您的组件/WEB-INF/ EntityHome

代码语言:javascript
运行
复制
<framework:entity-home name="accountHome" entity-class="br.com.ar.seam.Account"/>

现在,您可以使用元素创建工厂别名

代码语言:javascript
运行
复制
<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)时,通常需要覆盖一些方法来提高性能,如下所示

代码语言:javascript
运行
复制
@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-jection。请改用@Factory。@Out-jection将被弃用,取而代之的是@Factory方法。

我认为查询最好存储在外部文件中,因为

  • It is maintainable

  • It is maintainable
  • It is readable

  • It is readable

如下所示

代码语言:javascript
运行
复制
<?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格式)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3391592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档