<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet title="XSL formatting" type="text/xsl" href="/atom.xsl" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-tw">
<title>jini's Java EE 5.0 部落格</title>
<link rel="self" type="application/atom+xml" href="http://jakarta99.blogspirit.com/atom.xml"/>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/" />
<subtitle>jini ( 99% jakarta )</subtitle>
<updated>2006-07-17T09:57:27+02:00</updated>
<rights>All Rights Reserved blogSpirit</rights>
<generator uri="http://www.blogspirit.com/" version="6.0">blogSpirit</generator>
<id>http://jakarta99.blogspirit.com/</id>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>Struts Action get Resource by Injection</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/07/16/struts-action-get-resource-by-injection.html" />
<id>tag:jakarta99.blogspirit.com,2006-07-16:904943</id>
<updated>2006-07-17T09:57:27+02:00</updated>
<published>2006-07-17T01:40:00+02:00</published>
<category term="*Overview" scheme="http://www.blogspirit.com/ns/types#category" />
<summary>  http://www.codecomments.com/archive419-2006-6-954408.html    Craig...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
&lt;a href=&quot;http://www.codecomments.com/archive419-2006-6-954408.html&quot; target=&quot;_blank&quot;&gt;http://www.codecomments.com/archive419-2006-6-954408.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Craig McClanahan:&lt;/strong&gt;&lt;br /&gt;&lt;font color=&quot;3333ee&quot;&gt;&lt;br /&gt;&lt;em&gt;A couple of possibilities come to mind ...&lt;br /&gt;&lt;br /&gt;* Inject the resource into a container-instantiated object&lt;br /&gt;(like a servlet), and modify your framework to copy values&lt;br /&gt;in when it creates, say, an Action instance in the Struts case.&lt;br /&gt;BIG PROBLEM: thread safety ... the servlet instance is shared&lt;br /&gt;across all threads, so the variable would get stomped on if there&lt;br /&gt;was more than one simultaneous request.&lt;br /&gt;&lt;br /&gt;* Modify your framework to scan for the injection annotations itself&lt;br /&gt;when it creates new object instances, and perform the same kinds&lt;br /&gt;of injection that the container can do.&lt;br /&gt;&lt;br /&gt;* Use a dependency injection framework that knows how to initialize&lt;br /&gt;properties from JNDI lookups, and configure it to look up the&lt;br /&gt;corresponding resources.&lt;br /&gt;&lt;br /&gt;* Use the managed beans portion of JSF (even if you are not using&lt;br /&gt;the rest of it) as a dependency injection framework, and let the&lt;br /&gt;container go ahead and do the injection for you. (If you're using&lt;br /&gt;an additional framework, it would need to be modified to use&lt;br /&gt;managed beans to create object instances, instead of doing&lt;br /&gt;Class.newInstance() things itself).&lt;br /&gt;&lt;br /&gt;Craig&lt;/em&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;換句話說, Application Server 決定了是否可以 inject 相關的 Resource 到你的系統之中,&lt;br /&gt;如果該 Application Server 並沒有支援 Struts Action 或其他 Framework,&lt;br /&gt;就等於即使你的系統也在 Java EE 5.0 的環境中執行 ~~&lt;br /&gt;也得使用 JNDI lookup 去取得相關的 Resource, &lt;br /&gt;&lt;br /&gt;假設仍然使用習慣的 Framework, 就不會修改相關原始碼去掃描 Annotations.&lt;br /&gt;應該也不會另外找個 DI Framework 來增加 Framework 的複雜度吧..&lt;br /&gt;難道 大家都要被迫學習 JSF ?!&lt;br /&gt;&lt;br /&gt;看來.. 在 Web-tier 利用 InjectionFilter or InjectionInitServlet 先取得相關資源&lt;br /&gt;例如 DataSources, EntityManager 放到 SessionScope 或 ApplicationScope ?&lt;br /&gt;應該是比較可行的方案了..
</content>
</entry>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>Interceptor 與 inv.proceed() 的關係</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/07/16/interceptor-與-inv-proceed-的關係.html" />
<id>tag:jakarta99.blogspirit.com,2006-07-16:904389</id>
<updated>2006-07-16T11:30:55+02:00</updated>
<published>2006-07-16T11:25:00+02:00</published>
<category term="EJB3" scheme="http://www.blogspirit.com/ns/types#category" />
<summary> 寫了一個小程式測試了一下, @Interceptors 他的操作方式  @Stateless...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
寫了一個小程式測試了一下, @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 來處理最後的相關事務
</content>
</entry>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>Interceptor 攔截 basic concept</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/07/10/interceptor-攔截-basic-concept.html" />
<id>tag:jakarta99.blogspirit.com,2006-07-10:894828</id>
<updated>2006-07-10T07:11:16+02:00</updated>
<published>2006-07-10T07:00:00+02:00</published>
<category term="EJB3" scheme="http://www.blogspirit.com/ns/types#category" />
<summary>   code { font-size:9px; font-family:verdana; color:509050; border:1px;...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
&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 實作了
</content>
</entry>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>@Resource 資源取得 JNDI 的相關資源</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/04/09/resource-資源取得-jndi-的相關資源.html" />
<id>tag:jakarta99.blogspirit.com,2006-04-09:697543</id>
<updated>2006-04-09T17:20:07+02:00</updated>
<published>2006-04-09T17:20:07+02:00</published>
<category term="*Overview" scheme="http://www.blogspirit.com/ns/types#category" />
<summary> 在 TheServerside 看到這篇文章...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
在 TheServerside 看到這篇文章&lt;br /&gt;http://www.theserverside.com/news/thread.tss?thread_id=39828&lt;br /&gt;&lt;br /&gt;我利用簡單的資料庫連結做說明, Java EE 5.0 如何使用 @Resource 來取得相關資源&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. JDBC direct connect the Database&lt;/strong&gt;&lt;br /&gt;這是簡單的範例, 我們可以直接利用 DriverManager 去取得 connection, 這種寫法是由  Application 直接驅動連結, 沒有透過 Container, 我認為不是很好的方法 !&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// JDBC Driver 的主要 class 名稱&lt;br /&gt;Class.forName(&quot;com.mysql.jdbc.Driver&quot;); &lt;br /&gt;// 每個 Driver都有標準的連結位置撰寫方式&lt;br /&gt;String url = &quot;jdbc:mysql://host:port/database&quot;; &lt;br /&gt;// 將 URL 與登入帳號密碼連結&lt;br /&gt;Connection con = DriverManager.getConnection( url ,&quot;username&quot;,&quot;password&quot;); &lt;br /&gt;//....&lt;br /&gt;con.close();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. DataSource Connection&lt;/strong&gt;&lt;br /&gt;透過 JNDI 以及 Context lookup 取得 DataSource, 再用 DataSource.getConnection() 取得 Connection.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Context initCtx = new InitialContext();&lt;br /&gt;DataSource ds = (DataSource) initCtx.lookup(&quot;jdbc/mysql&quot;);&lt;br /&gt;Connection conn = ds.getConnection();&lt;br /&gt;//... use this connection to access the database ...&lt;br /&gt;conn.close();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. @Resource mapped global JNDI &lt;/strong&gt;&lt;br /&gt;當開發工程師知道, application server 之中, 已經具備了 jdbc/mysql 這個 JNDI Name, 這樣算是取代了 JNDI context lookup 的方法.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@Resource(name=&quot;jdbc/mysql&quot;)&lt;br /&gt;private DataSource ds;&lt;br /&gt;&lt;br /&gt;Connection conn = ds.getConnection();&lt;br /&gt;//... use this connection to access the database ...&lt;br /&gt;conn.close();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. @Resource dependency injection&lt;/strong&gt;&lt;br /&gt;當開發工程師不知道, application server 之中, 到底具備了哪些資源可以利用, 可以利用 Java EE 5.0 Annotation Resource Injection 的特性, 讓組裝部署人員做相關的設定.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@Resource&lt;br /&gt;private DataSource ds;&lt;br /&gt;&lt;br /&gt;Connection conn = ds.getConnection();&lt;br /&gt;//... use this connection to access the database ...&lt;br /&gt;conn.close();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;web.xml&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    &lt;resource-ref&gt;&lt;br /&gt;        &lt;res-ref-name&gt;packageName.ClassName/ds&lt;/res-ref-name&gt;&lt;br /&gt;        &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;&lt;br /&gt;        &lt;res-auth&gt;Container&lt;/res-auth&gt;&lt;br /&gt;        &lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;&lt;br /&gt;    &lt;/resource-ref&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;sun-web.xml &lt;br /&gt;&lt;code&gt;&lt;br /&gt;  &lt;resource-ref&gt;&lt;br /&gt;    &lt;res-ref-name&gt;DSResourceInjectionServlet/ds&lt;/res-ref-name&gt;&lt;br /&gt;    &lt;jndi-name&gt;jdbc/__default&lt;/jndi-name&gt;&lt;br /&gt;  &lt;/resource-ref&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;所以, 組裝人員可以在 web.xml , sun-web.xml ( glassfish ) 設定相關的 injection 環境及對應到 application server 的 global 的 jndi 設定, 這樣, 可以輕易地完成 Injection 的實作.
</content>
</entry>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>Java EE 5.0 Resource Injections</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/03/30/java-ee-5-0-resource-injections.html" />
<id>tag:jakarta99.blogspirit.com,2006-03-30:673272</id>
<updated>2006-03-30T21:05:00+02:00</updated>
<published>2006-03-30T21:05:00+02:00</published>
<category term="*Overview" scheme="http://www.blogspirit.com/ns/types#category" />
<summary> Java EE 5.0 之中有定義一些可以使用 injection 的 classes  *Servlet   - servlets...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
Java EE 5.0 之中有定義一些可以使用 injection 的 classes&lt;br /&gt;&lt;br /&gt;*Servlet&lt;br /&gt;  - servlets&lt;br /&gt;  - servlet filters&lt;br /&gt;  - event listeners&lt;br /&gt;* JSP&lt;br /&gt;  - tag handlers&lt;br /&gt;  - tag library event listeners&lt;br /&gt;* JSF&lt;br /&gt;  - scoped managed beans&lt;br /&gt;* JAX-WS&lt;br /&gt;  - service endpoints&lt;br /&gt;  - handlers&lt;br /&gt;* EJB&lt;br /&gt;  - beans&lt;br /&gt;  - interceptors&lt;br /&gt;* Java EE platform&lt;br /&gt;  - main class ( static )&lt;br /&gt;  - login callback handler&lt;br /&gt;&lt;br /&gt;之前沒有看到這個規定,  難怪我嘗試著使用 Struts Action 透過 @Resource, @EJB 取得相關的 Resources, 都是回傳 NULL, 看來 action 之中目前僅能透過 JNDI context.lookup 的方式取得 ejb3 及其他的環境變數.&lt;br /&gt;&lt;br /&gt;另外, 曾經當面和 saijones 提到 Deployment Descriptor 與 Annotations 的互補性, 在 spec 中也有定義, 當你在撰寫程式的時候, 使用 @Annotations 可以簡化開發的流程, 基本上, 你就少寫了一個 XML 檔案, 更可以直接設定預設值. 但是當部署人員或應用系統組合人員, 發現你的一些數值需要重新設定, 是不必重新打開原始碼, 修改 @annotations 的部分, 僅僅需要丟一個 xml 檔案放在 /META-INF/ 之中.&lt;br /&gt;&lt;br /&gt;不過, 這種方法, 會不會造成 debug 更為艱鉅呢, 如果工程師被告知有 bugs, 可能永遠不知道是 deployer 將初始值修改成另外一個數值 !! 看來, 簡化開發是否能夠簡化 Debug !! 將會是新的 UnitTest 設計考驗 !!&lt;br /&gt;&lt;br /&gt;另外,  使用 java EE platform 之中的 annotation 大多是 @Retention 為 RUNTIME 的, 所以並非僅用於 compile-time, annotation 的資料是會封裝在 classes 之中.. 所以使用上要格外留意 :)
</content>
</entry>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>該怎麼面對 JSF !</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/03/15/該怎麼面對-jsf.html" />
<id>tag:jakarta99.blogspirit.com,2006-03-15:634771</id>
<updated>2006-03-15T16:31:04+01:00</updated>
<published>2006-03-15T16:31:04+01:00</published>
<category term="JSF" scheme="http://www.blogspirit.com/ns/types#category" />
<summary> 21 世紀初期就是一個很有趣的時代.. 如果就拿 Java 來說, 則是一個詭譎多變的時代  無論是 Servlet, JSP, 甚至...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
21 世紀初期就是一個很有趣的時代..&lt;br /&gt;如果就拿 Java 來說, 則是一個詭譎多變的時代&lt;br /&gt;&lt;br /&gt;無論是 Servlet, JSP, 甚至 JSTL, 幾乎每年都在反對著之前的 java 架構&lt;br /&gt;&lt;br /&gt;當大家在嚷嚷著不使用 struts 的時候,&lt;br /&gt;Webwork 的團隊卻和 struts 合作 ?!&lt;br /&gt;&lt;br /&gt;當大家放棄 EJB 準備使用 SpringFramework 的時候,&lt;br /&gt;EJB3.0 卻浩浩蕩蕩要統一 Business + Persistence Layer ?!&lt;br /&gt;不過我相信&lt;br /&gt;已經使用 SpringFramework 的人們 ~ 一定不會想要轉換跑道 ..&lt;br /&gt;&lt;br /&gt;無論結果如何, MVC Framework 應用在 web 之中,&lt;br /&gt;一定得去面對和實作, 無法逃避的選擇.. &lt;br /&gt;除非你是自己寫的 Framework或是直接用 jsp 來玩 ... &lt;br /&gt;&lt;br /&gt;當我面對著 JSF 預設在 Java EE 5.0 之中&lt;br /&gt;真的覺得很無力... &lt;br /&gt;畢竟我到目前為止, 還是認為 JSF 不是成熟的規格..&lt;br /&gt;又面對著 Tapestry, Wicket 的侵略與威脅&lt;br /&gt;我實在不知道 JSF 的市場在哪裡 ...&lt;br /&gt;&lt;br /&gt;我只能幻想著未來會有越來越多的 JSF components &lt;br /&gt;讓我可以靠著拖拉工作&lt;br /&gt;&lt;br /&gt;簡單說.&lt;br /&gt;如果 ( if )&lt;br /&gt;你要挑選一個 component-based mvc framework.學習&lt;br /&gt;並且 ( &amp;&amp; )&lt;br /&gt;而且沒有任何根深蒂固的觀念的話 ( 沒有其他 framework 的經驗 )&lt;br /&gt;&lt;br /&gt;你再去看 JSF 吧
</content>
</entry>
<entry>
<author>
<name></name>
<uri>http://jakarta99.blogspirit.com/about.html</uri>
</author>
<title>use action/servlet to call EJB3</title>
<link rel="alternate" type="text/html" href="http://jakarta99.blogspirit.com/archive/2006/02/19/use-action-servlet-to-call-ejb3.html" />
<id>tag:jakarta99.blogspirit.com,2006-02-19:582756</id>
<updated>2006-02-19T17:25:00+01:00</updated>
<published>2006-02-19T17:25:00+01:00</published>
<category term="EJB3" scheme="http://www.blogspirit.com/ns/types#category" />
<summary> 現在我們撰寫 WebApplication, 現在應該都是採用 MVC 的架構,  就算不是利用 Opensource 如 Struts,...</summary>
<content type="html" xml:base="http://jakarta99.blogspirit.com/">
現在我們撰寫 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 的錯誤 :)
</content>
</entry>
</feed>