PortletWork: Struts 2 Portlet Tutorial
(繼續閱讀...)
August 25, 2008
March 12, 2008
準備重新整理 blog!!
開始玩Google bloger之後,常為了文字排版的問題傷透腦筋(如:程式碼排版等),也參考了不少前輩的blog,奇怪的是,別人的blog都是漂亮美觀又大方,我的就是俗夠有力 @@"
追根究底的原因是我沒有好好規劃我blog的版面設計及加入一些視覺便利的小套件,這是每一位玩 bloger的人必經的過程(Blogger Hacks),最近開始到處爬文學習如何美化自己的blog,也利用新開的demo blog try過不少東西,可能近期就會陸續加到烏邦圖的天空,希望到時而夠讓人有更舒服的視覺體驗!!
(繼續閱讀...)
March 8, 2008
Google Sites 初體驗(二)
由於驗證繁瑣且需等待,我另外拿一個已經驗證完成的Case當Sample,分享一下驗證完成之後的使用方式
一、進入管理介面,可透過「管理帳戶資訊」客製化屬於你風格的Web Site,連Google的Logo都可以換掉唷!!(進入外觀設定即可)
二、點選任一服務都可以進入設定頁面如下,即可開始管理及設定該項服務
其中可以透過自訂URL使自己的Web Service Address 更容易記住
http://partnerpage.google.com/meribio.com(Google預設提供)
http://partnerpage.meribio.com(自訂)
你看,是不是差多了呢!! ^^
三、進入使用者管理介面,Google Site 提供你可在此網域建立100個帳戶,倘使你的Mail 設定通過驗證,還可以直接將你的Mail Server交給 Google管理,透過Gmail管理信件的收發,也可以透過POP3的設定將信件從Gmail上收下來到Outlook等收發信軟體
(標準版每個帳戶有6GB的空間,專業版是每個帳戶25GB的空間)
四、透過網頁設定快速建立屬於你的網頁(Page Creator)
五、其它Google所提供的AP服務
(繼續閱讀...)
March 7, 2008
Google Sites 初體驗(一)
Yahoo!! 新聞,提到了 Google 又推出了新的服務「Google Sites」
Google架網站平台 上手超簡單
看完之後,除了讚嘆Google愈來愈強大之餘,也對新服務產生了好奇心,趁閒暇之餘研究看看^^"
在使用這項服務之前,首先你必須要有Google的Gmail帳號,沒有的朋友請點選以下連結去申請一個吧!!
點我連結申請一個Gmail帳號
接下來就可以開始使用Google所提供的附加服務囉!! \(^o^)/
一、點選Google首頁下方連「Google完全手冊」,點選左邊導覽列最上方的「Google應用服務網站版」,或是直接「點我」連結過去,進入Google Sites服務首頁
三、進入之後,它會要求你輸入網域名稱(Domain Name)
倘使你已經有專屬於自己的網域,就可以直接使用左邊的欄位輸入直接申請,不然,你也可以透過Google申請一個,畫面如下
不想花錢!!又想體驗一下的人該怎麼辦呢?? 沒關係,網路上有提供申請免費Domain Name註冊的服務,可以去申請一個唷,不過之後的驗證方式就比較麻煩一點了,往後再討論吧!!^^這邊我是去DynDNS申請了一個免費的DN for demo
四、填寫個人與組織相關資料,請注意,這邊的資訊除了組織規模與類型等,其他都是可以之後再更改的
五、建立管理員帳戶,這邊的動作是為你的Google Sites 建立一個管理員,請注意!! 此帳戶之後是無法透過管理帳號的方式刪除(感覺就和Linux系統中的 root一樣),所以名字別亂取阿 @@"
六、完成!!進入管理頁面,就待驗證網域擁有權之後即可開始使用,至於驗證方式,點選上方的「驗證網域擁有權」選項,Google有提供驗證方式選項,在此就不贅述了
申請過程大概就是如此了
避免文章過長,使用方式我將另開一篇文介紹
以下是Google官方介紹影片
相關參考資料
Key Word:Google Sites
(繼續閱讀...)
Struts1與Struts2的比較
Struts1 v.s Struts2
作為最受歡迎的Web framework,Struts擁有眾多的優點,如實踐MVC2 model、功能齊全的Tag Library及Open Source等。但隨著Web AP的發展及應用越來越多元,Struts1也有不少的缺點讓使用者詬病,如Unit test困難及容易造成class過多等問題,進而衍生出了Struts2。
做為Struts1缺點的解決方案,Struts2與Struts1主要區別如下:
一、Action Class
Action是整個Struts1 framework的核心內容, Struts2也不例外。不過兩者的Action model有著很大的區別。其中的關鍵在於Struts2是一個pull-MVC架構。這代表了需要顯示給使用者的資料可以直接從Action中取得,而不用和Struts1一般,需把相對應的Bean物件存到Page、Request或者Session等Scope中才能獲取。
進一步說明,在Struts1中,Action必須繼承org.apache.struts.action.Action或其子類別,並將Form表單參數封裝在FormBean中。然而在Struts2中,Action無須繼承任何class或實現任何interface,Form表單參數可直接包含在Action中,透過get和set的方法取得。
(可參考下面的Struts2Action.java sample)
ps:雖然,在理論上Struts2的Action無須實現任何接口或者是繼承任何的類,不過在實際coding的過程中,為了更加方便的實現Action,大多數情況下還是會繼承com.opensymphony.xwork2.ActionSupport類,並且覆寫(Override)此類裡的String execute()方法。
Struts2Action.java
package com.demo.action;
import com.opensymphony.xwork2.ActionSupport;
public class Struts2Action extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String execute() throws Exception {
System.out.println(message);
return SUCCESS;
}
}
從Struts
另外,按照慣例,在Struts1中只有「execute」方法能呼叫Action, 但在Struts2中並非必要,任何聲明為public String methodName() 方法,都能通過配置struts.xml來呼叫Action。
最後,和Struts1最大革命性的不同是,Struts2處理Action過程中呼叫的方法execute()是不帶參數的,而是利用IoC(反轉控制)的方式獲取所需參數。
二、反轉控制 IoC(Inversion of Control)
亦稱為依賴注入(Dependency Injection)模式,Spring framework使得這個模式流行起來,然而Struts2的前身WebWork也同時應用上了這個模式。
想更瞭解IoC相關資訊的請參考這篇Martin Fowler的文章
Inversion of Control Containers and the Dependency Injection pattern
三、攔截器(Interceptor)
攔截是AOP(Aspect-Oriented Programming)的一種實現策略。而攔截器是動態攔截Action呼叫的對象。它提供了一種機制可以使開發者定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行。同時也提供了一種可以提取action中可重用的部分的方式。
Struts1的標準框架中不提供任何形式的攔截器,雖有一個名為SAIF的plug in實現了類似的功能,但它適用的範圍還很有限。
攔截器是Struts2的一個強有力的工具,有許多功能都是基建於它之上,如國際化、轉換器,驗證等。Struts 2已經提供各式功能齊全的攔截器實現。可到struts-default.xml查看關於默認的攔截器配置。
Struts2不僅在Action方面做出改變,還加強了對AOP與IoC的支持,而這些特性在Struts1中是很難想像的。至此不難瞭解, Struts2是WebWork的升級,而不是Struts1的升級。雖然Struts 2提供了與Struts1的兼容,但已經不是Struts1的升級。
結論
因此對於已有Struts1開發經驗的開發者而言,Struts1的開發經驗對於Struts2並沒有太大的幫助;相反,對於已經有WebWork開發經驗的開發者而言,WebWork的開發經驗對Struts2的開發將是一個很好的借鏡。
Struts1與Struts2整體比較整理如下表
特性 | Struts1 | Struts2 |
Action類 Action classes | 要求Action類要繼承一個抽象類別(abstract)。Struts1.x的問題在於使用一個abstract類別取代使用interfaces。 | Action可以實作一個Action interface,也可實現其他自定義的interfaces提供服務。Struts2提供一個基本的ActionSupport class去實現常用的interfaces。然而Action interface並不是必要的,任何有execute方法的POJO class都可以作為Struts2的Action。 |
線程模型 Threading Model | Struts1 Action是單例模式並且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。 | Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題) |
Servlet 依賴 Servlet Dependency | Struts1 Action 依賴於Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。 | Struts |
易測性 Testability | 測試Struts | Struts |
截取輸入 Harvesting Input | Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經 常創建多餘的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean,仍然會導致有冗餘的JavaBean。 | Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種ModelDriven 特性簡化了taglib對POJO輸入對象的引用。 |
表達式語言 Expression Language | Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。 | Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL). |
將值綁定到頁面 Binding values into views | Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。 | Struts 2 使用「ValueStack」技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。 |
類型轉換 Type Conversion | Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。 | Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。 |
驗證 Validation | Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。 | Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性 |
Action執行控制 Control Of Action Execution | Struts1支持每一個模塊有單獨的Request Processors(生命週期),但是模塊中的所有Action必須共享相同的生命週期。 | Struts2支持通過Interceptor Stacks為每一個Action創建不同的生命週期。Stacks能夠根據需要和不同的Action一起使用。 |
Comparing the Struts 1 and Struts 2 Web Application Frameworks
(繼續閱讀...) Labels: Struts2 系列 0 comments • at 11:32 AM
March 5, 2008
在Blog中加入Google Search Box
最近開始接觸Google Blog,很多功能仍尚未上手,有時逛到別人的blogger / blogspot,發現在其網誌中會出現「文章搜尋」的功能,但是我自己的Blog設定怎麼都找不到類似的功能選項,一時好奇就找了一下,看看能不能也放在我的Blog中。
其實「搜尋框」(Search box)是Blogger in Draft之前放出來的新功能,在一般的blogger操作頁面是找不到滴~
以下是我加入「搜尋框」(Search box)的步驟
一、首先,要先從Blogger測試區(http://draft.blogger.com/)登入控制主頁
登入後的畫面會是這樣:
二、進入版面配置,替blog加入新的網頁元素,你會看到多了搜尋框(新功能!) 這個網頁元素可以加入:
三、設定搜尋框:
四、新增網頁元素完成之後會在版面配置,看到新的「Google This Blog」元件,此時請記得點選「Save」將變更發佈到Blog上:
五、測試網頁搜尋結果如下:
而根據找到的相關說明,這個搜尋框能夠直接搜尋 Blog 內的文章及 Google 的資料庫,另一個功能是可以直接搜尋此Blog所連結出去網頁中的資料,且完全不用離開當前正在閱讀的頁面,相當的方便好用。
相關參考文章
羊男實驗の咖啡館
(繼續閱讀...)
February 6, 2008
認識Struts2
何謂 Struts2
引言自 Apache Struts2 官網中的一段開宗明義的內容:
Apache Struts 2 was originally known as WebWork 2. After working independently for several years, the WebWork and Struts communities joined forces to create Struts2. This new version of Struts is simpler to use and closer to how Struts was always meant to be.
其大意為:
Apache Struts 2即是眾所熟知的WebWork 2,在經歷了數年的各自發展之後,WebWork與Struts社群決定合併,產生了Struts2。而這一創新的版本將會比原本的Struts更為簡單使用及更貼近Struts原本的精神。
Struts2 的由來
Struts的最初構思是想透過結合JSP和Servlet,使Web應用程式的景觀頁面(View)與商務邏輯(Business Logic)得以清晰地分離開來。在Struts之前,最常見的做法是直接在JSP頁面上寫入商務邏輯(Business Logic),或是在Servlet中藉由 println() 語法產生景觀頁面(View)。
自2001年5月份初版發佈以來,Struts儼然成為了業界公認的Web應用程式標準。而隨著Web應用框架需求不斷變化及需與日漸增多眾框架的特性相融合,Struts仍不斷的改進和變更。
到最後,產生了下一代Struts的解決方案。其中兩個最受矚目的方案為 Shale 和 Struts Ti。
Shale是一個基於元件(component)的框架,並在最近成為Apache的主要計畫(Project)之一。而Struts Ti則著眼在Struts的成功經驗上,繼續堅持對前端控制器(Front Controller)和MVC(model-view-controller)模式進行改進。
WebWork計畫(Project)是一個成熟的框架,自2002年3月初版發佈以來,經歷過了好幾次重大的改進與發佈,其對Struts框架進行了革命性的改進,當中引進了不少新的思維、概念和功能,如pull MVC等,但和原Struts程式碼(Code)並不兼容。
在2005年12月,WebWork與Struts Ti 正式宣佈合併。於此同時,Struts Ti 更名為Struts Action Framework 2.0,並正式成為Struts真正的繼承者。
最後需注意的是,雖然兩者結合共同開發Struts2,這並非表示Struts或WebWork計畫(Project)將停止開發。由於人們對這兩個計畫仍然有很高的興趣,而且也有很多開發者仍然願意使用它們,因此這兩個計畫仍在持續開發中,繼續改進與更新。
Struts2 的架構
Struts2 仍是以前端控制器(front controller)為框架主體。這表示:
- Action仍然是通過URL所呼叫的,資料(Data)仍是藉由URL夾帶了請求參數和Form表單上的參數傳送到遠端伺服器。
- 所有Servlet類物件(如request、response和session等)仍可在Action中可用。
請求(Request)生命週期(Life cycle)在Struts2框架中的運作流程
- 使用者送出請求:使用者對遠端伺服器送出請求(request)以獲取所需資源。
- 過濾控制器(FilterDispatcher)的佈署:透過過濾器(Filter)攔截請求(request),並根據請求內容以送往合適的處理對象(ex: *.action,*.do等)。
- 攔截器(Interceptors)的佈署:可透過攔截器的調控自動佈署一些基本功能如流程(workflow)、驗證(validation)、檔案上傳(file upload)等,攔截器和攔截器組可以按照不同級別進行組合配置來處理請求。它們為請求提供各種預設處理和切面處理(AOP)的功能。這和Struts使用Jakarta Commons Chain元件的RequestProcessor很相似。
- 執行Action:產生一個新的Action實例(Instance),根據請求執行其所對應的處理邏輯。
- 產出結果:將其所要求的資源或是結果回送到Action中 。
- 回傳請求的資源:請求(request) 以和進入時相反的方向再次經過一系列攔截器處理後返回,亦可以在這個過程中進行額外的處理工作。
- 將回傳結果呈現給使用者:最後一步是將控制權交還給Servlet Container,將產出的結果呈現在使用者的瀏覽器(Browser)。
Struts2處理請求(Request)過程的詳細圖表
(繼續閱讀...) Labels: Struts2 系列 0 comments • at 12:45 PM
January 15, 2008
部落格的第一篇文章
一直以來,都想把自己的程式經驗或是生活點滴以文字的方式記錄下來,但不論是工作忙碌或是其他等,沒有實踐是一個不爭的事實。
希望能藉由新開的這個 Google 的部落格,做為我出發的第一步,期許自己可以透過分享生活點滴或是工作經驗,認識更多的朋友,也歡迎每位來參觀烏邦圖的天空的朋友們。 ^^
(繼續閱讀...)