小丐的blog

Java

2006年9月13日 #

在页面中直接显示EJB集合

建立一个Entity Bean,选择Sqlserver2000中Northwind下Shippers表进行映射。按照向导建立完毕EJB以后,新添一个findAll方法获取所有对象集合。在Web程序中新建一个EJB Control。最后像下面这样为JSP添加标签即可:

<!-- Generated by WebLogic Workshop -->
< %@ page  language ="java"  contentType ="text/html;charset=UTF-8" % >
< %@ taglib  uri ="netui-tags-databinding.tld"  prefix ="netui-data" % >
< %@ taglib  uri ="netui-tags-html.tld"  prefix ="netui" % >
< %@ taglib  uri ="netui-tags-template.tld"  prefix ="netui-template" % >
< netui:html >
  
< head >
    
< title > Web Application Page </ title >
  
</ head >
  
< body >
    
< p >
        New Web Application Page
    
</ p >
    
< netui-data:declareControl  controlId ="ShipperControl"  type ="Controls.ShippersBeanControl" ></ netui-data:declareControl >
    
< netui-data:callControl  controlId ="ShipperControl"  method ="findAll"  resultId ="shippers" />
    
< netui-data:repeater  dataSource ="{pageContext.shippers}" >
    
< netui-data:repeaterHeader >< table >< tr >< th > Shippers </ th ></ tr >
    
</ netui-data:repeaterHeader >
    
< netui-data:repeaterItem >
    
< tr >< td >
    
< netui:label  value ="{container.item.companyName}"   />
    
< netui:label  value ="{container.item.phone}"   />
    
</ tr ></ td >
    
</ netui-data:repeaterItem >
    
< netui-data:repeaterFooter ></ table ></ netui-data:repeaterFooter >
    
</ netui-data:repeater >
  
</ body >
</ netui:html >

 

其中:
netui-data:declareControl用来申明一个控件。controlId作为后面的标签进行调用的标识。type为所建立的EJB Control的类型。
netui-data:callControl用来指明调用控件中的哪一个方法。resultId为返回结果的标识。
定义了这两个标签之后,建立netui-data:repeater标签即可。其中DataSouce中的pageContext是指当前页,而shippers就是前面声明的返回值。
container.item.companyName对应了EJB Control中的getCompanyName方法。phone对应了EJB Control中的getPhone方法。

posted @ 2006-09-13 23:33 littlegai 阅读(307) | 评论 (0)编辑 收藏

EJB调用EJB

1.新建一个CMP的Entity Bean。新的Entity Bean被映射到Sql Server 2000的Northwind Databse的Region表。在按照创建向导完成该Entity Bean的建立以后,可以得到如下所示的代码:

package  RegionEJB;

import  java.util.Collection;
import  javax.ejb.CreateException;

import  weblogic.ejb.GenericEntityBean;

/**
 * @ejbgen:entity
 *   ejb-name = "RegionBean"
 *   data-source-name = "NorthwindDataSource"
 *   table-name = "Region"
 *   prim-key-class = "java.lang.Integer"
 *
 * @ejbgen:jndi-name remote="ejb.RegionBeanRemoteHome"
 *   local = "ejb.RegionBeanHome"
 *
 * @ejbgen:file-generation local-class = "true" local-class-name = "Region" local-home = "true" local-home-name = "RegionHome" remote-class="true" remote-class-name = "RegionRemote" remote-home="true" remote-home-name = "RegionRemoteHome" value-class = "false" value-class-name = "RegionValue" pk-class = "true"
 * @ejbgen:finder ejb-ql="SELECT OBJECT(o) from RegionBean as o" generate-on="Local" signature="Collection findAll()"
 
*/


public   abstract   class  RegionBean 
  
