paulwong

#

EJB3 学习Notes 1。

     摘要: 1. 建立开发环境,安装JDK5.0 Up,设置JAVA_HOME
下载EJB3 Container,本文采用Sun的GlassFish V2,glassfish-installer-v2ur1-b09d-windows.jar,
java -Xmx256m -jar glassfish-installer-v2ur1-b09d-windows.jar
cd glassfish
lib\ant\bin\ant -f setup.xml
  阅读全文

posted @ 2009-02-26 09:44 paulwong 阅读(313) | 评论 (0)编辑 收藏

用OBPM30分钟实现BUG管理系统

http://vinsun.javaeye.com/blog/138164

posted @ 2009-02-25 10:07 paulwong 阅读(258) | 评论 (1)编辑 收藏

EXTJS入门

     摘要: EXTJS是一个兼容AJAX的前台WEB UI的框架,在普通的HTML文件的 BODY 元素中无须写任何HTML代码,就能产生相应的表格等元素。

  阅读全文

posted @ 2009-01-21 16:32 paulwong 阅读(2110) | 评论 (1)编辑 收藏

启动JBPM流程的代码

/**
     * 启动一个流程实例。
     * 
     * 
@param name
     *            流程名称。
     * 
@param version
     *            版本号,默认取最新版本。
     * 
@param formID
     *            与业务相关的表单编号,可选字段。 该参数的含义为:业务系统可以在填写完表单信息后,将表单实例的ID作为流程实例变量
     *            保存到工作流系统中,通过该ID可以在业务系统中查找表单信息。当然,也可以将表单实 际信息按照字段进行留成实例变量赋值。
     * 
@param actor
     *            流程实例发起人。
     * 
@return 实例ID号+任务实例ID(如果有),格式‘实例ID-任务实例ID’。
     
*/

    
public String startProcessInstance(String name, int version, String formID,
            String actor);
        jbpmContext 
= jbpmConfiguration.createJbpmContext();
        
try {
            ProcessDefinition def;
            
if (version == 0{
                def 
= jbpmContext.getGraphSession()
                        .findLatestProcessDefinition(name);
            }
 else {
                def 
= jbpmContext.getGraphSession().findProcessDefinition(name,
                        version);
            }

            ProcessInstance instance 
= new ProcessInstance(def);            
            TaskInstance taskInstance 
= instance.getTaskMgmtInstance().createStartTaskInstance();                
            
            
if ((formID != null&& (!formID.equals("")))
                instance.getContextInstance()
                        .setVariable(
                                name 
+ "-" + version + "-" + instance.getId()
                                        
+ "-Form", formID);
            jbpmContext.save(instance);
            String rtn 
= String.valueOf(instance.getId());
            
            
//如果有启动任务
            if (taskInstance != null){
                taskInstance.setActorId(actor);
                rtn 
+= "-" + String.valueOf(taskInstance.getId());
            }
else{
                instance.getRootToken().signal();
            }

            
return rtn;
        }
 catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }
 finally {
            jbpmContext.close();
        }

        
return "";
    }

posted @ 2008-12-31 12:16 paulwong 阅读(828) | 评论 (0)编辑 收藏

如何防止衣服褪色?

     摘要: 第一,用醋浸泡。

在洗涤衣服之前,在水中加上一些普通的食醋把衣服浸泡一会。需要注意的是,醋的量不能太多,否则容易把浅色衣服染上醋的颜色。此方法主要适用于红色或紫色等颜色鲜艳的纯棉衣服和针织品。如果能够经常这样清洗衣服就可以保证衣服的颜色光洁如新!   阅读全文

posted @ 2008-12-22 10:53 paulwong 阅读(1108) | 评论 (0)编辑 收藏

Spring配置JTA事务管理源码

    项目中需要使用多个数据库,也就是说要建立多个数据源。建立多个数据源不难,但是多个数据源的事务管理就麻烦啦,我首先想到用JTA做事务管理,但jta是需要JAVA EE服务器支持的,项目用的是TOMCAT , TOMCAT本身是不支持jta事务管理的,于是google一番,发现可以通过配合使用ObjectWeb的JOTM开源项目,不需要Java EE应用服务器,Spring也可以提供JTA事务,于是做了一个DEMO放在这给有需要的同志。详细步骤请看写的不错,很详细


源码下载:
http://www.blogjava.net/Files/paulwong/ibatis.rar

posted @ 2008-12-17 12:04 paulwong 阅读(649) | 评论 (0)编辑 收藏

