paulwong

          #

          J2EE簡介

          1. J2EE (Java 2 Enterprise Edition)架構

          近年來,J2EE平臺在企業內資訊應用系統的應用上,佔有越來越重要的地位,今天的內容,將先就J2EE的概念提供說明,而實作上的範例,我們將在後續的主題陸續提出討論。
          J2EE平臺提供了能支援多層(Multi-Tier)企業應用程式的技術規格,這些技術主要分為三部份,分別是元件(Component),服務(Service)及通訊(Communication)。
          元件技術讓程式開發者能夠遵循標準方式建立可重用的元件,相同的企業邏輯可因此運用在不同的應用程式內。在這些元件中,可以透過標準化的API使用執行環境提供的服務以及準備好的資源,比如資料庫、名稱及目錄服務(Naming and Directory)、訊息服務(Messaging Service),並可使用交易(Transaction)管理等,這樣一來,也簡化了程式開發的複雜性。在多層架構下,各層間的通訊在J2EE中也提供解決方法。以下將針對元件及常見服務,提供介紹。


          J2EE 的大略架構如下圖:

          Client端如為Web Browser,則須穿過Web Container,透過JSP及Servlet呼叫EJB的方法(Method),以存取後端資料。如Client為使用Swing撰寫之Application,則不須經過Web Container,而是直接呼叫EJB提供的方法。


          2. EJB

          EJB(Enterprise JavaBeans)可看成是一組API的定義,它定義了的EJB開發及部署(Deploy)的方法以及架構。EJB具有架構上的延展性、可定義對交易的反應,而且能設定對不同使用者的存取控制。由於EJB Container提供了Networking, Transaction, Security及Bean Instance Pooling等Logic,因此EJB在EJB Container內執行,可以不須煩惱網路等問題,且可使用EJB Container已經準備好的服務。EJB分為三種,分述如下。

          2.1. Session Bean
          Session Bean通常在一個Client與EJB的一個Session期間存在,但是真實物件的生命週期是由EJB Container控制。一般的應用是將商業邏輯拆解成一個一個方法(Method),再將這些方法在Session Bean中實作,讓EJB Client呼叫使用。Session Bean又分為Stateful及Stateless,而Stateless Session Bean能支援同時多人使用,除非一定要儲存狀態於Session Bean內,否則建議使用Stateless Session Bean。

          2.2. Entity Bean
          Entity Bean是表達資料儲存內容的EJB,雖然Entity Bean目前Persistence作法以將資料存放在Database為主,但不表示僅能使用關聯式資料庫儲存。就實務上來看,在資料查詢所須的SQL Statement較複雜的情況下,則不建議使用Entity Bean,此時直接使用JDBC存取資料庫會是比較方便的作法。

          2.3. MDB(Message-driven Bean)
          MDB顧名思義是由Message驅動的EJB,提供J2EE平臺對非同步訊息(Asynchronized Messages)的處理能力。目前MDB僅能處理透過JMS(Java Message Service)傳遞的Message,其運作原理是實作一個onMessage方法,這樣當JMS內有Message要交由MDB處理時,會由EJB Container從Pool中選一個MDB出來,接著呼叫它的onMessage方法。

          3. J2EE平臺提供之服務及API

          接下來介紹一些常用的J2EE的API,這些服務執行在J2EE Server內,可在Web Container及EJB Containaer內使用。

          3.1. JDBC

          JDBC (Java DataBase Connectivity)主要提供連結至Data Source的方式,Data Source不只是Database,還包括檔案。

          JDBC Driver 主要的工作有三項:
          a. 建立和Data Source之間的Connection。
          b. 送出相關的SQL Statement。
          c. 將結果傳回。

          JDBC除了可以送出一般的SQL Statement之外,也可以呼叫寫好在Database裡的Stored Procedure。

          由於各種Database的連結方式可能都不同,使用JDBC的好處是,不須要自己去寫存取 Database的相關程式,只要使用DBC的API,搭配相關的Driver,就可以讓程式存取各種不同的Database了。
          目前最新版的JDBC 規格是 4.0,但是,在使用JDBC的相關功能之前,要先確認所使用的JDBC Driver支援到哪一個版本。

          JDBC最新的一個Implement叫做RowSet Implementation Specification,是就JDBC原本提供的RowSet再做更進一步的強化。這個部份將會被納入J2SDK1.5中。


          3.2. Servlet
          Servlet是用來處理Request和Response的一些Class,主要是處理HTTP Protocol。它的Package主要有javax.servlet和javax.servlet.http。

          在最新的Servlet 2.3 規格裡,新增了一個叫做「Filter」的功能,Filter的作用是在Request送出之後、以及Response接到之前,再做一個判斷篩選的動作。這個Filter最常用在Reuse原本的程式的時候,為了確保原本的程式結構不被修改,但又須要加上一些新的設定時,就可以使用Filter去做處理,Filter所做的事情也都可以被Log下來。


          3.3. JSP
          JSP的全名是JavaServer Pages,算是Servlet技術的延伸,可以使用HTML或是XML。JSP提供了一個Create Web Content的簡便方式,在搭配JSTL(JavaServer Pages Standard Tag Library)使用的時候,由於JSTL提供了一些很簡便的Tag,所以在程式的撰寫和維護上都會容易許多。目前JSP 規格的最新版本是2.0。

          早期在還沒有JSP的時候,程式和畫面的呈現都會放在Servlet裡,造成維護非常困難,在有JSP之後,可以將程式碼以及畫面切開,在維護上會比全部的東西都放在Servlet裡要方便得多。

          3.4. JMS
          JMS, Java Message Service, 提供了J2EE Components進行相關的Message的功能。一個JMS的應用程式可以分為以下幾個部份:
          a. JMS Clients:是使用JMS API所開發的用來傳送/接收Message的應用程式。
          b. Non-JMS Clients:這些應用程式並沒有使用JMS的API,而是使用Message System所提供的API。
          c. Messages:定義好的一些用在Clients之間溝通的訊息。
          d. JMS Provider:Message System所定義好的,使用JMS來開發的一些功能。
          e. Administered Objects:提供給系統管理者方便使用的預先定義好的JMS Objects。


          3.5. JNDI
          JNDI, Java Naming and Directory Interface,主要是提供Naming和Directory的相關功能,使得應用程式可以更具可攜性(Portable)。應用程式中若使用JNDI相關的API來開發,只要在設定的時候指定JNDI的名稱,就可以存取不同的Directory裡的屬性(Attribute)。JNDI的相關Package有:javax.naming、javax.naming.directory、javax.naming.event、javax.naming.ldap、和javax.naming.spi。

          3.6. Transactions
          J2EE提供了兩組Transactions相關的規格,分別是JTA(Java Transaction API)和JTS(Java Transaction Services)。

          JTA提供了控制Transaction的相關API,程式是去呼叫JTA的API,再由JTA來交給JTS做控制。所提供的Package有javax.transaction和javax.transaction.xa。目前不Support NestedTransactions。在EJB裡,建議使用Bean-managed Transaction,也就是Session Bean或是Message-driven Bean,且在使用的時候,必須先定義目前要用的是JDBC的Transaction或者是JTA的Transaction。

          3.7. Web Services
          在J2EE的架構中,提供了許多有關Web services的API,這些API都是以XML的語法來定義。
          Web Services 相關的API有 JAXP(Java API for XML Processing)、JAXR(Java API for XML Registries)、JAX-RPC(Java API for XML-based RPC)和SAAJ(SOAP with Attachments API for Java)等。
          簡單介紹一下這幾個API:
          a. JAXP:這組API被定義在javax.xml.parser這個Package裡,這個Package提供了SAX和DOM相關的Parser功能。
          b. JAXR:主要是提供存取不同的XML Registry的功能。XML Registry目前最有名的是ebXML和UDDI。
          c. SAAJ:主要是依循 SOAP這個標準,提供了Message和Connection的相關功能。

          posted @ 2008-12-04 11:29 paulwong 閱讀(718) | 評論 (0)編輯 收藏

          EJB的基本觀念介紹

          從J2EE推出以來,已經逐漸為企業所熟知,投入J2EE相關技術的資訊從業人員也不斷增加。在J2EE的各項技術中,EJB 是十分值得投資的新技術。

          你可能已經知道EJB是Enterprise Java Bean的縮寫,但是可能還不知道EJB的用處和架構。本文的主要目的就是讓讀者先有初步的認識,之後在接下來的各期爪哇藍報中再分別介紹更為入的應用介紹。
          1. 基本架構及名詞介紹

          EJB從意義上來說,是一種「技術規範」,而不是一種產品,
          ?Bean Instance :表示在記憶體中實際產生的物件。一個 Bean Class 可以產生多個 Bean Instance 。Bean Instance 才是真正執行 EJB method 的物件。

          ?Container:容器是可提供特定元件(Components)服務的標準執行環境。例如,Web Container必須提供必要的程序(呼叫特定頁面、處理程式等),回應Client端的需求,並將處理結果傳回Client端。

          ?EJB Container: 是EJB 標準執行環境,所有 EJB 的產生,或是消滅,或是執行等等,均透過 EJB Container 來處理。當使用者呼叫某個EJB 的時候,實際上也是透過 EJB Container 來執行。

          ?Deploy:一個寫好的 EJB 並不能單獨執行,他必須被「放」到EJB Container 之後才能夠執行,而這個動作就是Deploy。Deploy通常只是執行某個動作、按鈕,之後的動作就交由Application Server自行處理。

          ?EJB Client:負責使用者介面呈現的元件,可能是JSP/Servlet,或者是一個Standalone Java Application。

          ?Message Queue:在程式中要傳達的資料片斷稱為Message,存在於記憶體中,而Message都可經由Message Queue提供給不同的Process進行處理。Message Queue儲存了每個的Message的位址(Address)、型態(Type)、大小(size)、指到下一個Message的指標(pointer)等,它的資料結構基本上是一個Linked List。

          2. EJB的種類及用處

          EJB 依照特性的不同,區分為幾種。
          ?Session Bean:主要的目的是讓程式開發者將邏輯層抽離,這些「邏輯」通常就是一個應用程式中的Business Logic,在整個系統開發中佔有相當重要的一部份。系統開發者可以多加利用Session Bean,將複雜的邏輯放在 Session Bean 的Method中。

            ? Stateful Session Bean:可以記錄呼叫者的狀態,因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體(Instance)。

          ?Stateless Session Bean:也是邏輯元件,但是他卻不負責記錄使用者狀態,也就是說當使用者呼叫 Stateless Session Bean 的時候,EJB Container 並不會找尋特定的 Stateless Session Bean 的實體來執行這個 method。

          ?Entity Bean:它的角色是主要是資料元件,主要目的在於提供資料,讓系統開發人員直接將Entity Bean 當作程式中所要用到的資料;至於 Entity Bean如何存取一個Relational Databse或LDAP,就可以作為另外一項獨立的事情。

            ?Bean-Managed Persistence(BMP):由名稱上就可以直接了解到BMP是由Bean自行維護資料的一致。`而Bean從資料庫取得資料後,BMP 中需要自行宣告欄位來存放這些資料,相關的 JDBC 語法等程式,也都須要自行撰寫。適用於開發人員想要完全控制 BMP 的資料存取行為時。

          ? Container-Managed Persistence(CMP):
          相對於BMP,CMP是由 EJB Container 負責維護資料。撰寫 CMP 的程式設計師並不需要撰寫大多數的 JDBC 語法,通常只需要撰寫Deployment Description,就可以產生 CMP ;實際上的程式碼是 EJB Container在Deploy EJB 的時候所產生。CMP似乎有助於快速開發系統(大部份的工作都交給EJB Container了嘛),但是須要配合使用支援 CMP 的Application Server,而截至目前為止,每一家不同Application Server對CMP 的支援程度也不大相同。

          ? Message Driven Bean:
          主要的目的在於反應 Message Queue 中的事件,當 Message Queue 中有訊息傳入時,Message Driven Bean 可以被觸發,做出對應的反應;所以Message Driven Bean可以說是主動反應,而不是「呼叫某個Method」這樣的方式被動觸發。

          其中 Session Bean 與Entity Bean在 EJB 規格 1.x 的時候就已經存在了,而 Message Driven Bean 則出現在 EJB 2.0 的規格中。

          posted @ 2008-12-04 11:27 paulwong 閱讀(523) | 評論 (0)編輯 收藏

          在jsp頁面中使用oscache標簽實現可配置的頁面緩存

          最近在學習oscache的相關內容,寫點東西作為鞏固

          如果在jsp中使用如下標簽

          <cache:cache key="foobar" scope="session">  
                    some jsp content   
          </cache:cache> 


          那么這中間的一段jsp代碼將會以key="foobar"緩存在session中,任何其他頁面中使用這個key
          的cache標簽都能共享這段存在緩存中的執行結果

          考慮一個需求,一個頁面是有許多個不同的jsp文件拼出來的
          可能在頁首有隨機的廣告,登錄用戶的信息,系統的即時信息,固定的目錄信息等等
          這其中可以考慮將固定的目錄信息放入緩存中,而其他動態信息則即時刷新
          再進一步考慮 有時候頁面之間的信息是關聯的,只有當其中一條信息的內容變化了才需要去刷新
          對于這種需求就可以考慮在<cache:cache/>標簽中配置group屬性,將不同的具有關聯關系的cache內容
          分組,這樣oscache會自動的幫你檢查該組緩存內容的變化情況,如果有任何一子成員組的內容變化了
          則會執行刷新,這樣就可以在頁面實現數據的動態同步
          代碼如下:(來源oscache:groupTest.jsp )



          <%@ page import="java.util.*" %>  
          <%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>  
             
           
          <head>  
           
          <title>Test Page</title>  
           
          <style type="text/css">  
           body 
          {font-family: Arial, Verdana, Geneva, Helvetica, sans-serif}  
           
          </style>  
           
          </head>  
           
          <body>  
             
           
          <href="<%= request.getContextPath() %>/">Back to index</a><p>  
           
          <hr>Flushing 'group2'<hr>  
           
          <cache:flush group='group2' scope='application'/>  
           
          <hr>  
           
          <cache:cache key='test1' groups='group1,group2' duration='5s'>  
               
          <b>Cache Time</b><%= (new Date()).getTime() %><br>  
               This is some cache content test1 that is in 'group1' and 'group2'. Normally it would refresh if it  
               was more than 5 seconds old, however the 
          <cache:flush group='group2' scope='application'>  
               tag causes this entry to be flushed on every page refresh.
          <br>  
           
          </cache:cache>  
           
          <hr> 



          這里有兩個cache分組group1和group2,將group2設置為每次都執行刷新,所以test1為key的cache每次刷新頁面內容都是重新執行過的

          <cache:cache key='test2' groups='group1' duration='5s'>  
              
          <b>Cache Time</b><%= (new Date()).getTime() %><br>  
               This is some cache content test2 that is in 'group1' (refreshes if more than 5 seconds old)
          <br>  
           
          </cache:cache>  
           
          <hr> 


          而test2只有當間隔時間超過5秒才會更新內容

           <cache:cache key='test3' duration='20s'>  
               
          <b>Cache Time</b><%= (new Date()).getTime() %><br>  
               This is some cache content test3 that is in 'group1' and 'group2'. The groups are added using the 
          <cache:addgroup /> tag.<br>  
               
          <cache:addgroup group='group1'/>  
               
          <cache:addgroup group='group2'/>  
           
          </cache:cache>  
           
          <hr>  
           
          <cache:cache key='test4' duration='20s'>  
               
          <b>Cache Time</b><%= (new Date()).getTime() %><br>  
               This is some cache content test4 that is in 'group1' and 'group2'. The groups are added using the 
          <cache:addgroups /> tag.<br>  
               
          <cache:addgroups groups='group1,group2'/>  
          </cache:cache>  
           
          <hr>  
           
          </body>  
          </html> 


          <cache:addgroup group='{you_group}'/>可以將所在的cache加入存在的group中

          posted @ 2008-02-19 22:28 paulwong 閱讀(1504) | 評論 (0)編輯 收藏

          用Hibernate實現領域對象的自定義字段

               摘要: 導言 在開發企業級業務應用(企業規模)時,客戶往往要求在不修改系統源代碼的情況下對應用對象模型的擴展性提供支持。利用可擴展域模型可以實現新功能的開發,而不需要額外的精力和成本 應用的使用周期將被延長;  外部因素改變時,系統工作流也可以隨之被修改; 已經被部署的應用可以被“設定”,使其符合企業的特定情況。 完成以上功能...  閱讀全文

          posted @ 2008-01-23 11:57 paulwong 閱讀(2186) | 評論 (1)編輯 收藏

          struts2筆記:與spring2集成


          struts2基本上就是webwork的翻版,所以遷移過程倒是很簡單,只需要修改下配置文件和一些包名就可以了。如果在Eclipse、Netbeans這些集成開發工具的幫助下,記不清包名也很容易找到想要的類的,呵呵。


          在Eclipse下建立一個Dynamic Web Application。


          從struts2.0.6的lib目錄中復制下面的庫文件到WEB-INF/lib目錄下:
          commons-logging-1.1.jar
          freemarker-2.3.8.jar
          ognl-2.6.9.jar
          struts-api-2.0.6.jar
          struts-core-2.0.6.jar
          struts-spring-plugin-2.0.6.jar
          xwork-2.0.0.jar


          從spring中lib目錄中復制下面的庫文件到WEB-INF/lib目錄下:
          spring.jar


          修改web.xml,增加一個struts的分派器filter,映射所有的url-pattern,再增加一個spring的ContextLoaderListener監聽器。修改后的內容如下:


          <?xml version="1.0" encoding="UTF-8"?>   
          <web-app id="WebApp_ID" version="2.4"   
              xmlns
          ="http://java.sun.com/xml/ns/j2ee"   
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"   
              xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   
              
          <display-name>struts2tutorial</display-name>   
                  
              
          <filter>   
                  
          <filter-name>struts2</filter-name>   
                  
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>   
              
          </filter>   
                  
              
          <filter-mapping>   
                  
          <filter-name>struts2</filter-name>   
                  
          <url-pattern>*.action</url-pattern>   
              
          </filter-mapping>   
                  
              
          <welcome-file-list>   
                  
          <welcome-file>index.jsp</welcome-file>   
              
          </welcome-file-list>   
                  
              
          <listener>   
                  
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
              
          </listener>   
                  
          </web-app>   

           

          寫一個簡單的Action,HelloWorld:


          package tutorial;    
          import com.opensymphony.xwork2.ActionSupport;    
          public class HelloWorld extends ActionSupport {    
             
              
          public static final String MESSAGE = "Struts is up and running ";    
             
              
          public String execute() throws Exception {    
                  setMessage(MESSAGE);    
                  
          return SUCCESS;    
              }
              
             
              
          private String message;    
             
              
          public void setMessage(String message){    
                  
          this.message = message;    
              }
              
             
              
          public String getMessage() {    
                  
          return message;    
              }
              
          }
             


          在源文件路徑下(項目的src目錄)增加struts.xml配置action。這個文件是集成spring的關鍵所在,這里面描述有如何將spring2集成到struts2的相關信息:


          <!DOCTYPE struts PUBLIC    
              "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    
              "http://struts.apache.org/dtds/struts-2.0.dtd"
          >   
          <struts> 
              
          <!-- 下面這句表明對象是由spring負責產生的.加上這句后,struts會產生讓spring負責產生bean,如果spring不能產生bean,則由struts自己產生.也可以在struts.properties文件內定義這個屬性.--> 
              
          <constant name="objectFactory" value="spring"></constant>   
              
          <package name="struts2tutoial" extends="struts-default" namespace="/">   
                  
          <!-- 注意,現在action的class屬性不再是類的名字了,而是在spring中的bean的id,詳細信息請看下面的spring的bean配置文件applicationContext.xml --> 
                  
          <action name="HelloWorld" class="helloWorld">   
                      
          <result>/helloWorld.jsp</result>   
                  
          </action>   
                  
          <!-- Add your actions here -->   
              
          </package>   
          </struts>   


          在WEB-INF/目錄下增加spring的bean配置文件applicationContext.xml:


          <?xml version="1.0" encoding="UTF-8"?>   
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">   
          <beans>   
             
              
          <bean id="helloWorld" class="tutorial.HelloWorld"></bean>   
             
          </beans>  


          配置很簡單,只有一個bean。

          最后,在WebContent目錄下增加helloWorld.jsp:


          <%@ taglib prefix="s" uri="/struts-tags" %>   
             
          <html>   
              
          <head>   
                  
          <title>Hello World!</title>   
              
          </head>   
              
          <body>   
                  
          <h2><s:property value="message" /></h2>   
              
          </body>   
          </html> 

          posted @ 2007-07-16 23:38 paulwong 閱讀(572) | 評論 (0)編輯 收藏

          Struts-Menu結合角色權限的應用

               摘要: STRUTS-MENU簡介:STRUTS-MENU支持靜態和動態菜單,數據來源和顯示方式分開,菜單文字國際化,權限。 <menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html"  bundle="org.apache.stru...  閱讀全文

          posted @ 2007-07-16 23:07 paulwong 閱讀(1827) | 評論 (1)編輯 收藏

          Spring Module---cache

          項目需要緩存,google了一下,發現spring module有現成的東西可用,隨即拿來看看。發現還是比較好用的。
          改cache采用了aop的方式進行cache的寫入和刷出。使用spring風格,上手容易。
          系統負載不高,因此對于該緩存方法的性能等等不做評價,目前滿足需要。
          使用方法:
          有這么幾個概念需要提前知道1.XXCacheFacade,比如如果是oscache,那么XX就是oscachefacade.該類負責緩存的寫入和刷出

          <bean id="oscacheFacade" class="org.springmodules.cache.provider.oscache.OsCacheFacade">  
              
          <property name="failQuietlyEnabled" value="true"/>  
              
          <property name="cacheManager">  
                  
          <bean id="oscacheManager" class="org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean"/>  
              
          </property>  
            
          </bean>  


          里面的cacheManager必須要有,改類負責提供底層具體的cache實現,比如oscache或者EHcache等。
          2.MethodMapCachingInterceptor這個攔截器是官方提供的同類型的攔截器之一,根據方法名,參數匹配攔截。

          <bean id="cachingInterceptor001" class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">  
              
          <property name="cacheProviderFacade" ref="oscacheFacade"/>  
              
          <property name="cachingModels">  
                  
          <props>  
                      
          <prop key="com.company.jncz.TestItIF.get*">groups=aa;refreshPeriod=10</prop>  
                      
          <prop key="com.company.jncz.TestItIF.load*">groups=bb;refreshPeriod=10</prop>  
                  
          </props>  
              
          </property>  
            
          </bean>  


          注意cachingModels。有兩種方式寫法,一種是上面看到的使用props另一種是使用Map.在有些情況下只能使用Map方式,下面解釋

          <map>  
            
          <entry key="com.company.jncz.TestIt.get*">  
              
          <ref local="oscacheCachingModel"/>  
            
          </entry>  
          </map>  

           

           

          <bean id="oscacheCachingModel" class="org.springmodules.cache.provider.oscache.OsCacheCachingModel">  
              
          <property name="groups">  
                      
          <list>  
                         
          <value>aa</value>  
                         
          <value>bb</value>  
                      
          </list>  
                 
          </property>  
              
          <property name="refreshPeriod" value="10"/>  
           
          </bean>  


          尤其當groups(對于oscache來說是groups)的值不止一個的時候,就需要使用map的方式。
          否則不生效(也許還有什么我沒有注意到).另外需要注意的是對于model來說他的key很重要。有以下需要注意:如果AImpl是A接口的實現類,而且你在其他地方使用時都是用A接口來聲明的,那么key就必須寫成接口的全限定名比如:com.company.jncz.A.getXX,否則無法識別。

           

          對于與cachingModel相對應的flushingModel寫法是類似的,參考api很容易寫出來。

          最后

          <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
                  
          <property name="beanNames">  
                      
          <value>*Service</value>  
                  
          </property>  
                  
          <property name="interceptorNames">  
                      
          <list>  
                          
          <value>cachingInterceptor001</value>  
                          
          <value>flushingInterceptor001</value>  
                      
          </list>  
                  
          </property>  
            
          </bean>  
            
          <bean id="testService" class="com.company.jncz.TestItStub"/>  


          這些不做介紹。
          總之比較簡單。這兩天感冒,昏昏沉沉,不知道有沒有表達清楚。。。。

           

          自己看了一眼,的確沒說清楚,要清楚的幾個概念是cacheFacade.CachingModel.FlushingModel.CachingInterceptor.FlushingInterceptor.這些算是比較重要的。其他aop內容略。caching攔截器攔截某方法,根據cachingModel定義的規則由cacheFacade將之放入cache。flushing攔截器攔截到某方法,根據flushingModel定義的規則由cacheFacade將對應的cache清除。嗯,基本上流程就這樣子了。

          posted @ 2007-07-16 17:01 paulwong 閱讀(1398) | 評論 (0)編輯 收藏

          applicationContext解析

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

          <beans>

            建立一個數據源
           
          <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            
          <property name="driverClassName">
             
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
            
          </property>
            
          <property name="url">
             
          <value>jdbc:microsoft:sqlserver://192.168.0.6:1433</value>
            
          </property>
            
          <property name="username">
             
          <value>sa</value>
            
          </property>
            
          <property name="password">
             
          <value></value>
            
          </property>
           
          </bean>

            建立會話工廠類,這個類使用spring專門為hibernate3提供LocalSessionFactoryBean
           
           
          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            
          <property name="dataSource">
             
          <ref local="dataSource" />  --引用上面的數據源
            
          </property>
            
          <property name="mappingResources">  --調入映射文檔
             
          <list>
              
          <value>com/yourcompany/User.hbm.xml</value>  
             
          </list>
            
          </property>
            
          <property name="hibernateProperties">  --相關設置
             
          <props>
              
          <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
              
          <prop key="hibernate.show_sql">true</prop>
             
          </props>
            
          </property>
           
          </bean>
            

              定義事務管理器,這個也是 spring專門為hibernate3提供的HibernateTransactionManager 事務管理器
           
          <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            
          <property name="sessionFactory">
             
          <ref local="sessionFactory" />   --引用會話工廠類
            
          </property>
           
          </bean>


           定義實體DAO
           
          <bean id="userDAO" class="com.yourcompany.UserDAOImp">
            
          <property name="sessionFactory">
             
          <ref local="sessionFactory" />--引用會話工廠類
            
          </property>
           
          </bean>
           

           為上面的實體DAO定義一個代理(proxy)類,這是spring為解決事務問題而提供TransactionProxyFactoryBean動態事務代理類
           
          <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            
          <property name="transactionManager">
             
          <ref bean="transactionManager" />  --指定事務管理器(需要是spring專用的)
            
          </property>
            
          <property name="target"> --目標實體DAO類
             
          <ref local="userDAO" />
            
          </property>
            
          <property name="transactionAttributes"> --定義要使用事務的方法
             
          <props>
              
          <prop key="insert*">PROPAGATION_REQUIRED</prop>  --所有insert開頭的方法都使用事務,出錯要回滾
              
          <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> --所有get開頭的方法都使用只讀事務
              
          <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>--所有ist開頭的方法都使用只讀事務
             
          </props>
            
          </property>
           
          </bean>


            為 path="/login" 的struts action 定義實際的action類,該action 已經進行 type="org.springframework.web.struts.DelegatingActionProxy"設置
            
          <bean name="/login" class="com.yourcompany.struts.action.LoginAction" singleton="false">
              
          <property name="userDAO">
              
          <ref bean="userDAOProxy" />  --注意,這里指定的userDAO是上面定義的代理類
            
          </property>
           
          </bean>
          </beans> 

          posted @ 2007-04-06 16:19 paulwong 閱讀(302) | 評論 (0)編輯 收藏

          RFID 應用

          小心「RFID 智能型陳列貨架」就在你身邊!


          還有什么比自己的一舉一動受人監控還要恐怖的事呢?現在,日本的 DNP、Tana-X 和SEARS(不是美國的那個Sears喔!)正在研發一種智能型陳列貨架,可以追蹤掛著RFID 標簽的商品,進而分析消費者的行為模式,像是:商品的「訪客率」及購買率,消費者的「平均考慮時間」及「同次購買物品」(比方說消費者可能會同時購買 PSP和UMD光盤),當消費者拿起商品掃進店內的 POP 系統,查詢產品的相關信息時,系統背后的營銷人員也在悄悄收集相關信息,進而獲得所需的營銷信息。


          目前我們還不太確定今年十二月圣誕節采購旺季時,哪里的消費者會被「試用」,不過建議大家在逛街的同時,還是多回頭看看,小心「RFID 智能型陳列貨架」就在你身邊。



          IBM 發布標簽箝技術,讓 RFID 可靠一點點...


          RFID 無線辨識系統的數據安全,實在是讓人冷汗直流。特別是在護照及信用卡方面,已經傳出了相當多的問題之后,讓人必須快點找到應對的方法。而咱們的藍色巨人,不玩筆電很久的 IBM 公司,近來則是在不改變 RFID 運作的方法之下,改進了其安全性上的問題。


          利用這個叫做標簽箝的方式(clipped tag),將天線的接收訊號的范圍縮小到只有短短的幾吋之內,將 RFID 的讀取限制在一個很小的范圍,迫使有心人必須非常接近相關的卡片、卷標,才能有效的讀取并竊取數據,試想,如果有人故意貼在你身上拿個掃描裝置來探測你,你會不反擊嗎?


          那這項技術廣泛應用要等多久呢?一年?不用!一個月?不用!根據 InfoWorld,再過幾天,他就會開始在市面上使用(特定區域、對象),而該雜志也專訪了加拿大一位專家 Ann Cavoukian 博士,請教她對于這項技術的看法,她則表示,這項技術解決了相當多讓人頭痛的問題,進而讓 RFID 技術能讓消費者隱私的安全,多上了點保護。


          雖然這目前只是個折沖的辦法,但是只要消費者小心點,重要證件、檔案不要落到有心人手里,我們就可以不用擔心,沒事走在路上,私人資料就被掃走的問題。



          IBM 將利用 RFID 技術來防止假藥流入市面


          RFID 無線辨識技術上的應用,算是越來越廣泛了,雖然也曾經出了不少問題,但經過一番努力,這項技術,相信還是能為全體民眾帶來更多的便利及保障。


          近來 IBM 則是要將 RFID 應用在藥品運送的管控上,讓有心人無機可乘。利用瓶身上的 RFID 標簽,在經由各個轉運站時,工作人員透過相對應的接收裝置,將 RFID 里頭的信息讀入電腦,并上傳到藥廠,讓藥廠能夠追蹤藥品在通路期間的轉運地點,并且實時更新相關數據,到了中游的通路商、下游的藥局手中時,也能利用藥廠提供的數據,來作比對,確保沒有被掉包之疑慮。



          飛利浦推出使用 RFID 技術的植物標本箱
          ?

          飛利浦公司又將觸角伸向另一項前無古人的新科技-植物標本箱-運用RFID(無線射頻辨識技術)的植物溫室。這個植物溫室能夠偵測你種植在它貼了標簽的花盆里植物的品種,然后針對該品種制造完美的成長環境,這樣你就可以很簡便地在家栽種新鮮荷蘭芹、鼠尾草、迷迭香和百里香等調味植物,免除了出門去市集或是有機食物專賣超市購物的麻煩。



          將行李置入 RFID 標簽,從此時無走失之慮



          我們想有一天,這個世界應該會布滿 RFID 標簽, 正要出門旅行的您,手上的行李相當不能例外。位在拉斯維加司的馬卡倫國際機場(McCarran International Airport),在他們三條航線中,設立了一個系統,為您家的行李裝上 RFID 標簽,透過單音道的掃射,可以追蹤標簽自動地將您的行李送到正確的目的地,停留在原地等待進一步的掃射。官方聲稱這套系統將有99.5%的準確性,所以朋友們,賭上一把的時候,別忘了順別跟上帝禱告一下,您的行李不在0.5%的誤差范圍內。



          RFID 幫消費者選擇化妝用品


          日本 Seijo 藥妝店貼心的為消費者推出了一項化妝品試用服務,今后消費者就不用將擺在架上不知幾個人試用過的化妝品抹在臉上試用,可以改用一款由 NTT 設計的 RFID 仿真化妝軟件來看看心儀的化妝品是否適合自己。


          消費者只需要坐在電腦屏幕前,由網絡攝影機幫他拍張臉部正面照,照片出現在屏幕后,消費者就可以開始把自己想要試用的化妝品用電腦內置的 RFID 掃描儀讀取,然后軟件會根據掃描進來的化妝品項目自動判斷應該涂抹在臉部的哪個部位,消費者便可由屏幕上出現的照片來判斷此化妝品的顏色或質感是否適合自己或符合自己所需。


          此軟件還會根據消費者選用的產品再推薦其它能夠相互搭配的色彩,所有配色和試用的動作完成后,消費者還可以把屏幕上完妝后的照片印出來,做為日后購物的參考。


          這個所有程序都由電腦完成的化妝品試用軟件,保證比傳統專柜一對一試用來得迅速方便,造福的除了女性外,應該還有常需要陪另一半逛公司,并在一旁苦等的男性朋友吧。



          確保清酒瓷具組安全的 RFID 標簽


          像這樣頂級清酒瓷器組,如果不能在恒溫底下保存,可能本身的質量會受影響,尤其是在長途運送的過程,更是苦煞制造商。


          于是NTT和數家瓷器公司一同合作,利用監測程序來偵測貼在瓷器上具溫度傳感器的RFID卷標,并讓運送的卡車上裝載感應器,實時將標簽的感應值藉由3G來傳送至總部,如果有任何異狀,可以實時反應(如果司機想趁機開箱行竊,是逃不過感應器法眼的!)。


          當運送到買家手上,就可以調閱其溫度記錄,看看是否被動手腳。看來這對于其它的高檔貨而言,可能會是的不錯的防盜措施!



          美國將在八月正式對一般民眾發行 RFID 護照


          經過了各方角力爭議,最終美國還是會在八月對一般民眾發行 RFID 護照 ePassport(先前已經讓外交人員使用。)。而新的帶有 RFID 標簽的護照,里頭將會包含姓名、地址、國籍、相片、數字化的指紋文件等個人相關資料。


          而先前所擔心的防偽、資料外泄等問題,美國政府仍然十分自信,表示他們已經做好萬全的準備。不過自從荷蘭發行的 RFID 護照遭破解、竊取數據后,人們就開始對 RFID 護照的可靠與否感到懷疑。而這項科技,最終將是會便利機場的安檢、節省大家的時間,或是讓科技罪犯更容易的侵犯他人隱私,大家可以好好觀察后續的發展。



          VoIP 和 RFID High 翻日本試衣間


          愛逛街的女生要注意啰,日本三越百貨最近引進一個新系統,讓消費者在試衣間時,可透過無線辨識系統 (RFID) 先將衣服上的吊牌掃入,然后使用網絡語音電話 (VoIP) 查看目前店內的庫存,并通知店員展示其它所需商品。


          這個系統利用三越百貨本身的銷售端管理系統 (Point of Sale System),可實時掌控店內的庫存,配合使用 Cisco 的網絡電話,整個安裝成本只需美金 700~800元,相較之下,成本高達美金 20,000~25,000 的觸碰式銀幕型導覽器 (touchscreen kiosk),實在貴多了。


          當衣服被掃入辨識系統之后,可供選擇的尺寸、顏色及其它類似款式的服飾會顯示在電話上的觸碰式銀幕,消費者拿起話機就可與店員通話,這可比在試衣間扯著嗓子喊著自己所需的尺寸低調多了。


          系統供貨商 Litescape 宣稱,目前已向許多美國零售商(Abercrombie、HomeDepot、Gap、Virgin Mega…等)推銷這個系統,不知何時才輪到中國?



          韓國公司 Rocket 發展「紙電池」,主要應用在 RFID 等方面


          雖然韓國公司 Rocket 開發的這個產品被自稱為「紙電池」,但似乎應該只是指它和紙一樣薄(像 NEC 一年前的產品一樣),而不是真的用紙做的。在技術的部份我們是一個字兒也看不懂,不過大致上就是「電池科技」+「薄膜科技」產生一個像紙一樣薄、無毒、而且不會著火也不會爆炸(重要!)的新電池之類的吧。


          Rocket 估計主要的應用應該是在 RFID、智能卡和「化妝品、藥品輸送系統」等需要迷你電池的地方。奇怪的是,Rocket 還提出了「牙齒美白、抗老化、去皺紋」的應用,我們實在猜不出電擊牙齒是怎么能讓它變白?總之,讓我們期待看看它是如何神奇吧!


          http://cn.engadget.com/search/?q=rfid

          posted @ 2006-12-23 11:38 paulwong 閱讀(268) | 評論 (0)編輯 收藏

          JSP + Jndi + Spring + Hibernate 心得筆記

          這幾天小試了一下JSP +Jndi + Spring + Hibernate組合的功能,想讓JSP網頁可以秀出Database裡的資料。試了老半天,發現要讓這組合成功運作,還真的是很麻煩,很多細節要注意。而且很多設定找不到文件,很讓人...DeadDeadDead


          以下是這個組合成功運作所需注意的地方。


          1.系統建置環境如下
          AP Server : Tomcat 5.5.x
          Database : Oracle 10g
          Framework : Spring 1.2.x + Hibernate 3.x


          2.相關重要修改設定如下
          2.1 首先,我要利用Tomcat的DBCP Connection pool功能,所以必需先改Tomcat裡面的Server.xml設定檔,加入下面藍字所示的相關設定

          <Host>
          ??
          ??中略
          ??
          ??
          <Context?中略>
          ????
          ????
          <!--?Tomcat5.5的DBCP設定方式寫法與之前版本完全不同?-->
          ????
          <Resource?
          ??????
          name="jdbc/scott"
          ??????auth
          ="Container"
          ??????factory
          ="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"?????????????
          ??????type
          ="javax.sql.DataSource"
          ??????driverClassName
          ="oracle.jdbc.driver.OracleDriver"????????????
          ??????url
          ="jdbc:oracle:thin:@localhost:1521:orcl"??????????????
          ??????username
          ="scott"????????????
          ??????password
          ="tiger"
          ??????maxIdle
          ="10"
          ??????maxWait
          ="1000"??????????????
          ??????maxActive
          ="100"/>????
          ??????
          ??
          </Context>
          </Host>


          2.2 接下來修改web.xml設定檔藍字所示內容

          <?xml?version="1.0"?encoding="UTF-8"?>
          <web-app?id="WebApp_ID"?version="2.4"
          ??xmlns
          ="http://java.sun.com/xml/ns/j2ee"
          ??xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          ??xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
          ?
          ??
          <!--?指定log4j設定檔位置?-->
          ??
          <context-param>
          ????
          <param-name>log4jConfigLocation</param-name>
          ????
          <param-value>/WEB-INF/log4j.properties</param-value>
          ??
          </context-param>
          ??????
          ??
          <!--?指定spring設定檔位置?-->
          ??
          <context-param>
          ????
          <param-name>contextConfigLocation</param-name>
          ????
          <param-value>/WEB-INF/beans-config.xml</param-value>
          ??
          </context-param>?
          ??
          ??
          <!--?一定要在ContextLoaderListener設定之前加上Log4jConfigListener設定,如此一來ContextLoaderListener才可以正常運作?-->
          ??
          <listener>
          ????
          <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
          ??
          </listener>
          ?
          ??
          <listener>
          ????
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          ??
          </listener>??
          ?
          ??
          <!--?指定此項Filter可使Spring取回的DomainObject在JSP(View層)作完所有的事情後,才將Hiberante?Session給Close?-->
          ??
          <filter>
          ??????
          <filter-name>hibernateFilter</filter-name>
          ??????
          <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
          ??
          </filter>?
          ??
          ??
          <filter-mapping>
          ??????
          <filter-name>hibernateFilter</filter-name>
          ???????
          <url-pattern>/*</url-pattern>
          ??
          </filter-mapping>
          ??
          ??
          <!--?指定JNDI?JDBC?DataSource?-->
          ??
          <resource-ref>
          ????
          <description>JNDI?JDBC?DataSource</description>
          ????
          <res-ref-name>jdbc/scott</res-ref-name>
          ????
          <res-type>javax.sql.DataSource</res-type>
          ????
          <res-auth>Container</res-auth>
          ??
          </resource-ref>
          ??
          ??中略

          </web-app>


          2.3 在/WEB-INF目錄裡面,增加beans-config.xml這個Srping設定檔,修改藍字所示內容


          <?xml?version="1.0"?encoding="UTF-8"?>?
          <!DOCTYPE?beans?PUBLIC?"-//SPRING/DTD?BEAN/EN"?
          ?"http://www.springframework.org/dtd/spring-beans.dtd"
          >?
          <beans>?
          ????中略
          ?????
          ????
          <!--?利用JNDI的方式連結到DataSource?-->
          ????
          <bean?id="dataSource"?class="org.springframework.jndi.JndiObjectFactoryBean">?
          ????????
          <property?name="jndiName">??
          ????????????
          <!--?不可省略"java:comp/env/"字串,否則會出現異常?-->
          ????????????
          <value>java:comp/env/jdbc/scott</value>?
          ????????
          </property>??
          ????
          </bean>?????????
          ????
          ????中略
          </beans>


          2.4 在/WEB-INF目錄裡面,增加log4j.properties這個log4j設定檔

          #這是我用的設定檔,請自行修改成以符合實務上需求
          log4j.rootLogger=info,consoleAppender
          log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
          log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
          log4j.appender.consoleAppender.layout.ConversionPattern=%d?[%t]?%-5p?%c?-?%m%n


          3.大功告成...寫個測試的JSP網頁試試看吧...Big SmileBig SmileBig Smile...以下是我測試用的JSP,請自行修改以符合實務上需求

          <%@?page?language="java"?contentType="text/html;?charset=utf-8"??pageEncoding="utf-8"%>
          <%@?page?import="org.springframework.web.context.WebApplicationContext"%>
          <%@?page?import="org.springframework.web.context.support.WebApplicationContextUtils"%>
          <%@?page?import="com.db.table.Emp"%>
          <%@?page?import="com.db.dao.IEmpDAO;"%>
          ?
          <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">
          <html>
          <head>
          <meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8">
          <title>Spring?Test</title>
          </head>
          <body>
          <%
          ??WebApplicationContext?context?
          =?WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());??
          ??IEmpDAO?empDAO?
          =?(IEmpDAO)context.getBean("empDAOImpl");
          ??Emp?emp?
          =?empDAO.find(new?Short((short)7369));
          ??out.println(
          "Ename:?"?+?emp.getEname()?+?"<br>");
          ??out.println(
          "Dname:?"?+?emp.getDept().getDname()?+?"<br>");
          %>
          </body>
          </html>

          posted @ 2006-12-20 14:53 paulwong 閱讀(1687) | 評論 (0)編輯 收藏

          僅列出標題
          共115頁: First 上一頁 107 108 109 110 111 112 113 114 115 下一頁 
          主站蜘蛛池模板: 高雄县| 阳山县| 教育| 大英县| 铜梁县| 德保县| 临湘市| 浙江省| 贺州市| 文安县| 石河子市| 吴川市| 澎湖县| 西城区| 肇源县| 永州市| 安泽县| 阳谷县| 通江县| 南溪县| 额敏县| 林甸县| 航空| 五寨县| 故城县| 台北市| 西宁市| 德江县| 盈江县| 德庆县| 剑河县| 东乌珠穆沁旗| 信宜市| 苏州市| 蒙山县| 和龙市| 东丰县| 桑日县| 天祝| 东海县| 光山县|