extends  GenericEntityBean
{

  
public  java.lang.Integer ejbCreate(Integer RegionID)
    
throws  CreateException
  
{
    setRegionID(RegionID);

    
return   null ;
  }

  
  
public   void  ejbPostCreate(Integer RegionID) 
    
throws  CreateException
  
{}


  
/**
   * @ejbgen:cmp-field column = "RegionID"
   *  primkey-field="true"
   * @ejbgen:local-method
   
*/

  
public   abstract  Integer getRegionID();
  
/**
   * @ejbgen:local-method
   
*/

  
public   abstract   void  setRegionID(Integer val);
  
  
/**
   * @ejbgen:cmp-field column = "RegionDescription"
   * @ejbgen:local-method
   
*/

  
public   abstract  String getRegionDescription();
  
/**
   * @ejbgen:local-method
   
*/

  
public   abstract   void  setRegionDescription(String val);
  
}


上面的代码中已经手动添加了一个叫做findAll的方法,该方法可以得到RegionBean的集合。
2.现在建立一个Session Bean。通过这个Session Bean调用RegionBean的findAll方法,并将之保存到一个数组中。代码如下:

package  RegionEJB;

import  java.io.Serializable;
import  java.rmi.RemoteException;
import  java.util.Collection;
import  java.util.Iterator;
import  javax.ejb. * ;
import  weblogic.ejb. * ;
import  javax.naming.Context;
import  javax.naming.InitialContext;
import  javax.ejb.SessionContext;
import  javax.ejb.SessionBean;
import  javax.ejb.CreateException;

/**
 * @ejbgen:session type="Stateless"
 *   ejb-name = "RegionView"
 *
 * @ejbgen:jndi-name local="ejb.RegionViewLocalHome"
 *   remote = "ejb.RegionViewRemoteHome"
 *
 * @ejbgen:file-generation remote-class = "true" remote-class-name = "RegionViewRemote" remote-home = "true" remote-home-name = "RegionViewHome" local-class="true" local-class-name = "RegionViewLocal" local-home="true" local-home-name = "RegionViewLocalHome"
 * @ejbgen:ejb-local-ref type="Entity" name="ejb/Region" link="RegionBean" jndi-name="ejb.RegionBeanHome" local="Region" home="RegionHome" 
 
*/
public   class  RegionView
  
extends  GenericSessionBean
  
implements  SessionBean
{
    SessionContext sessionContext;
    Context context;
    RegionHome regionHome;
  
public   void  ejbCreate()  throws  CreateException {
    
//  Your code here
  }
  
public   void  setSessionContext(SessionContext sessionContext)
  {
    
this .sessionContext = sessionContext;
    
try
    {
        initRegionHome();
    }
    
catch (Exception ex)
    {
        
throw   new  EJBException(ex.getMessage());
    }
  }
  
private   void  initRegionHome()  throws  Exception
  {
    
final  String ENTITY_NAME = " java:comp/env/ejb/Region " ;
    
this .context = new  InitialContext();
    
if ( null == regionHome)
    {
        
try
        {
            Object obj
= context.lookup(ENTITY_NAME);
            regionHome
= (RegionHome)obj;
        }
        
catch (Exception ex)
        {
            
throw   new  EJBException(ex.getMessage());
        }
    }
  }
  
/**
   * @ejbgen:local-method
   
*/
  
public   void  addRegion( int  id,String desc)  throws  Exception
  {
    
try
    {
        Region region
= regionHome.create( new  Integer(id));
        region.setRegionDescription(desc);
    }
    
catch (Exception ex)
    {
        
throw   new  Exception(ex.getMessage());
        
    }
    
  }
  
/**
   * @ejbgen:local-method
   
*/
  
public  Object[] getAllRegionView()  throws  Exception
  {
    
try
        {
           Collection collection
= regionHome.findAll();
           
int  size = collection.size();
           
if (size == 0 )
            
throw   new  Exception( " Null Ejb Object Found!! " );
           RegionInfo[] regionInfo
= new  RegionInfo[collection.size()];
           Iterator iter
= collection.iterator();
           
int  regionIndex = 0 ;
           
while (iter.hasNext())
           {
               RegionEJB.Region ejb
= (RegionEJB.Region)iter.next();
               regionInfo[regionIndex]
= new  RegionInfo(ejb.getRegionID(),ejb.getRegionDescription());
               regionIndex
= regionIndex + 1 ;
               
// regionInfo[regionIndex]=new RegionInfo(new Integer(regionIndex),iter.next().getClass().toString());
           }
           
return  regionInfo;
        }
        
catch (Exception e)
        {
           
throw   new  Exception(e.getMessage());
        }
    
  }
   
public   static   class  RegionInfo  implements  Serializable
    {
        
public  java.lang.Integer regionID;
        
public  String regionDescription;
        
        
public  RegionInfo()
        {
        }
        
public  RegionInfo(java.lang.Integer regionID,String regionDescription)
        {
            
this .regionID = regionID;
            
this .regionDescription = regionDescription;
        }
    }
}