EJB Descriptor

     摘要:   比如,我们有一个Bank(银行)类。Bank有两个方法,deposit(存钱)和withdraw(取钱)。
  
  类和方法的定义如下:
   网管有家www.bitscn.net
  Code 2.1 Bank.java
  class Bank{
  public float deposit(AccountInfo account, float money){
   // 增加account账户的钱数,返回账户里当前的钱数
  }
  
  public float withdraw(AccountInfo account, float money){
   // 减少account账户的钱数,返回取出的钱数
  }
  };
  
  这两个方法涉及到用户的账户资金等重要信息,必须要非常小心,所以编写完上面的商业逻辑之后,项目负责人又提出了新的要求--给Bank类的每个重要方法加上安全认证特性。
  
  于是,我们不得不分别在上面  阅读全文

posted @ 2008-12-06 16:29 paulwong 阅读(123) | 评论 (0)编辑 收藏

CMR(Container Management Relationship)

     摘要: 前面兩期我們提到entity bean在J2EE架構中是用來塑模business object的元件,它同時也是在business tier保存資料的技術之一,它被用來存取保存在EIS tier(Enterprise Information System)的資料,而目前運用的最為普遍的EIS技術則是關聯式資料庫。在關聯式資料庫中,我們以所謂的E-R model(Entity Relationshi...  阅读全文

posted @ 2008-12-04 11:33 paulwong 阅读(180) | 评论 (0)编辑 收藏

Session Bean

1. 簡介

Session Bean 是目前 EJB 規格 (EJB 2.0) 中 3種 Enterprise Bean 的其中一種,另外兩種分別是 Entity Bean 和 Message Driven Bean,這3種 Enterprise Bean 依照其特性被應用在不同的範疇中。其中 Session Bean 和 Entity Bean 早在 EJB 1.x 規格中就已經存在,Message Driven Bean 卻是在 EJB 2.0 才被加入。

在 EJB 架構中,Session Bean 主要目的是塑造企業流程,當中可能包括系統運算、存取資料庫、呼叫其他 Enterprise Bean等等。其範例包括流程引擎、買賣交易、型錄查詢等應用。接下來會從 Session Bean 的各個不同的特性說明其實際應用的方式、時機和要注意的地方。

2. Stateless & Stateful Session Bean

EJB 規格中,Session Bean被細分為 Stateless Session Bean Stateful Session Bean。兩者根據特性在應用上有著很大差異:

與客戶端之間的對話資訊

Session Bean 不能被共用,每一個 Bean 只能用來服務一個客戶,而 Bean 和客戶端之間會有一份對話資訊 (請參考附註 [A] )

●Stateless Session Bean

基本上只在單一方法呼叫中保存對話資訊,一旦 Bean 完成處理後,對話資訊會隨著被清除。

●Stateful Session Bean

在同一個 Session 可以保留呼叫者與 Session Bean 之間的對話資訊與狀態,等下一次執行方法時繼續提供使用。

生命週期

Session Bean 的生命週期除了依不同廠商的 EJB Container 會有所不同外,Bean 的 Stateful 特性也會影響到其存活的時機。

●Stateless Session Bean

當客戶端所呼叫 Stateless Session Bean完畢後,Bean 會馬上被 EJB Container 銷毀,或將實例 (Instance) 保存下來以供其他客戶端使用。

●Stateful Session Bean

和 Stateless Session Bean 不同,當客戶端所呼叫Stateless Session Bean完畢後,Bean 不會馬上被 EJB Container 銷毀,而是繼續存在於 Session Bean Pool (請參考附註 [B] ),直到 Session 完結。

使用時機

●Stateless Session Bean

1. 不需要在每次客戶端對 Session Bean 的方法呼叫後保持對話資訊。

●Stateful Session Bean

1. 在每個 Session Bean 的方法呼叫之間需要保持 Session 中的資訊。

2. 利用 Session Bean 的對話狀態 (Conversational State) (請參考附錄) 管理企業流程

效能

●Stateless Session Bean

由於不需要管理對話資訊,也就是可以佔用比較少系統資源去暫存與客戶端之間的對話資訊,而且在每次被呼叫完畢後可以馬上轉移給其他客戶端使用,故效能較佳。

●Stateful Session Bean

每次被客戶端呼叫完畢後都會將代表這客戶端的狀態資訊暫時儲存起來,在 Session 完畢後也要把之前所記錄與客戶端的對話資訊清除,所以會消耗較多系統資源。

3. 開發 Session Bean

開發一支 Session Bean 至少包括4個步驟

1. 編寫 Home Interface

2. 編寫 Remote Interface

3. 編寫 Bean 的實作 (Implement) 類別,當中包括描述企業流程的方法實作

4. 編寫部署文件 (ejb-jar.xml)

編寫 Home 介面

Session Bean 的`介面繼承自 javax.ejb.EJBHome,負責控制一個 Session Bean 的生命週期,含有建立與銷毀 EJB 物件的方法,一般情況下,其命名規則為 <<Bean-name>> + Home。要注意的是,Home介面中需要定義一個 create() 方法 (對應到 Bean 實作類別的 ejbCreate()),用來取得一個 Bean 的實例。另外 Home 介面中也可以定義一個 remove() 方法對應到 Bean 實作類別的 ejbRemove()),用來移除 Bean 的實例。

【範例】

package examples;

import javax.ejb.*;

import java.rmi.RemoteException;

public Interface HelloWorldHome extends EJBHome{

HelloWorld create() throws RemoteExcception, CreateException;

}

編寫 Remote介面

繼承自 javax.ejb.EJBObject,含有 Bean 裡所有的每一個方法以供遠端程序呼叫,一段情況下,其命名規則為 <<Bean-name>>。由於遠端介面是 RMI-IIOP 遠端介面 (繼承 java.rmi.Remote) ,因此必須拋出 java.rmi.RemoteException。

【範例】

package examples;

import javax.ejb.*;

import java.rmi.RemoteException;

public Interface HelloWorld extends EJBObject{

public void helloWorld() throws RemoteException;

}

編寫 Session Bean 的實作類別

繼承自 javax.ejb.SessionBean,一段情況下,其命名規則為 <<Bean-name>> + Bean。定義一個 Session Bean 可以透過定義一個實現 javax.ejb.SessionBean 介面的類別來達成,該介面定義如下:

public Interface javax.ejb.SessionBean extends javax.ejb.EnterpriseBean{

public void ejbCreate(…) throws RemoteException;

public void ejbActivate() throws RemoteException;

public void ejbPassivate() throws RemoteException;

public void ejbRemove() throws RemoteException;

public void setSessionContext(SessionContext ctx) throws RemoteException;

}

以上幾個方法並不是要讓客戶端使用和呼叫的,而是要讓 EJB Container 使用來管理 Session Bean 的生命週期,因此不可以直接在客戶端程式裡呼叫。每個方法的說明如下,詳細的方法呼叫時機請參考「Session Bean 與 EJB Container 互動」:

方法

說明

ejbCreate(…)

初始化 Session Bean

ejbActivate()

EJB container Session Bean 主動化 (activate) 後馬上呼叫此一方法,取得 Bean 所需資源 ( stateless 不需實作,因為不需維護對話資訊)

ejbPassivate()

EJB container Session Bean 被動化 (passivate) 後馬上呼叫此一方法,釋放 Bean 所佔的資源( socket 連線)

ejbRemove()

EJB container Session Bean 從記憶體中移除之前會呼叫此一方法,釋放所有已配置的資源

setSessionContext(SessionContext ctx)

EJB container Session Bean Session Context 關聯在一起,Bean 可以從中查詢目前交易狀態和資訊

【範例】

package examples;

import javax.ejb.*;

public Interface HelloWorldBean extends EJBObject{

public void helloWorld(){

         System.out.println(“Hello Word !!!”);

}

public void ejbCreate() throws CreateException{

       System.out.println(“ejbCreate”);

}

public void ejbRemove() {

       System.out.println(“ejbRemove”);

}

public void ejbActivate() {

       System.out.println(“ejbActivate”);

}

public void ejbPassivate() {

       System.out.println(“ejbPassivate”);

}

public void setSessionContext(SessionContext ctx) {

       System.out.println(“setSessionContext”);

}

}

編寫部署文件 ejb-jar.xml

要讓所編寫的 Session Bean 可以在 EJB Container 部署和正確運作,除了編寫程式碼外,我們還需要把 Session Bean 的特性描述在部署文件,也就是 ejb-jar.xml。編寫 Session Bean 不需要在程式碼中指明所寫的 Bean stateless 還是 stateful,其 stateful 特性是定義在部署文件裡,也就是說可以透過修改部署文件而簡單的把 Session Bean 在 stateless 和 stateful 之間切換。

【範例】

<!DOCTYPE ejb-jar PUBLIC

“-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN”

“http://java.sun.com/dtd/ejb-jar_2_0.dtd”>

<ejb-jar>

<enterprise-Beans>

         <Session>

                 <ejb-name>Hello</ejb-name>

                 <Home>examples.HelloWorldHome</Home>

                 <remote>examples.HelloWorld</ remote>

                 <ejb-class>examples.HelloWorldBean</ejb-class>

                 <Session-type>Stateless</Session-type>

                 <transaction-type>Container</transaction-type>

         </Session>

</enterprise-Beans>

</ejb-jar>

<ejb-name>

Session Bean 的名稱

<Home>

Session Bean Home 介面

<remote>

Session Bean remote 介面

<ejb-class>

Session Bean 實作的類別

<Session-type>

描述Session Bean stateful 特性 (Stateless / Stateful)

<transaction-type>

描述 Session Bean 的交易特性 (Container / Bean)

4. Session Bean EJB Container 互動

在客戶端的程式呼叫 Session Bean 的方法時,其實 Bean 會根據其特性 (stateful 特性) 和 EJB container 互動,以下簡單的說明 EJB container 如何管理 Session Bean 的生命週期。

Stateless Session Bean

1.     當客戶端程式呼叫 Stateless Session Bean 上的方法之前,會先呼叫 Bean 的Home 介面中的create() 以取得一個 Bean 的參考 (reference)。

2.      EJB container 會馬上呼叫 ejbCreate() 和 setSessionContext() 產生一個 Bean 實例和把 Session Context 和 Bean 關聯在一起。

3.     當方法呼叫完畢,EJB container 會呼叫 ejbRemove() 把 Bean 銷毀,Bean 所佔用的資源也會被釋放。

Stateful Session Bean

1.      Stateless Session Bean 一樣客戶端程式呼叫 Stateful Session Bean 上的方法之前會先呼叫 create() 取得一個 Bean 的參考。

2.     EJB container 會馬上呼叫 ejbCreate() 和 setSessionContext() 產生一個 Bean 實例和把 Session Context 和 Bean 關聯在一起。

3.     由於 Stateful Session Bean 會管理與客戶端之間的對話資訊,所以在Bean 的方法被呼叫完畢後,EJB container 不會馬上把 Bean 銷毀,而是在適當時間 (依不同廠商的EJB Container 會有所不同) 把 Bean 被動化 (呼叫 ejbPassivate()) 和將對話資訊暫存起來。

4.     當客戶端程式再次呼叫 Bean 上的方法時,如果 Bean 是在被動狀態,EJB container 會呼叫 Bean 的 ejbActivate() 把 Bean 的狀態轉為預備狀態,而之前暫存的對話資訊也會再放進 Bean 實例裡。

5.     客戶端程式呼叫 Bean remove() 或是客戶端的 Session 已經完結時,EJB container會呼叫 ejbRemove() 把 Bean 銷毀,Bean 所佔用的資源也會被釋放,之前所保持的與客戶端之間的對話資訊也會同時被清除。



附註 [A] 對話資訊:包括 Session 資訊和對話狀態 Conversational State。當客戶端程式呼叫 Session Bean 時,可能會改變其實例參數 (Instance Variable) 的值。在客戶端程式再次呼叫同一個 Session Bean 參考的方法時,Stateful Session Bean 會保留上次方法呼叫被改變的實例參數的值,但 Stateless Session Bean 卻不會。

附註 [B] Session Bean Pool:EJB container 存放 Session Bean 實例 (Instance) 的地方,可根據不同的需要而設定大小 (設定於佈署文件中),Pool 的大小會影響系統效能。

posted @ 2008-12-04 11:32 paulwong 阅读(423) | 评论 (0)编辑 收藏

Entity Bean(2)

     摘要: 四、Entity bean的實作   在上一節我們簡略地介紹了entity bean的生命週期的各種狀態與相關的life-cycle與call back方法,在本節中我們則要以實際的程式碼說明CMP與BMP在實作這些life-cycle與call back方法時的異同與值得注意之處。但無論是CMP bean或BMP bean,開發人員都必須提供下列檔案: 1. &nb...  阅读全文

posted @ 2008-12-04 11:32 paulwong 阅读(408) | 评论 (0)编辑 收藏

仅列出标题
共90页: First 上一页 81 82 83 84 85 86 87 88 89 下一页 Last