电话:0731-83595998
导航

EJB3.0+Beehive开发客户反馈系统

来源: 2017-12-22 09:18

 百度广告

  设计目标

  客户反馈系统作为公司与客户交流的平台,几乎为所有的企业所运用,最近,公司让我负责客户反馈系统的开发。由于,公司与国外客户的业务需要,该系统必须实现中,英,日三国语言的切换(国际化要求)。在接到任务之后,我便决定尝试使用目前开源社区比较流行的Apache Beehive(蜂巢)和下一代EJB,EJB3.0等技术来实现这个系统。


  选择平台,开发工具 

  为了支持EJB3.0和Beehive,我们选择JBoss4.0.3应用服务器作为运行平台,它也是目前唯一提供EJB3.0容器的应用服务器。

  下载和安装JBoss4.0.3服务器及EJB3.0容器http://www.jboss.com/downloads/index

  数据库选用 MySQL5.0,由于我们没有针对特定数据库编码,因此数据库的移植也是非常方便的。  
由于要开发EJB3.0和Beehive应用,选择Ecllipse这个IDE, 

  下载Ecllipse SDK 3.1 http://eclipse.org/downloads/

  为了支持EJB3.0的开发,下载Jboss Ecllipse IDE这个Ecllipse插件  
Pollinate是另一个Ecllipse插件,它也是目前唯一支持Beehive项目开发的IDE,虽然它远不及WebLogic 的 Workshop 如此强大,但在拥有一定BEA Workshop 开发经验的前提下,使用pollinate并不会有太大的问题。

  下载并安装Pollinate插件 http://www.eclipse.org/pollinate/ 

  在系统设计之前,选择一个优秀的系统框架是非常重要的。Beehive是Apahce的开放源代码项目。自2004年5月份,BEA系统公司宣布将WebLogic Platform中一系列居于核心地位的运行时框架(Runtime Framework)开放源代码并贡献给Apache项目后,这个Beehive的框架就一直成为开源社区关注的焦点之一。  
EJB3.0简介 

  在客户反馈系统中,尝试使用最新的EJB3.0来实现持久层的开发。众所周知,由于EJB的复杂性使其在J2EE架构中的表现一直不是很好。EJB大概是J2EE架构中唯一一个没有兑现其能够简单开发并提高生产力的组件。而EJB3.0规范在这方面作出努力以减轻其开发的复杂性。EJB3.0取消或最小化了很多(以前这些是必须实现)回调方法的实现,并且降低了实体Bean及O/R映射模型的复杂性,从而大大减轻了开发人员进行底层开发的工作量。  
EJB3.0的配置 

  JBoss EJB3.0建立在Hibernate 3.0之上。配置数据源,实体bean需要创建hibernate.   Properties配置文件。在EJB3.0部署包下有一个默认的hibernate配置文件ejb3.deployer/META-INF/hibernate.properties。修改这个文件,使实体Bean使用MySql数据源,修改后的配置文件如下:

hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.transaction.flush_before_completion=false 
hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory 

hibernate.hbm2ddl.auto=update 
hibernate.show_sql =true 
# Clustered cache with TreeCache 
#hibernate.treecache.mbean.object_name=jboss.cache:service=EJB3EntityTreeCache 

hibernate.connection.datasource=java:/MySqlDS 
hibernate.jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
持久层设计 

  创建EJB3.0项目 

  首先使用Jboss IDE,创建一个EJB3.0项目,选择new->project->EJB3.0 project,

  选择Next按钮,在project name中输入项目名称:feedback,点击next,

  接着选择JBoss4.0.3 Server作为项目默认的服务器。单击完成按钮,这样就生成了一个EJB3.0的项目,其根目录下的jndi.property文件指明了JBoss服务器名称服务的一些配置。 

  使用EJB3.0的实体Bean来实现系统的数据持久层.EJB3.0的实体bean也是一个加了注释的简单Java对象(POJO)。一旦它被EntityManager访问它就成为了一个持久化对象,并且成为了持久化上下文(context)的一部分。一个持久化上下文与一个事务上下文是松耦合的;严格的讲,它隐含的与一个事务会话共存。 在EJB3.0中开发实体Bean非常简单,可以像开发一般的java bean一样编程,只需做少量的注释来定义实体关系,O/R映射等,而在EJB2.1中这些都要通过开发人员自己的设计模式或者其它技术来完成的(比如,自增长主键策略)。如下定义了一个Item实体bean表示客户发起的一个主题:  

