`

JSF+EJB3架构实际项目

    博客分类:
  • EJB3
阅读更多
想用JSF1.2+EJB3做个项目,先画了个架构图,拿上来让各位指点指点,有何不妥之处。。
  • 描述: jsf1.2+ejb3
  • 大小: 34.5 KB
分享到:
评论
12 楼 wetouns 2008-05-28  
怎么不用SEAM?
11 楼 qiujy 2008-03-10  
这样做,也不失为省时,省力的做法。谢谢fxy1949。
10 楼 fxy1949 2008-03-04  
In this case, if the condition is quite complicated, you might need a helper class to wrap all the condition data needed,and pass it to session bean as a parameter.

Put it very simple,for instance:

1) In Jsp(or xhtml) pages:

<div class="light col input-field">
     <h:inputText id="staffName" value="#{xxxBean.staffQueryCondition.staffName}" required="true"/>
</div>
<div class="light col input-field">
     <t:inputDate id="startTime" value="#{xxxBean.staffQueryCondition.startTime}" required="true"/>
</div>
<div class="light col output-field">
     <t:inputDate id="endTime" value="#{xxxBean.staffQueryCondition.endTime}" rquired="true"//>
</div>

......

<!-- Display search result -->
        <div id="result" class="section">
              <t:dataTable id="staffList"
                     value="#{xxxBean.staffList}" var="staff"
                     renderedIfEmpty="false"
                     preserveSort="true"
                     rowIndexVar="rowIndex"
                     rows="#{searchAssetBean.searchResultWrapper.rowsPerPage-5}"
                     styleClass="datatable"
                     preserveDataModel="false"
                     first="0"
                     varDetailToggler="detailToggler">
                     <h:column>
                         <f:facet name="header">
                             <h:outputText value="#{msg.no}"/>
                         </f:facet>
                         <h:outputText value="#{rowIndex+1}"/>
                     </h:column>
                     <h:column>
                         <f:facet name="header">
                             <t:commandSortHeader columnName="name" arrow="true" >
                                 <h:outputText value="#{msg.external_id}"/>
                             </t:commandSortHeader>
                         </f:facet>
                         <h:outputText value="#{staff.name}"/>
                     </h:column>    

                  ......
   
              </t:dataTable>
        </div>

2) JSF managed bean examples:

public class xxxBean extends xxxManagedBean
{
    static final Logger log=Logger.getLogger("xxxBean");

    private StaffQueryCondition staffQueryCondition;
    private List<Staff> staffList;
    ......

    public String query()
    {

        staffList=xxxxSessionBean.get(staffQueryCondition);

        ....

        return "xxxView";
    }

}


9 楼 qiujy 2008-03-04  
呵呵,我对JSF不是很了解,只是用JSF做过两个项目,以前都是用JSF+Spring+Hibernate。
如果用你说的PO一对象从持久层传到页面,就有一个这样的问题,我做一个员工的查询,我的员工PO类中只有入职时间,我现在要做个组件条件查询在某个时间段入职的员工,这里是不是得再构造个类似ActionForm对象了。请指教。。
8 楼 fxy1949 2008-03-03  
<p>"但感觉显示层的显示对象还是需要的,要不然有些数据在页面显示会有麻烦"<br/><br/>I think if you have tried JSF a little bit, you will find out that how easy and well JSF handles this matter.<br/><br/>1) In Jsp(or xhtml) pages,the jsf components look like following:<br/><br/>&lt;div class="light col input-field"&gt;<br/>        &lt;h:inputText id="mediaName" value="#{<span style='color: red;'>mediaBean</span>.<span style='color: #3366ff;'>media</span>.<span style='color: #ff00ff;'>name</span>}" size="50" maxlength="50" required="true"/&gt;<br/>&lt;/div&gt;<br/> &lt;div class="light col output-field"&gt;<br/>      &lt;h:outputText id="mediaComments" value="#{<span style='color: #ff0000;'>mediaBean</span>.<span style='color: #0000ff;'>media</span>.<span style='color: #ff00ff;'>comments</span>}"/&gt;<br/> &lt;/div&gt;<br/> </p><p>&lt;div class="light col input-field"&gt;<br/>     &lt;h:selectOneMenu id="format" value="#{<span style='color: #ff0000;'>mediaBean</span>.<span style='color: #3366ff;'>media</span>.<span style='color: #ff00ff;'>format</span>.id}" validator="#{mediaBean.validateSelection}" required="true"&gt;<br/>          &lt;f:selectItems value="#{<span style='color: #ff0000;'>mediaBean</span>.<span style='color: #00ff00;'>tapeFormatList</span>}"/&gt;<br/>        &lt;/h:selectOneMenu&gt;<br/>/div&gt;<br/><br/><span style='color: #ff0000;'>mediaBean</span>: JSF managed Beans</p><p><span style='color: #3366ff;'>media</span>: Pojo(+annotation),entity bean</p><p><span style='color: #ff00ff;'>name,comments,format</span>: properties of Entity bean "Media" </p><p> </p><p><span style='color: #00ff00;'>tapeFormatList</span>: List&lt;SelectItem&gt;</p><p> </p><p>2) JSF managed bean examples:</p><p> </p><p>public class MediaBean extends CmmManagedBean<br/>{<br/>    static final Logger log=Logger.getLogger("MediaBean");<br/>      <br/>    private Media <span style='color: #ff0000;'>media</span>;<br/><br/>private List <span style='color: #00ff00;'>tapeSegmentList;</span><br/>    <br/>    private boolean validAssetFlag;<br/>    private boolean validMediaFlag;<br/>    private boolean editFlag;<br/>    private int labelOffset;<br/>......<br/><br/>}</p><p> </p><p>3) Entity Bean</p><p> </p><p>package uk.co.ondemand.cmm.service.persistence;<br/><br/>import java.util.Date;<br/>import javax.persistence.*;<br/><br/>@Entity<br/>@Table(name = "CMM_MEDIA_ASC")</p><p> </p><p>public class Media extends GenericEntity<br/>{<br/>    @Id<br/>    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ")<br/>    @SequenceGenerator(name="SEQ", sequenceName="asset_container_id", allocationSize=1)<br/>    @Column(name = "ID", nullable = false)<br/>    protected long id;<br/><br/>    @Column(name = "CONTAINER_TYPE", nullable = false,insertable=false, updatable=false)<br/>    private String containerType;<br/><br/>    @Column(name = "NAME", nullable = false)<br/>    private String name;</p><p> </p><p>@Column(name = "COMMENTS") <br/>    private String comments; </p><p> </p><p>@JoinColumn(name = "FORMAT", referencedColumnName = "ID")<br/>    @ManyToOne<br/>    private CmmEnumeration format=new CmmEnumeration();</p><p> </p><p> <span style='color: #ff0000;'>@Transient </span> </p><p>private List foldersList;</p><p>  <span style='color: #ff0000;'>//use "Transient" annotion for additional fields not persistent,but used in JSF component value binding for carrying data.</span></p><p> </p><p> .....</p><p><br/>    /** Creates a new instance of Media */<br/>    public Media() {<br/>    }<br/>  <br/>    /**<br/>     * Gets the id of this AssetContainer.<br/>     * @return the id<br/>     */<br/>    public long getId() {<br/>        return this.id;<br/>    }<br/><br/>    /**<br/>     * Sets the id of this AssetContainer to the specified value.<br/>     * @param id the new id<br/>     */<br/>    public void setId(long id) {<br/>        this.id = id;<br/>    }<br/><br/> .....  <br/><br/>    public String getName() {<br/>        return this.name;<br/>    }<br/><br/>    public void setName(String name) {<br/>        this.name = name;<br/>    }<br/><br/>    public CmmEnumeration getFormat() {<br/>        return this.format;<br/>    }<br/><br/>    public void setFormat(CmmEnumeration format) {<br/>        this.format = format;<br/>    }<br/>   ......<br/>}<br/> </p><p>4) You also can use converters for some data type conversion  between pages to models </p><p> </p><p>faces-config.xml</p><p>...</p><p>&lt;converter&gt;</p><p>&lt;converter-for-class&gt;java.lang.Boolean&lt;/converter-for-class&gt; <br/>  &lt;converter-class&gt;uk.co.ondemand.cmm.web.jsf.YesNoBooleanConverter&lt;/converter-class&gt;<br/> &lt;/converter&gt;<br/> &lt;converter&gt;<br/>  &lt;converter-for-class&gt;java.util.Date&lt;/converter-for-class&gt;<br/>  &lt;converter-class&gt;uk.co.ondemand.cmm.web.jsf.CmmDateTimeConverter&lt;/converter-class&gt;<br/> &lt;/converter&gt;<br/> &lt;converter&gt;<br/>  &lt;converter-for-class&gt;java.sql.Timestamp&lt;/converter-for-class&gt;<br/>  &lt;converter-class&gt;uk.co.ondemand.cmm.web.jsf.CmmDateTimeConverter&lt;/converter-class&gt;<br/> &lt;/converter&gt;<br/>.....</p><p>&lt;managed-bean&gt;<br/>  &lt;managed-bean-name&gt;mediaBean&lt;/managed-bean-name&gt;<br/>  &lt;managed-bean-class&gt;uk.co.ondemand.cmm.web.managedbean.MediaBean&lt;/managed-bean-class&gt;<br/>  &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br/> &lt;/managed-bean&gt;</p><p> </p><p> </p><p>Hope this is helpful.</p><p> </p>
7 楼 qiujy 2008-03-02  
fxy1949 写道
In my point of view,this structure is not so good. In your pattern, you don't benifit a lot from EJB3 and JSF. It's just the same like using struts1, spring, hibernate.

The main reasons are as following:

1) “显示对象”(Is it like actionForm in Struts1?), VO and PO are not needed any more,and use POJOs(+Annotation) as EJB3 entity Bean,which could also be used as VO,and be passed to web layer.In JSF "managed beans" and JSPs( or xhtml),use these beans as JSf compoment value binding objects.

In some cases, we need add some wrapper classes which may wrap several POJOs(EJB3 entity beans) for conmunication between web layer and business logic layer.

2) In EJB3 Session Bean,"EntityManger" is used for data handling. You will soon find out that DAO layer seems unnecessary. Consider no DAO layer first,add it when absolutely needed in case very complex business logic.


In my previous project using JSF+EJB,put it simply,the pattern is "Facelets--> .xhtml--> managedBean-->EJB Session Bean--> EJB3 Entity Bean -> database".

we use POJOs(+some wrapper classes) 1)for page component binding(in jsp or .xhtml); 2)for data transfer(as VO)between layers;and 3)for data persistence(as PO). This dramatically reduces the code for data conversion.



我说的显示对象就是类似Struts的ActionFrom的东西。
很是受你的启发。我也一直觉得这样设计太过复杂,而且走入了SSH的圈套,大量的Bean的创建,属性挎贝执行效率会受影响。我目前新的设计见附图。也像你说的:Facelets --> ManagedBean -->EJB3 SessionBean(业务层) -->JPA (持久层) ---> DataBase(EIS层).这样就把Dao层去了,把VO和PO合并了,但感觉显示层的显示对象还是需要的,要不然有些数据在页面显示会有麻烦(robbin很早的一个帖子就讨论过这个问题)。请指点。。。
6 楼 w_y_g 2008-02-28  
补充一点,这些年大家对EJB都不是非常关注,大家的注意力都被吸引到了Spring和Hibernate,我自己开发的一点感触,其实EJB本身还是很优秀,只是对于开发而言不太具有亲和力,写了不长的业务代码,但是一个Deploy就要等半天,所以做着做着容易丧失耐性。

最近有个想法,不过没有时间去做,因为spring和hibernate从功能上来讲,和EJB没有太大的差别,除却AOP外,spring的功能与EJB Stateless Session一样,Hibernate和CMP一样,由于这些技术都基于配置,而且基本的参数类型也比较相似,所以可以使用spring,hibernate进行开发,用EJB运行,spring和hibernate的配置文件是可以转换为EJB配置的,这样一方面可以利用spring和hibernate进行便捷的开发,同时还可以利用EJB的优异性能进行运行。
5 楼 w_y_g 2008-02-28  
整个结构没有什么问题,挺清楚的,基本是现在大家都认可的一种方式,不过在实施的时候还需要把握的准确一些,有些问题需要注意,比如层次之间的清晰,如界面层的东西不要传递到后面去。还有就是JPA的设计了,很多基于类似于JPA的设计容易受先前的一些影响,比如走着走着就走向以前的SQL老路,等等这些。
4 楼 fxy1949 2008-02-27  
In my point of view,this structure is not so good. In your pattern, you don't benifit a lot from EJB3 and JSF. It's just the same like using struts1, spring, hibernate.

The main reasons are as following:

1) “显示对象”(Is it like actionForm in Struts1?), VO and PO are not needed any more,and use POJOs(+Annotation) as EJB3 entity Bean,which could also be used as VO,and be passed to web layer.In JSF "managed beans" and JSPs( or xhtml),use these beans as JSf compoment value binding objects.

In some cases, we need add some wrapper classes which may wrap several POJOs(EJB3 entity beans) for conmunication between web layer and business logic layer.

2) In EJB3 Session Bean,"EntityManger" is used for data handling. You will soon find out that DAO layer seems unnecessary. Consider no DAO layer first,add it when absolutely needed in case very complex business logic.


In my previous project using JSF+EJB,put it simply,the pattern is "Facelets--> .xhtml--> managedBean-->EJB Session Bean--> EJB3 Entity Bean -> database".

we use POJOs(+some wrapper classes) 1)for page component binding(in jsp or .xhtml); 2)for data transfer(as VO)between layers;and 3)for data persistence(as PO). This dramatically reduces the code for data conversion.

3 楼 elfer 2008-02-27  
基本的结构是没错的,我不是很明白“显示对象”是用来做什么的
2 楼 qiujy 2008-02-23  
各位从EJB设计的角度分析下,这样行不行。。至于seam,它只是这两者的一个粘合剂。还是想先从JavaEE5的技术角度来完成一个项目。
1 楼 jones 2008-02-23  
seam已经为你做好一切了,嘿嘿

相关推荐

    SSH框架和JPA+EJB+JSF框架的比较

    ### SSH框架和JPA+EJB+JSF框架的比较 #### 一、SSH框架解析 SSH框架是由Struts、Spring和Hibernate三个独立的框架组成的,它们分别负责不同的职责:Struts用于构建MVC架构的表现层;Spring作为核心的依赖注入(DI...

    Java Web JSF +Richfaces+EJB+JPA航空订票系统

    Java Web JSF + Richfaces + EJB + JPA 航空订票系统是一个综合性的应用,涵盖了多种Java技术,用于构建高效的、可扩展的、易于维护的Web应用程序。在这个系统中,每项技术都有其特定的角色和功能,共同协作以实现...

    基于JSF+EJB+JPA实现的酒店预订系统.7z

    【标题】"基于JSF+EJB+JPA实现的酒店预订系统"是一个综合性的Java Web应用,使用了三种核心技术:JavaServer Faces (JSF),Enterprise JavaBeans (EJB) 和 Java Persistence API (JPA)。这个系统旨在为用户提供一个...

    Struts+Spring+JSF+Hibermate+EJB+XML+WebService+Ajax(part1)

    【标题】"Struts+Spring+JSF+Hibernate+EJB+XML+WebService+Ajax(part1)" 描述了一个全面的J2EE开发教程,涵盖了多个关键的技术栈,包括但不限于MVC框架Struts,依赖注入框架Spring,JavaServer Faces(JSF),持久...

    经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发-利用JMS实现企业消息处理

    在Java EE企业应用开发中,JSF(JavaServer Faces)、EJB 3(Enterprise JavaBeans 3.0)和JPA(Java Persistence API)是核心的组件,它们共同构建了强大的后端服务架构。本实战教程将深入探讨如何在WebLogic和...

    使用 Spring,JSF,EJB3 设计企业应用程序

    在企业级应用开发中,Spring、JavaServer Faces (JSF) 和 Enterprise JavaBeans 3 (EJB3) 是三个核心的框架和技术。这篇博客文章详细介绍了如何整合这些技术来构建高效且可扩展的企业应用程序。 首先,Spring 框架...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    介绍了Java EE规范的三大主要规范JSF(JavaServer Faces)、EJB 3(Enterprise JavaBeans 3)和JPA(Java Persistence API),并以ejb 3+jpa为基础来构建Java EE应用,针对当前流行和规范的企业级Java应用架构进行了...

    JSF1.2+EJB3.0实现的一个项目实例.zip

    **JSF 1.2 和 EJB 3.0 技术详解** JavaServer Faces (JSF) 是一种用于构建用户...通过分析项目代码和配置文件,我们可以学习到如何在实际环境中运用 JSF 1.2 和 EJB 3.0,以及它们在现代 Java EE 开发中的重要角色。

    JSF-EJB3.rar_EJB3.rar_base.util.EJBUtil_ejb jsf_jsf ejb3_jsf mys

    在"JSF-EJB3.rar"这个压缩包中,我们找到了一个使用JSF和EJB3结合开发的示例项目。项目包含两个主要部分:"EJB3DemoEJB"和"EJB3DemoWeb"。前者代表了EJB3的实现,包含了业务逻辑组件(Session Beans),而后者则为...

    JSF+JPA+CDI 框架

    综上所述,JSF+JPA+CDI 架构不仅能够提供一个高效、灵活且易于扩展的开发平台,还能够显著降低开发成本并提高应用程序的质量。随着 Java 技术的不断发展和完善,这套组合在未来仍有很大的发展空间。

    JSF基于EJB Hibernate Spring整合开发与项目

    ### JSF基于EJB Hibernate Spring整合开发与项目 #### 一、JSF基础知识 ##### 1.1 了解JSF JavaServer Faces (JSF) 是一个用于构建基于Web的应用程序的标准Java EE技术。它提供了丰富的组件库以及一套声明式的...

    精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第16章代码

    "精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第16章代码",我们探讨的是一个使用JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Hibernate以及Spring框架进行企业级Web应用开发的实际案例。...

    jsf入门和jsf+in+action

    在“jsf+in+action”这部分,我们可以预期深入探讨如何在实际项目中运用JSF。这可能涵盖JSF与其他技术(如EJB、CDI、PrimeFaces等库)的集成,以及最佳实践和常见问题的解决策略。 通过学习提供的"jsf资料",初学者...

    EJB3+JSF的例子!

    在EJB3+JSF的项目中,通常会有一个JSF的Managed Bean,它通过`@EJB`注解注入EJB3的Session Bean。例如: ```java @ManagedBean @ViewScoped public class MyManagedBean { @EJB private MyService myService; ...

    JSF+Seam帮助文档.rar

    通过阅读JSF入门.pdf,你可以掌握JSF的基本用法和原理,然后通过Seam_2.0_Reference_zh_CN.pdf深入探究Seam如何增强JSF的功能,以及如何在实际项目中运用这些技术。这将有助于你提升在J2EE环境下的开发能力,特别是...

    JSF+Spring+Hibernate的实例讲解.doc

    JSF的核心是MVC(模型-视图-控制器)架构,其中视图由JSF组件构成,模型由JavaBean或EJB代表,而控制器则负责处理用户的请求和更新视图。 **Spring框架** 是一个全面的后端开发框架,提供了依赖注入(DI)和面向切...

    图书管理系统(strtust+EJB)

    总的来说,这个图书管理系统展示了如何利用Struts和EJB3.0构建一个实际的MIS系统,同时也涵盖了Java Web开发的多个重要方面,如MVC架构、持久化、事务管理和服务整合。对于学习和理解Java EE开发技术,以及提升实际...

    JSF项目中seam的配置

    Seam 是一个强大的Java EE框架,它主要用于简化JavaServer Faces (JSF)应用程序的开发,同时提供了对EJB 3、CDI(Contexts and Dependency Injection)、Ajax等技术的集成。在JSF项目中配置Seam,可以充分利用其优势...

    ejb jsf开发的员工管理crud源代码

    【ejb jsf开发的员工管理crud源代码】是一个基于企业级Java技术的项目,它利用Enterprise JavaBeans(EJB)和JavaServer Faces(JSF)框架实现了员工数据的创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete...

    EJB3.0+JSF例子

    3. **事务管理**:EJB中的事务管理特性可以确保JSF操作的原子性,即使在用户界面层面出现错误,也能保证数据的一致性。 4. **异常处理**:JSF可以捕获EJB抛出的异常,并在用户界面中适当地显示错误信息。 5. **...

Global site tag (gtag.js) - Google Analytics