JBoss Seam 设计模式?

发布于 2024-09-12 17:07:44 字数 1539 浏览 3 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转瞬即逝 2024-09-19 17:07:44

您可以使用许多有用的模式。

传统方法

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
      */

}

关于业务逻辑???您可以将其放入服务层中,也可以使用领域驱动设计方法。请参阅这里更适合您想要的

测试:使用Seam捆绑的测试组件。查看 Seam examples 目录 以了解如何在不部署的情况下执行测试的概述

如果可能,请使用 seam-gen 来生成您的项目。 Seam in Action 书的第 2 章可以很好地洞察如何启动 seam-gen 功能。 仔细阅读。任何seam-gen生成的项目都可以在NetBeans和Eclipse中打开和测试

JSF组件:看看此处

还有更多内容:不要再使用@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:
敏捷RIA开发框架

There is a lot of useful patterns you can use.

Traditional approach

view >> controller >> service >> domain

Which can be Translated To

/**
  * 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);
    }

}

If you have some actions which needs To manipulate JSF components on The server-side, use a controller as shown above can be a nice idea

You can also use

view >> service >> domain

It is basically The same approach shown above but without controller

Or by using built-in mediator pattern by using EntityHome / EntityQuery

view >> domain

Register your EntityHome as follows /WEB-INF/components.xml

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

Now you can create an alias by using factory element

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

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

Nothing else. Keep in mind when using Either EntityHome (JPA) or HibernateEntityHome (Hibernate) you usually need To override some methods To improve performance as follows

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

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

}

About business logic ??? You can put it inside your service layer or you can use domain-driven-design approach. See here which fits better what you want

Testing: Use Seam bundled Testing components. Take a look at Seam examples directories To get an overview how you can perform Testing without deployment

If possible, use seam-gen To generate your project. Seam in Action book, chapter 2, can gives a good insight how To startup seam-gen capabilities. read carefully. Any seam-gen generated project can be opened and Tested in NetBeans and Eclipse

JSF components: Take a look at here

There is more: Do not use @Out-jection anymore. Use @Factory instead. @Out-jection will be deprecated in favor of @Factory method.

I Think queries is better stored inside an external file because

  • It is readable
  • It is maintainable

As follows

<?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 one, don't

Another resource goes here (pdf format)

JBoss Seam:
Agile RIA Development Framework

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文