【Struts】:Struts1和Struts2的區別與聯絡
之前的兩篇博文分別介紹了Struts1和Struts2這兩個框架的概念和簡單的使用流程,但是沒有對這個兩個框架之間的不同進行詳細的說明,接下來就來看看兩者到底有哪些不同的地方吧。
區別一:Struts1的Action類必須要繼承Action,而Struts2的則可以不繼承
在使用Struts1進行開發的時候,必須要繼承Struts1的抽象基類Action,並且要重寫抽象類的execute()方法,這就導致了其Action必須要依賴ServletAPI,因為每當訪問Action的時候,必須要呼叫execute方法,這就需要兩個引數request和response,這樣就造成了Struts1模式下的Action很難測試,必須要Servlet容器的支援才可以。
而Struts2可以不繼承任何類或者介面,這就保證了Action類的獨立性,當然可以實現一個Action介面(在Struts2中Action是一個介面),也可以實現其他的介面,使得可選和定製服務成為了可能,Struts2提供了一個ActionSupport基類去實現常用的介面,但是Action介面不是必須的,任何有execute方法(沒有引數)的POJO物件都可以作為Struts2的Action物件去使用。這樣一來,Action就可以通過初始化、屬性設定、呼叫方法等進行測試,可測性大大的提高,同時消除了對Servlet API的依賴,使得Action無需依賴容器而可以單獨進行測試。
區別二:Struts1是執行緒不安全的,而Struts2是執行緒安全的
Struts1的Action是單例模式,在執行的時候,只有一個Action例項來處理所有的請求,單例模式的策略限制了Action的功能,因此我們在開發的過程中必須要保證Action資源是執行緒安全的或者同步的,否則會出現執行緒安全問題。
而Struts2的Action是多例的,會為每一個請求建立一個例項,因此不存線上程安全問題。
區別三:Struts1使用ActionForm接收表單資料,而Struts2直接讓Action來收集表單資料
Struts1收集資料通常使用ActionForm,而ActionForm還需要繼承。使ActionFrom的複用率降低,如果專案非常大的話就會產生大量的ActionForm,這給維護工作帶了非常大的工作量,但是其好處是將資料的收集和控制進行了很好的分離。
Struts2在收集表單資料方面可採用的方式就比較多了,可以直接讓Action來收集表單資料,但也可以採用類似於ActionForm的方式來收集資料,Struts2採用了ModelDriven的方式來支援類似Struts1的ActionForm方式,當然了Struts2也支援使用ActionForm的方式,因此Struts2更加的靈活
區別四:Struts1和Struts2常用的表示式語言不同
Struts1中我們通常使用JSTL表示式語言,這種標籤庫是整合在Struts1框架裡面的,因此多數人使用JSTL EL表示式去操作頁面的資料,這種EL支援基本物件的圖遍歷,但是對集合和索引屬性的支援就比較弱了。
而Struts2既可以使用JSTL,但是增加了更加強大和靈活的表示式語言——“Object Graph Notation Language”(OGNL),它通過簡單一致的表示式語法,可以存取物件的任意屬性,呼叫物件的方法,遍歷整個物件的結構圖,實現欄位型別轉化等功能。因此Struts2將OGNL作為了預設的表示式語言。
區別五:兩者的型別轉換不同
Struts1中對ActionForm的型別轉換採用commons-beanutils工具,而定義一個轉換器,將會對所有的ActionForm起作用,因此無法針對某一個ActionForm來配置是否使用該型別的轉換器。
Struts2則使用OGNL進行型別轉換,功能更加強大,可以實現針對不同的型別進行不同的配置,並且提供了基本和常用物件的轉換器,無需我們自己寫。
區別六:校驗方式不同
Struts1採用覆蓋ActionFrom中的validate()方法或者採用驗證框架commonsvalidator進行驗證
而Struts2支援使用覆蓋validate()方法來完成驗證,同時也支援使用XWork驗證框架進行驗證
區別七:後臺向頁面傳值技術不同
Struts1使用標準的JSP機制把物件繫結到頁面中去,而Struts2則引入了“ValueStack”技術,這樣就可以使用tiglib去訪問值,不用去把物件和頁面繫結起來。
區別八:Action的執行控制不同
Struts1支援一個模組一個單獨的RequestProcessors(生命週期),但是模組中的所有Action必須共享相同的生命週期。
Struts2則引入了攔截器機制,有了攔截器棧的概念(Interceptor Stacks),通過攔截器棧可以為每一個Action配置不同的生命週期,這樣一來能夠根據需求提供不同的方案,更加靈活方便了。
小結一下:
Struts2仍然是一個基於請求驅動的MVC框架,但是並不是Struts1的升級版,從上面可以看出Struts2與Struts1的體系結構差異非常大。相反,Struts2採用了另一個優秀的MVC框架WebWork的核心設計,因此Struts2是WebWork的一個升級版,雖然相容Struts1,但是大家要清楚它並不是Struts1的升級版。
相關文章
- struts1與struts2的區別
- springmvc與struts2的區別SpringMVC
- Session和Cookie的聯絡與區別SessionCookie
- CGI與Servlet的區別和聯絡Servlet
- Session和Cookie的區別與聯絡SessionCookie
- springMVC和Struts2的區別SpringMVC
- Linux和Ubuntu的區別與聯絡LinuxUbuntu
- javaSE中的==和equals的聯絡與區別Java
- 程式和執行緒的區別與聯絡執行緒
- HDFS 塊和 Input Splits 的區別與聯絡
- NUMA,MPP和HADOOP的區別與聯絡Hadoop
- 並行和併發的區別與聯絡並行
- volatile和synchronized的區別與聯絡[轉]synchronized
- malloc free與new delete的區別和聯絡delete
- cookie與session的區別與聯絡CookieSession
- Session與Cookie的區別與聯絡SessionCookie
- 同步與阻塞的區別與聯絡
- hive與hbase的聯絡與區別Hive
- onchange與onpropertychange的聯絡與區別!
- BS與CS的聯絡與區別
- define與typedef區別與聯絡
- 【Privilege】SYSOPER和SYSDBA特權的區別與聯絡
- JRE與JDK的區別與聯絡JDK
- Struts1、Struts2、Hibernate、Spring框架工作原理介紹Spring框架
- tcp/ip和http的區別和聯絡TCPHTTP
- orcle pfile和spfile的區別和聯絡
- NET|Ref 和out 的區別和聯絡
- Instruction和Question的區別和聯絡Struct
- http、socket、tcp的區別和聯絡?HTTPTCP
- SCADA和PLC的區別聯絡
- Apache與Tomcat 區別聯絡ApacheTomcat
- Vue中watch、computed與methods的聯絡和區別Vue
- MediaPlayer和AudioTrack播放Audio的區別與聯絡
- Python中time和datetime的區別與聯絡Python
- 【Struts2】:Struts2的型別轉換型別
- Kafka與ActiveMQ的區別與聯絡詳解KafkaMQ
- 詳解Kafka與ActiveMQ的區別與聯絡!KafkaMQ
- B/S與C/S的聯絡與區別