在注释中用@ejbgen来配置Weblogic Workshop所提供的EJBGenerate工具生成EJB。在上面的代码中,session type是手动添加的。另外为了调用其它的EJB,还要配置ejb-local-ref。因为被发布在同一个服务器中,所以使用本地调用即可。这里提取这段代码来看一下:

*  @ejbgen:ejb - local - ref type = " Entity "  name = " ejb/Region "  link = " RegionBean "  jndi - name = " ejb.RegionBeanHome "  local = " Region "  home = " RegionHome "  

因为被调用的对象类型为Entity Bean,所以在type属性中选择Entity。如果被调用对象为Session Bean,则可选择Session。name为对该引用定义指定的名字。link属性填入被引用EJB组件的名称。jndi-name填入被引用EJB的JNDI,local填入本地接口的名称,home填入home接口的名称。填写的时候即可以手动输入,也可以在右侧的property editor中填写。
这里调用findAll的方法getAllRegionView前面的注释中需要添加ejbgen:local-method以定义为本地方法,这样ejbgen才会在生成Bean代码的时候找到它。
3.在jsp页面中调用这个Session Bean的方法。

首先添加一个EJB控件来包容该EJB调用。然后再在页面流中实例化一个EJB控件对象。然后为页面流添加一个方法getAllRegion,最后配置一下JSP页面中的netui标签以展现数据。下面是getAllRegion方法:

public  Object[] getAllRegion()
    {
        
try
        {
            
return  regionViewCtrl.getAllRegionView();
        }
        
catch (Exception ex)
        {
            
return   null ;
        }
    }

下面是JSP页面的内容:

< %@ page  language ="java"  contentType ="text/html;charset=UTF-8" % >
< %@ taglib  uri ="netui-tags-databinding.tld"  prefix ="netui-data" % >
< %@ taglib  uri ="netui-tags-html.tld"  prefix ="netui" % >
< %@ taglib  uri ="netui-tags-template.tld"  prefix ="netui-template" % >
< netui:html >
    
< head >
        
< title >
            Web Application Page
        
</ title >
    
</ head >
    
< body >
        
< p >
        
        Hi!You Have Clicked Ok Button!
        
</ p >
       
< netui-data:repeater  dataSource ="{pageFlow.allRegion}" >
        
< netui-data:repeaterHeader >
            
< table  border ="1" >
                
< tr >
                    
< td >< b > ID </ b ></ td >   
                    
< td >< b > Description </ b ></ td >     
                
</ tr >
        
</ netui-data:repeaterHeader >
        
< netui-data:repeaterItem >
            
< tr >
                
< td >
                    
< netui:label  value ="{container.item.regionID}"   />
                
</ td >
                
< td >
                    
< netui:label  value ="{container.item.regionDescription}"   />
                
</ td >
            
</ tr >
        
</ netui-data:repeaterItem >
        
< netui-data:repeaterFooter >
            
</ table >
        
</ netui-data:repeaterFooter >     
    
</ netui-data:repeater >
    
</ body >
</ netui:html >


 

posted @ 2006-09-13 23:19 littlegai 阅读(866) | 评论 (0)编辑 收藏

My Links

Blog Stats

常用链接

留言簿(1)

随笔分类

随笔档案

My Technique Blog

搜索

最新评论

阅读排行榜

评论排行榜