<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/rss20.xsl" media="screen"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="http://jakarta99.blogspirit.com/ejb3/index.rss" rel="self" type="application/rss+xml" />
<title>jini's Java EE 5.0 部落格 - ejb3</title>
<description>jini ( 99% jakarta )</description>
<link>http://jakarta99.blogspirit.com/ejb3/</link>
<lastBuildDate>Mon, 17 Jul 2006 09:57:27 +0200</lastBuildDate>
<generator>blogSpirit.com</generator>
<copyright>All Rights Reserved</copyright>
<item>
<guid isPermaLink="true">http://jakarta99.blogspirit.com/archive/2006/07/16/interceptor-與-inv-proceed-的關係.html</guid>
<title>Interceptor 與 inv.proceed() 的關係</title>
<link>http://jakarta99.blogspirit.com/archive/2006/07/16/interceptor-與-inv-proceed-的關係.html</link>
<author>noreply@blogspirit.com (jini(99% jakarta))</author>
<category>EJB3</category>
<pubDate>Sun, 16 Jul 2006 11:25:00 +0200</pubDate>
<description>
寫了一個小程式測試了一下, @Interceptors 他的操作方式&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;@Interceptors({AuditInterceptor.class, SecurityInterceptor.class})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;font-size:9px; font-family:verdana; border:1px; bordercolor:333333&quot;&gt;&lt;br /&gt;public class AuditInterceptor {&lt;br /&gt;    @AroundInvoke public Object auditOperation(InvocationContext inv) &lt;br /&gt;        throws Exception {&lt;br /&gt;        try {&lt;br /&gt;            System.out.println(&quot;audit &quot;+inv.getMethod().getName());&lt;br /&gt;            Object result = inv.proceed();&lt;br /&gt;            System.out.println(&quot;test after proceed&quot;);&lt;br /&gt;            return result;&lt;br /&gt;        } catch ( Exception ex ) {&lt;br /&gt;            throw ex;&lt;br /&gt;        } finally {&lt;br /&gt;            System.out.println(&quot;finally end message&quot;);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;font-size:9px; font-family:verdana; border:1px; bordercolor:333333&quot;&gt;&lt;br /&gt;import javax.interceptor.*;&lt;br /&gt;public class SecurityInterceptor {&lt;br /&gt;    @AroundInvoke public Object securitySome(InvocationContext inv) &lt;br /&gt;        throws Exception {&lt;br /&gt;        try {&lt;br /&gt;            System.out.println(&quot;security&quot;+inv.getMethod().getName());&lt;br /&gt;            Object result = inv.proceed();&lt;br /&gt;            System.out.println(&quot;test after proceed in security&quot;);&lt;br /&gt;            return result;&lt;br /&gt;        } catch ( Exception ex ) {&lt;br /&gt;            throw ex;&lt;br /&gt;        } finally {&lt;br /&gt;             System.out.println(&quot;Final in security&quot;);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行的結果是&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;audit getHello|#]&lt;br /&gt; &lt;br /&gt;securitygetHello|#]&lt;br /&gt; &lt;br /&gt;Hello in getHello()|#]&lt;br /&gt; &lt;br /&gt;test after proceed in security|#]&lt;br /&gt; &lt;br /&gt;Final in security|#]&lt;br /&gt; &lt;br /&gt;test after proceed|#]&lt;br /&gt; &lt;br /&gt;finally end message|#]&lt;br /&gt;&lt;br /&gt;換句話說, 當我們透過 InvocationContext proceed 之後, &lt;br /&gt;會將 process 指到下一個 Interceptor&lt;br /&gt;當沒有下一個 Interceptor 的時候&lt;br /&gt;&lt;br /&gt;就會到了 Bean Method() 的操作&lt;br /&gt;&lt;br /&gt;等到 Bean Method() 結束之後&lt;br /&gt;才會開始處理 proceed 之後的功能&lt;br /&gt;一直等到你執行 reutnr Object ( inv.proceed() ) .&lt;br /&gt;&lt;br /&gt;雖然 return 該 Object ( inv.proceed() ) 之後, &lt;br /&gt;我們也可以利用 finally 來處理最後的相關事務
</description>
</item>
<item>
<guid isPermaLink="true">http://jakarta99.blogspirit.com/archive/2006/07/10/interceptor-攔截-basic-concept.html</guid>
<title>Interceptor 攔截 basic concept</title>
<link>http://jakarta99.blogspirit.com/archive/2006/07/10/interceptor-攔截-basic-concept.html</link>
<author>noreply@blogspirit.com (jini(99% jakarta))</author>
<category>EJB3</category>
<pubDate>Mon, 10 Jul 2006 07:00:00 +0200</pubDate>
<description>
&lt;style&gt;&lt;br /&gt;code { font-size:9px; font-family:verdana; color:509050; border:1px; bordercolor:909090}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;EJB3 為了可以支援 AOP ( swanky : AOP Presentation - &lt;a href=&quot;http://www.ice.ntnu.edu.tw/~swanky/presentation/PL_AOP.pdf&quot; target=&quot;_blank&quot;&gt;http://www.ice.ntnu.edu.tw/~swanky/presentation/PL_AOP.pdf&lt;/a&gt; ) &lt;br /&gt;所以建立了Interceptors 的觀念.&lt;br /&gt;&lt;br /&gt;不過, 雖然是放在 ejb3 api 的製作之中, 但是他的 package 為 javax.interceptor.*, 換句話說, 未來有機會可能會移出 ejb-api .&lt;br /&gt;&lt;br /&gt;其實, 熟稔 AOP 概念的人 ( AspectJ, AspectWerkz ) 通常會對於 EJB3 目前僅提供 Interceptor 實作的方法, 覺得比較陽春.&lt;br /&gt;但是, 也可以這麼思考, 利用 Interceptor 應該就可以達到一般人的需求 !&lt;br /&gt;&lt;br /&gt;在 Interceptor, 只有 InvocationContext Interface, 以及 四個 Annotation Types.&lt;br /&gt;* AroundInvoke&lt;br /&gt;* ExcludeClassInterceptors&lt;br /&gt;* ExcludeDefaultInterceptors&lt;br /&gt;* Interceptors&lt;br /&gt;&lt;br /&gt;我們在呼叫任何一個 EJB Bean Class 的時候, 可以利用 @Interceptors 來設定&lt;br /&gt;&lt;br /&gt;@Interceptors(MyCallbackHandler.class)&lt;br /&gt;public class MyEJB {&lt;br /&gt;  ....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;或是利用 deployment descriptor ( ejb-jar.xml ) 來定義 interceptors&lt;br /&gt;&lt;pre class=code&gt;&lt;br /&gt;&amp;lt;ejb-jar&amp;gt;&lt;br /&gt;  &amp;lt;sessions&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;  &amp;lt;/sessions&amp;gt;&lt;br /&gt;  &amp;lt;interceptors&amp;gt;&lt;br /&gt;     &amp;lt;interceptor&amp;gt;&lt;br /&gt;       &amp;lt;interceptor-class&amp;gt;com.softleader.interceptors.MyCallbackHandler&amp;lt;/interceptor-class&amp;gt;&lt;br /&gt;       &amp;lt;pre-destroy&amp;gt;&lt;br /&gt;         &amp;lt;lifecycle-callback-method&amp;gt;someInteceptorMethod&amp;lt;/lifecycle-callback-method&amp;gt;&lt;br /&gt;       &amp;lt;/pre-destroy&amp;gt;  &lt;br /&gt;     &amp;lt;/interceptor&amp;gt;&lt;br /&gt;  &amp;lt;/interceptors&amp;gt;&lt;br /&gt;  &amp;lt;assembly-descriptor&amp;gt;&lt;br /&gt;      &amp;lt;interceptor-binding&amp;gt;&lt;br /&gt;         &amp;lt;ejb-name&amp;gt;*&amp;lt;/ejb-name&amp;gt;&lt;br /&gt;         &amp;lt;interceptor-class&amp;gt;com.softleader.interceptors.MyCallbackHandler&amp;lt;/interceptor-class&amp;gt;&lt;br /&gt;      &amp;lt;/interceptor-binding&amp;gt;  &lt;br /&gt;      &amp;lt;interceptor-binding&amp;gt;&lt;br /&gt;         &amp;lt;ejb-name&amp;gt;SlessEJB&amp;lt;/ejb-name&amp;gt; &lt;br /&gt;         &amp;lt;exclude-default-interceptors&amp;gt;true&amp;lt;/exclude-default-interceptors&amp;gt; &lt;br /&gt;      &amp;lt;/interceptor-binding&amp;gt;&lt;br /&gt;      &amp;lt;interceptor-binding&amp;gt;&lt;br /&gt;         &amp;lt;ejb-name&amp;gt;SlessEJB2&amp;lt;/ejb-name&amp;gt; &lt;br /&gt;         &amp;lt;exclude-default-interceptors&amp;gt;true&amp;lt;/exclude-default-interceptors&amp;gt; &lt;br /&gt;      &amp;lt;/interceptor-binding&amp;gt;&lt;br /&gt;  &amp;lt;/assembly-descriptor&amp;gt;&lt;br /&gt;&amp;lt;/ejb-jar&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;非常明顯的, 我們可以看到, 我們需要利用 interceptor-binding 將 interceptor-class 指向到所有(*) 或單一(EJBName) 的結合.&lt;br /&gt;以及是否去除 ( exclude-default-interceptors ) 預設的 binding 原則.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;一個簡單的 Interceptor 的撰寫方式&lt;br /&gt;&lt;pre class=code&gt;&lt;br /&gt;import javax.interceptor.InvocationContext;&lt;br /&gt;public class MyCallbackHandler {&lt;br /&gt;    public void someInteceptorMethod(InvocationContext invCtx) {&lt;br /&gt;        System.out.println(&quot;Hello Inteceptor in pre-destroy callback methods &quot;);&lt;br /&gt;        try {&lt;br /&gt;            invCtx.proceed();&lt;br /&gt;        } catch(Exception e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;當呼叫 InvocationContext.proceed() 之後, 將會進行下一個 interceptor 的作業.&lt;br /&gt;&lt;br /&gt;所以我們必須利用 InvocationContext 來取得我們攔截下來取得相關的資訊, 進行相關的處理.&lt;br /&gt;&lt;br /&gt;Map getContextData() &lt;br /&gt;Method getMethod()&lt;br /&gt;Object[] getParameters()&lt;br /&gt;Object getTarget()&lt;br /&gt;Object proceed()&lt;br /&gt;void setParameters()&lt;br /&gt;&lt;br /&gt;除了控制生命週期的攔截之外, 我們可以利用 ArroundInvoke() 進行相關的攔截&lt;br /&gt;&lt;pre class=code&gt;&lt;br /&gt;@AroundInvoke&lt;br /&gt;&lt;br /&gt;Object aroundInvoke(InvocationContext ctx) throws Exception {&lt;br /&gt;&lt;br /&gt;  Common.aroundInvokeCalled(ctx, &quot;testArroundInvoke&quot;);&lt;br /&gt;&lt;br /&gt;  Object instance = ctx.getTarget();&lt;br /&gt;&lt;br /&gt;  if( instance instanceof SomeEJB) {&lt;br /&gt;&lt;br /&gt;      ((SomeEJB) instance).aroundInvokeCalled = true;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return ctx.proceed();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這樣就可以建立基本的 AOP 實作了
</description>
</item>
<item>
<guid isPermaLink="true">http://jakarta99.blogspirit.com/archive/2006/02/19/use-action-servlet-to-call-ejb3.html</guid>
<title>use action/servlet to call EJB3</title>
<link>http://jakarta99.blogspirit.com/archive/2006/02/19/use-action-servlet-to-call-ejb3.html</link>
<author>noreply@blogspirit.com (jini(99% jakarta))</author>
<category>EJB3</category>
<pubDate>Sun, 19 Feb 2006 17:25:00 +0100</pubDate>
<description>
現在我們撰寫 WebApplication, 現在應該都是採用 MVC 的架構, &lt;br /&gt;就算不是利用 Opensource 如 Struts, Webwork, Tapestry 等等,&lt;br /&gt;也可能是利用 JSF, 甚至自己撰寫的 Servlet 作為 Model2 的 Controller.&lt;br /&gt;&lt;br /&gt;這在學習 ejb3 有一個好處, 因為目前無法在 jsp 撰寫 @annotations, &lt;br /&gt;我們可以透過 controller 的 servlet 呼叫 action 或任何 java class, &lt;br /&gt;如此一來, 在 java source 之中,&lt;br /&gt;只需要撰寫  &lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;font-size:11px ; font-family: verdana;border: thin dotted #A030A0&quot;&gt;&lt;br /&gt;package com.softleader.web.servlet;&lt;br /&gt;&lt;br /&gt;import javax.ejb.EJB;&lt;br /&gt;&lt;br /&gt;public class HelloServlet {&lt;br /&gt;&lt;br /&gt;   &lt;strong&gt;@EJB&lt;/strong&gt; &lt;br /&gt;   private MySessionLocal mysession;&lt;br /&gt;&lt;br /&gt;   public String doGet( xxxxx ) {&lt;br /&gt;&lt;br /&gt;         String name = request.getParameter(&quot;name&quot;);&lt;br /&gt;&lt;br /&gt;         return mysession.getHello(name);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;透過 @EJB 的 annotation, 我們可以不用在使用複雜的&lt;br /&gt;&lt;pre style=&quot;font-size:11px ; font-family: verdana;border: thin dotted #A030A0&quot;&gt;&lt;br /&gt;InitialContext ic = new InitialContext(); &lt;br /&gt;ic.lookup(&quot;ejb/MySession&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;再去轉型, 容易發生導致 ClassCastException 的錯誤 :)
</description>
</item>
<item>
<guid isPermaLink="true">http://jakarta99.blogspirit.com/archive/2006/02/17/oreilly-ejb3-book.html</guid>
<title>Oreilly EJB3 book</title>
<link>http://jakarta99.blogspirit.com/archive/2006/02/17/oreilly-ejb3-book.html</link>
<author>noreply@blogspirit.com (jini(99% jakarta))</author>
<category>EJB3</category>
<pubDate>Fri, 17 Feb 2006 06:49:17 +0100</pubDate>
<description>
Oreilly 預計要在 2006 年五月推出 EJB3 ( 其實也是他們 ejb, ejb1.1, ejb2, ejb2.1 後的第五個 ejb 版本 )&lt;br /&gt;&lt;br /&gt;相關的說明如下&lt;br /&gt;&lt;a href=&quot;http://www.oreilly.com/catalog/entjbeans5/desc.html&quot; target=&quot;_blank&quot;&gt;http://www.oreilly.com/catalog/entjbeans5/desc.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;雖然賣出了 15 萬本, 但是我覺得之前的版本讓初學 ejb 的人會有些茫然. 我不太喜歡他的編排模式 :)&lt;br /&gt;Anyway.. 我希望做的是比較偏向實作面的作者. 讓每個人可以透過程式與架設系統中,&lt;br /&gt;學習各式各樣的觀念. 畢竟 HeadFirst series 以詼諧的手法來描述專業的知識,  我也應該要為自己的風格創下一個定位點.&lt;br /&gt;&lt;br /&gt;與其東湊西拼的一本書, 我目前能夠參考的僅有 Specification ( 還在 Final Draft ... ) 另外不斷實作相關的範例程式. 以及思考相關的解釋與修飾相關的文句. 最重要的是.. 我喜歡把事情做到最好 ~
</description>
</item>
<item>
<guid isPermaLink="true">http://jakarta99.blogspirit.com/archive/2006/02/15/netbeans-j2ee-5-to-glassfish.html</guid>
<title>NetBeans J2EE 5 to Glassfish</title>
<link>http://jakarta99.blogspirit.com/archive/2006/02/15/netbeans-j2ee-5-to-glassfish.html</link>
<author>noreply@blogspirit.com (jini(99% jakarta))</author>
<category>EJB3</category>
<pubDate>Wed, 15 Feb 2006 02:34:32 +0100</pubDate>
<description>
昨天下載了 NetBeans J2EE 5 ( netbeans-javaee5-daily-bin-200602012300-1_Feb_2006_2300.zip  )&lt;br /&gt;發現他的核心已經改為  NetBeans IDE 5.5 &lt;br /&gt;&lt;br /&gt;就 EJB3.0 整合度與核心建立上面來看, 這個版本已經漸趨穩定. 不過有幾個問題, 我認為應該更像是 J2EE 5.0 的方式 !&lt;br /&gt;&lt;br /&gt;1) Call EJB Reference&lt;br /&gt;&lt;br /&gt;目前無法直接取得 EJB3 , 必須自行撰寫 @EJB SomeEJBBI someEJB3; 來取得相關的 EJB.&lt;br /&gt;&lt;br /&gt;2) Datasource&lt;br /&gt;&lt;br /&gt;直接產生的 codes 是 context.lookup . 我的期望是 @Resource&lt;br /&gt;&lt;br /&gt;3) Mail &lt;br /&gt;&lt;br /&gt;直接產生的 codes 也是  context.lookup . 我的期望還是 @Resource&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;總之~ NetBeans J2EE 5 如果是選擇 j2ee5 的 support . 我建議可以忽視 j2ee1.4 之前的 撰寫模式 .
</description>
</item>
<item>
<guid isPermaLink="true">http://jakarta99.blogspirit.com/archive/2006/02/14/實戰-ejb3-0-的點滴.html</guid>
<title>實戰 ejb3.0 的點滴</title>
<link>http://jakarta99.blogspirit.com/archive/2006/02/14/實戰-ejb3-0-的點滴.html</link>
<author>noreply@blogspirit.com (jini(99% jakarta))</author>
<category>EJB3</category>
<pubDate>Tue, 14 Feb 2006 13:00:00 +0100</pubDate>
<description>
&quot;實戰 ejb3.0&quot; , 預計 2006/04/30 準備截稿, 目前的問題有幾個&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1) 該使用哪一個 Application Server + IDE 做為範例&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Eclipse + JBoss 4.0.3 和 NetBeans + Glassfish 都讓我感到頭痛,&lt;br /&gt;基本上, JBoss4.0.3 沒有 Glassfish 這麼完整, 畢竟 Glassfish 應該是 J2EE 5.0 的 RI, 利用 Oracle EJB3.0 的實作,&lt;br /&gt;加上 SUN 在後面不斷 support, 然而, NetBeans J2EE 5 連 Beta 版本都尚未 Release.&lt;br /&gt;&lt;br /&gt;JBoss4.0.3 目前連 @Resource, @EJB 這些 IoC 的 特性都尚未支援,　&lt;br /&gt;就算 Eclipse 是當今最紅的 IDE,　但是 ejb3 相關的整合性仍舊很低&lt;br /&gt;&lt;br /&gt;我目前的想法,　無論是誰,　反正先放到 Appendix 都可以讓讀者讀到&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2) 範例程式的內容&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;我利用 maven　做為範例 sample build 的方式, &lt;br /&gt;基本上,　是因為 Maven 的 multiproject 可以讓 Enterprise Application　開發可以多元化 .&lt;br /&gt;&lt;br /&gt;不過..　到底要做出什麼呢&lt;br /&gt;我目前已經推翻手機銷售網站的企劃,　決定推出類似商城的範例系統
</description>
</item>
</channel>
</rss>