Struts 從1.1使用到1.3已有多年,都升成2了,卻來了個大變臉,須重新審視 一番了。從頭學習,記下筆記,以要點式。
1. Struts2 與 Struts1 似乎沒什麼血緣關係了,承自於 WebWork,直害 WebWork 不再推出新版本了,原先的 WebWork 使用者只需順其然,即是水道渠成 ;相反 Struts1 的開發經驗對於 Struts2 卻沒有太大的協助。
2. Struts1 的核心控制器是 ActionServlet,而 Struts2 的核心控制器是 FilterDispatcher。Struts2 的業務 Action 會在運行時產生 Action 代理。
3. Struts1 的 Action 須繼承抽象 Action 類,侵入了 Servlet API;而 Struts2 的 Action 可以實現 ActionSupport,或者只要一個純淨的 POJO 來充 當,完全與 Servlet 絕緣。也因此帶來測試性 Struts2 要比 Struts1 強,可把 Struts TestCase 扔到一旁去了。
4. Struts1 在運行時一個 Action 只會產生一個執行個體,而 Struts2 中的 Action 會應對每個請求產生新的執行個體,線上程安全性方面,Struts1 要多些考慮 。
5. Struts1 依靠 ActionForm 來接受資料,它也是依賴於 Servlet API ,並 非普通的 JavaBean,而 Struts2 可在 Action 屬性中擷取請求的屬性,當然也 能封裝在一個獨立的 POJO 中。不過提醒一下,在 Struts1.3 中也可以用 POJO 來接受請求屬性,但使用起來有點煩瑣。
6. Struts2 使用了新的 OGNL 的運算式語言,可以訪問值棧,在對集合和索 引屬性的支援上功能更強大。
7. Struts1 的設定檔只需 struts-config.xml;Struts2 的設定檔有 struts.xml 和 struts.properties。struts.properties 中有兩個 struts.devMode = fase 和 struts.configuration.xml.reload = true 很可愛 ,分別設定當前是開發還是生產模式,以及 struts.xml 改變後是否自動重新加 載,免去了改配置手工重啟應用的必須步驟。
8. Struts2Action 的 execute() 無參,返回的是一個字串,不像 Struts1 Action 的 execute() 有一大串且不說,光是返回 ActionForward,就讓這個 Action 與 Struts1 脫不了干係;還是 Struts2 來得聰明,只返回個中性的 String,反正名字嗎,猛然間這個 Action 也成 POJO 了,複用性增強了,難怪 專門有一書,名為《POJO In Action》。
9. Struts1 的視圖只支援 JSP,這也不怪它,只怨出身太早,那時就只有 JSP 一種表現層。相比,Struts2 更有豔福,能貼近於 FreeMarker、Velocity、 XSLT、PDF 等視圖技術。
10. Struts2 提供了功能強大複雜的標籤庫,統一化為 "s" 首碼。並順應時 代潮流地加入了 AJAX 的支援。還提供了更友好的驗證功能。