public class Item implements Serializable{ 
 private int itemId; 
 private User user;  
  //此处定义了实体Bean的一对一关系 
 (name = "userId", unique = false, nullable = false) 
  return user; 
  //声明实体Bean的主键及增长策略 
 (name="itemId") 
  return itemId; 
 //声明主题实体与反馈实体之间的的一对多关系,并且制定级联及获取方式等 
  (name="itemId") 
  return feedBacks; 
 public void setFeedBacks(Collection feedBacks) { 
 }  
}

  上例中,蓝色部分便是JDK1.5的元数据注解功能,如 便指名该类是一个EJB3.0 实体Bean,这样在编译后便产生了EJB3.0 的实体Bean,在部署时,Jboss的EJB3.0容器能够识别EJB3.0的实体Bean,并将其映射到对应的数据库表中。具体请参考EJB3.0相关技术文档。  

  在客户反馈系统中使用无状态会话Bean来实现系统的业务逻辑层,在EJB3.0规范中,写一个无状态回话bean(SLSB)只需要一个简单的Java文件并在类层加上注释就可以了。这个bean可以扩展javax.ejb.SessionBean接口,但这些不是必须的。一个SLSB不再需要home接口,没有哪类EJB再需要它了。Bean类可以实现业务接口也可以不实现它。如果没有实现任何业务接口,业务接口会由任意public的方法产生。如果只有几个业务方法会被暴露在业务接口中,这些方法可以使用注释。缺省情况下所有产生的接口都是local(本地)接口,你也可以使用注释来声明这个接口为remote(远程)接口。  

  Session Bean Type中选择Stateless,表明要创建一个无状态会bean。在Bean Name中输入要创建的Session Bean的名称,这里我们创建一个处理客户反馈的无状态会话Bean:FeedBacks。点击finish按钮后,分别产生了会话Bean的接口文件和实现文件:FeedBacks,无状态会话Bean的业务接口:

public interface FeedBacks{  
public void deleteFeedBack(int feedBackId); 
}

  在会话Bean的业务接口中,添加会话Bean的接口。其中声明该Bean实现会话Bean的Remote接口

  无状态会话Bean的实现:

public  class FeedBacksBean implements FeedBacks { 

…… 
…… 
在实现中完成。 
|||   Web层设计   创建Beehive项目   首先创建一个Beehive项目,选择new->project->Beehive project,打开Beehive Project创建向导,如图所示:   在name中输入,应用的名称:feedbackApp。下一步中可以选择以定义的应用模板。完成上述步骤后,便生成了一个beehive project,新生成的项目已经添加了所有需要的Beehive资源。接着就可以开发页面流和Java控件了。   利用Java Control在Beehive中使用 EJB3.0  Beehive提供了EJB Control用于获取EJB实例,但不支持EJB3.0,因此在客户反馈系统中考虑使用Java Control技术编写一个由EJB3.0实例的JNDI名称来获取EJB实例的控件。   Java控件(Control)架构是一个基于JavaBeans的轻量级组件架构,它公开了用于访问各种J2EE资源类型简单而一致的客户机模型。该框架提供了大量的函数,其中包括:基于JSR-175元数据和外部配置数据的配置,自动资源管理,上下文服务和用于创建新控件类型的可扩展设计模型。   开发Java控件,首先将EJB 3.0项目引入当前beehive项目中,可以在project->property->build path中设置。接着编写一个名为EjbFinder的Java Control来实现Ejb3.0实列的获取。   Java Control的开发分为两个步骤,首先要定义Java Control的接口如下所示: // 指明该接口是控件EjbFinder的接口部分

public interface EjbFinder {  
}

