·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
您现在的位置:天新网 > 软件开发 > Java开发 > EJB
EJB 3.0+Beehive开发客户反馈系统
http://dev.21tx.com 2006年01月06日 BEA 陈逸鹤

上一页 1 2 3 4 下一页

  Web层设计

  创建Beehive项目


  首先创建一个Beehive项目,选择new->project->Beehive project,打开Beehive Project创建向导,如图所示:

  在name中输入,应用的名称:feedbackApp。下一步中可以选择以定义的应用模板。完成上述步骤后,便生成了一个beehive project,新生成的项目已经添加了所有需要的Beehive资源。接着就可以开发页面流和Java控件了。

  利用Java ControlBeehive中使用 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 { 
   public Object getEjb(String ejbName); 
}

  然后定义Java Control的实现部分,
// 指明该类是控件EjbFinder的实现部分 public class EjbFinderImpl implements EjbFinder, java.io.Serializable { //实现业务接口中的方法 public Object getEjb(String ejbName) { try{ Context context = new InitialContext(); //根据JNDI名称获取ejb3.0实例,并返回该实例 return(context.lookup(ejbName)); }catch(NamingException e){ e.printStackTrace(); return null; } } }


  Java 控件是一种可以在平台应用程序中的任何位置使用的可重用组件。上面的java control 用于由ejb实例的JNDI名称,在整个Context中查找,并返回该ejb实例。接着我们便可以在Beehive Web 应用中的PageFlow(页面流)中使用这个Java控件来获取ejb3.0实例了:

  在需要使用ejb3.0实例的PageFlow页面流控制文件中添加如下代码,声明使用该控件

.apache.beehive.controls.api.bean.Control()
protected EjbFinder _ejbFinderControl;

  接着我们便可以使用这个EjbFinder控件来获取所需的ejb3.0实例了

feedbacksBean= (FeedBacks) _ejbFinderControl.getEjb(FeedBacks.class.getName());

  由于Pollinate中尚不提供控件的视图,为了说明Java Control与Pageflow(页面流)之间的关系,可以参照上面这张Bea Workshop中java control的参考视图,图中的主体是一个pageflow(页面流),而右侧users就是在该页面流中使用的一个名为users的java控件。

  开发NetUI页面流

  NetUI Page Flow(页面流)是一个基于Apache Sruts的Web应用程序框架,具有易于使用,基于JSR-175元数据的单文件编程模型。该页面流构建在模型/视图/控制器元素的核心Struts分离的基础之上,比如自动状态管理和与控件,XMLBeans和JavaServerFaces的一流集成。

  页面流使用一种专门设计的批注和方法控制 Web 应用程序行为的 Java 类,称为“控制器 (controller)”类。在包含控制器类的目录中,也包含了页面流中使用的 Java Server Page (JSP)。一个 JSP 要成为页面流的一部分,它必须位于页面流目录中。JSP 文件使用的特殊标记有助于绑定到数据和业务逻辑操作。控制器文件中的操作方法所实现的代码可以导致站点导航、数据传递或通过控件调用后端业务逻辑。而且控制器类中的业务逻辑与 JSP 文件中定义的表示代码相互独立,使得整个Web应用的开发和维护更加清晰高效。

  在Pollinate中创建页面流,选择new->other->Page Flow Wizard如图所示

  单击next,在弹出框中输入页面流的名称。这里我们创建一个处理客户反馈主题的页面流topics,点击完成之后,便生成了一个基础的页面流,打开页面流所在的文件夹,双击页面流的控制文件Controller.java,点击flow页打开页面流设计视图,如下所示

  它由一个begin Action和一个index.jsp页面组成。左侧是设计组件,包括Action,Page,添加所需的页面和Action到页面流中。

  在页面流控制文件中添加动作处理代码:

//页面流的控制文件,声明流转的目标
.Controller(multipartHandler = Jpf.MultipartHandler.memory, forwards = {
  .Forward(name = "showTopics", path = "topicList.jsp"),
  .Forward(name = "addTopicAccessories", path = "accessories.jsp"),
  .Forward(name = "showLinkmen", path = "linkmanList.jsp"),
  .Forward(name = "detailTopic", path = "detailTopic.jsp"),
  .Forward(name = "newTopic", path = "newTopic.jsp") })
public class Controller extends PageFlowController {
 //在页面流中声明使用的控件
.apache.beehive.controls.api.bean.Control()
 protected EjbFinder _ejbFinderControl;
.apache.beehive.controls.api.bean.Control()
 protected FileControl _fileControl;

……