  然后定义Java Control的实现部分, 

public class EjbFinderImpl implements EjbFinder, java.io.Serializable { 
public Object getEjb(String ejbName) {  
  Context context = new InitialContext();  
return(context.lookup(ejbName)); 
  e.printStackTrace();   
  } 

.Controller(multipartHandler = Jpf.MultipartHandler.memory, forwards = { 
  .Forward(name = "addTopicAccessories", path = "accessories.jsp"), 
  .Forward(name = "detailTopic", path = "detailTopic.jsp"), 
public class Controller extends PageFlowController { 
.apache.beehive.controls.api.bean.Control() 
.apache.beehive.controls.api.bean.Control() 

……

 //每个Action都对应一次页面流转的动作,以下action对应一个添加反馈主题的动作 
 public Forward addTopic() { 
  this.topicForm = new TopicForm(); 
  this.loadLinkman(); 
 } 
在页面文件中可以使用netui标记,实现绑定数据,资源声明,模板使用等功能,这样在页面文件中可以最大限度的减少java编码,使得页面更容易维护和管理。以下是一个显示主题列表的页面 topicList.jsp:<netui-template:template templatePage="../web/template/template.jsp"> 
  <jsp:include page="newTopicNav.jsp" /> 
  <netui-template:section name="centerCol" > 
  <netui:form action="/newTopic"> 
  <table> 
    <td> 
    </td> 
      <netui:select dataSource="pageFlow.topicForm.receiverName" optionsDataSource=""></netui:select> 
    </tr> 
    <td> 
    </td> 
      <netui:textBox dataSource="pageFlow.topicForm.title"></netui:textBox> 
    </tr> 
    <td> 
     
    <td> 
      <netui:span value=""></netui:span> 
     
    <tr> 
      <netui:span value=""></netui:span> 
    <td> 
      <netui-data:repeaterItem> 
       <netui:span value="  "/> 
      </netui-data:repeaterItem>       
    </td> 
    <tr> 
      <netui:span value=""></netui:span> 
    <td> 
      <netui:textArea dataSource="pageFlow.topicForm.content" cols="50" rows="10"></netui:textArea> 
    </tr>    
    <td colspan="2" height="40"> 
      
    </td> 
  </table> 
  <br> 
   </ejar-ui:window> 
  </netui-template:template> 
  <form-beans> 
className="org.apache.beehive.netui.pageflow.config.PageFlowActionFormBean"> 
  </form-bean> 
  <global-exceptions/> 
  <forward name="showTopics" path="/topicList.jsp"/> 
  </global-forwards> 
<actionpath="/addAccessories" name="uploadFileForm" 
   <forward name="newTopic" path="/newTopic.jsp"/> 
   <forward name="addTopicAccessories" path="/accessories.jsp"/> 
…… 
parameter="org.apache.beehive.netui.pageflow.validation.defaultMessages" null="true"/> 
由于篇幅所限,无法详细阐述pollinate的使用,读者可以参考用Pollinate可视化开发页面流(JPF) ||| 实现国际化   由于要实现中英日文的显示,采取以下步骤:  开发和编译代码时指定字符集为UTF-8。Eclipse可以在项目属性中设置。 使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。request.setCharacterEncoding("UTF-8")。需要配置Web.XML 激活该Filter。在JSP头部声明: <%@ page contentType="text/html;charset= UTF-8" %>。  在Jsp的html代码中,声明UTF-8:<meta http-equiv="Content-Type" content="text/html; charset=utf-8">   设定数据库连接方式是UTF-8。例如连接MySQL时配置URLJDBC:mysql://localhost:3306/feedback_db?useUnicode=true&characterEncoding=UTF-8  其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。   不同时区时间显示   由于客户端可能处于不同的时区,因此应该显示不同服务器时间。由于与客户端有关,因此需利用一段JavaScript代码,从客户端获取其所在的时区偏移量。该偏移量是针对GMT时间而言的,也就是格林威治时间,以分钟为单位。 function getTimezone() 
var d = new Date();  
  d.getTimezoneOffset();  

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

网络课程 新人注册送三重礼

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

最新评论

点击加载更多评论>>

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
  • 电网书籍
  • 财会书籍
  • 其它工学书籍
拼团课程更多+
  • 电气拼团课程
  • 财会拼团课程
  • 其它工学拼团
热门排行

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端