 //每个Action都对应一次页面流转的动作,以下action对应一个添加反馈主题的动作
.Action()
 public Forward addTopic() {
  this.topicForm = null;
  this.topicForm = new TopicForm();
  topicForm.setFileList(new ArrayList());
  this.loadLinkman();
  return new Forward("newTopic");
 }
……

  在页面文件中可以使用netui标记,实现绑定数据,资源声明,模板使用等功能,这样在页面文件中可以最大限度的减少java编码,使得页面更容易维护和管理。以下是一个显示主题列表的页面 topicList.jsp:

<netui-template:template templatePage="../web/template/template.jsp">
  <netui-template:section name="leftCol" >
    <jsp:include page="newTopicNav.jsp" />
  </netui-template:section>
  <netui-template:section name="centerCol" >
  <ejar-ui:window width="70%" title="">
    <netui:form action="/newTopic">
     <% file="../web/template/errors.jspf"%>
    <table>
       <tr>
         <td>
           <netui:span value=""></netui:span>
         </td>
         <td>
           <netui:select dataSource="pageFlow.topicForm.receiverName" optionsDataSource=""></netui:select>
         </td>
       </tr>
       <tr>
         <td>
           <netui:span value=""></netui:span>
         </td>
         <td>
           <netui:textBox dataSource="pageFlow.topicForm.title"></netui:textBox>
         </td>
       </tr>
       <tr>
         <td>
           <netui:span value=""></netui:span>
           
         </td>
         <td>
           <netui:textBox dataSource="pageFlow.topicForm.deadline"></netui:textBox>
            <netui:span value=""></netui:span>
         </td>
         
       </tr>
       <tr>
         <td>
           <netui:span value=""></netui:span>
         </td>       
         <td>
           <netui-data:repeater dataSource="pageFlow.topicForm.fileList">
             <netui-data:repeaterItem>
               <netui:image src="../resources/images/i.p.attach.gif"></netui:image>
               <netui:span value="  "/>
                
             </netui-data:repeaterItem>             
           </netui-data:repeater>
         </td>
       </tr>
       <tr>
         <td>
           <netui:span value=""></netui:span>
         </td>        
         <td>
           
           <netui:textArea dataSource="pageFlow.topicForm.content" cols="50" rows="10"></netui:textArea>
         </td>
       </tr>       
       <tr>
         <td colspan="2" height="40">
         <netui:button value="" type="submit" action="/saveTopicForm"></netui:button>
            
           <netui:button type="submit" value=""></netui:button>                                  
         </td>
       </tr>       
    </table>
    </netui:form>
    <br>
     
     </ejar-ui:window>
  </netui-template:section>
  </netui-template:template>

  最终的页面流文件在Pollinate中对应的设计视图如下所示:

  在对整个工程进行Build之后,页面流控制文件被编译为一个class文件和一个对应的配置文件WEB-INF.pageflow-struts-generated jpf-struts-config-[页面流名称].xml,该配置文件定义了一系列控制文件中注释所对应的配置,如下为其中一部分:

<struts-config>
  <form-beans>
    <form-beanname="uploadFileForm" type="org.form.UploadFileForm"
className="org.apache.beehive.netui.pageflow.config.PageFlowActionFormBean">
      <set-property property="actualType" value="org.form.UploadFileForm"/>
    </form-bean>
  </form-beans>
  <global-exceptions/>
  <global-forwards>
    <forward name="showTopics" path="/topicList.jsp"/>
    <forward name="addFeedBackAccessories" path="/feedBackAccessories.jsp"/>    
  </global-forwards>
  <action-mappings>
<actionpath="/addAccessories" name="uploadFileForm"
 type="org.apache.beehive.netui.pageflow.internal.FlowControllerAction" input="addTopicAccessories"
   parameter="topics.Controller" scope="request" validate="true"> <forward name="newTopic" path="/newTopic.jsp"/> <!--forward "addTopicAccessories" (validationErrorForward)--> <forward name="addTopicAccessories" path="/accessories.jsp"/> </action> …… <message-resources key="_defaultValidationMessages" parameter="org.apache.beehive.netui.pageflow.validation.defaultMessages" null="true"/> </struts-config>

  由于篇幅所限,无法详细阐述pollinate的使用,读者可以参考相关文章:用Pollinate可视化开发页面流(JPF) http://dev2dev.bea.com.cn/techdoc/200504503.html

上一篇: 手动部署EJB 亲自体验EJB开发流程
下一篇: POJO应用架构:Spring与EJB 3.0的对比

上一页 1 2 3 4 下一页

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
© 晨新科技 版权所有 Created by TXSite.net