隨筆 - 115  文章 - 481  trackbacks - 0
          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(19)

          隨筆檔案(115)

          文章檔案(4)

          新聞檔案(1)

          成員連接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

            上周EasyJWeb-1.0m3版本發布,收到幾封來信,其中有兩封提到EasyJWeb相對于struts2這個web MVC框架有哪些優勢。這兩天在編《EasyJWeb實用開發指南》,因此,整理了一下其中的一些內容,對其中的一些關鍵作了一個簡單的比較,希望對于想了解EasyJWeb及Struts2這兩個框架的朋友有所幫助。

          一、總體概述
          1、都是基于java的開源web mvc框架,而且都是基于請求轉發模型的mvc框架,這一點與jsf這種基于組件模型的框架不同。
          2、EasyJWeb是在綜合struts1.x、webwork、Tapestry、springmvc、rails等框架發展而來,是EasyJF開源團隊的一個項目,開發成員全部是中國人;而struts2是在webwork2的基礎上發展而來,當然也參考了很多mvc框架,是apache的一個開源項目,開發成員來自世界各地。
          3、EasyJWeb表示層主要推Velocity、CommonTemplate這樣的模板引擎,而Struts2視圖層主要推jsp2。當然,兩者都可以表示層切換到其它一些視圖技術,只需要增加相應的結果處理引擎即可。
          4、EasyJWeb的文檔、代碼注釋、提示信息等主要以中文為主;而struts2是以英文為主。
          5、都是一個能讓你快速開發企業級java web應用的框架。

          宏觀的東西不多說,大的用法大家可以從兩個框架與JPA+Spring結合實現的添刪改查實例進行簡單的對比分析。你可以直接通過下面的鏈接了解更多的內容:

          開始EasyJWeb 源碼下載

          實現一個簡單的添刪改查 源碼下載

          Easyjweb+Spring2+JPA 實現一個基本CRUD應用示例 英文版

          Struts 2 + Spring 2 + JPA + AJAX

          Struts2官方文檔

          Migrating Struts Apps to Struts 2


          二、配置
          1、零配置
            EasyJWeb與struts2都支持零配置,這里的零配置就是指只需要修改web.xml,而不需要寫任何EasyJWeb或Struts2的配置文件,零配置的情況下需要為框架指明到哪兒去掃描Controller(Action)類。分別如下:
          EasyJWeb的web.xml

          <context-param>
            
          <param-name>defaultActionPackages</param-name>
            
          <param-value>myapp.demo,easyjweb.demo</param-value>
           
          </context-param>
          <servlet>
            
          <servlet-name>easyjf</servlet-name>
            
          <servlet-class>com.easyjf.web.ActionServlet</servlet-class>
            
          <load-on-startup>1</load-on-startup>
           
          </servlet>
           
          <servlet-mapping>
            
          <servlet-name>easyjf</servlet-name>
            
          <url-pattern>/*</url-pattern>
           
          </servlet-mapping>

           

          Struts2的web.xml

          <init-param>
              
          <param-name>actionPackages</param-name>
              
          <param-value>com.foo.bar,com.baz.quux</param-value>
            
          </init-param>
          <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>/*</url-pattern>
              
          </filter-mapping>

           

          2、慣例代替配置
            EasyJWeb中大量使用了慣例代替配置的機制,把應用程序按模塊進行劃分,慣例代替配置包含頁面視圖模板的查找,多國語言屬性文件的查找、依賴注入等,已經在很多項目中成功應用。struts2也使用了一些慣例代替配置,但不知道能否用于實際開發。 
          3、框架配置文件
            兩個框架都可以有自己的配置文件,通過配置文件來提高系統的可維護性。EasyJWeb的配置文件中可以定義系統中的模塊Module(相當于控制器或Action)、頁面模板視圖Page等MVC框架特有的屬性,另外還可以配置業務組件<bean>、攔截器、異常處理器、及依賴注入,配置將要支持遠程Web調用服務的Ajax業務組件等;EasyJWeb的配置文件功能更廣,初學有一點大雜燴的感覺。
          Struts2的配置文件同樣可以用來配置Action、頁面導向、攔截器,也可以配置業務組件Bean等,這一點跟EasyJWeb非常類似。采用分包及攔截器鏈的方式組織應用程序中的各個部件。
          EasyJWeb配置文件中配置Bean

          <bean name="CommonTemplatePage" class="com.easyjf.web.core.support.CommonTemplatePageVender">
           
          <property name="suffix" value="ct"/>
           
          </bean>

           Struts2配置文件中配置Bean

          <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.company.myapp.MyObjectFactory" />

           
          三、控制器Action
            兩個框架的控制器在默認情況下都是線程安全的,而且都不依賴于具體的類。EasyJWeb默認的處理器實現要求Actionn必須實現IWebAction接口,而Struts2可以不需要。如下:
          EasyJWeb中的Action

          public class HelloAction implements IWebAction{
           
          public Page execute(WebForm form, Module module) throws Exception {
            form.addResult(
          "msg""您好,這是EasyJWeb的第一個程序!");
            form.addResult(
          "date"new Date());
            
          return new Page("/hello/index.html");
           }

          }

          Struts2中的Action

          public class HelloAction {
           
          public Page execute() throws Exception 
            
          return "success";
           }

          }

          當然,這個祼體Action基本上沒任何作為,真正的Struts2版本的HelloAction可以寫成如下:

          public class HelloAction implements ServletRequestAware {
          private HttpServletRequest request;
             
          public void setServletRequest(HttpServletRequest request) {
                  
          this.request = request;
             }

           
          public Page execute() throws Exception 
            request.setAttribute(
          "msg""您好,這是EasyJWeb的第一個程序!");
            request.setAttribute (
          "date"new Date());
            
          return Action.SUCCESS;
           }

          }

          另外,還需要在struts2的配置文件中增加大致如下的配置來指明這個success字符對應的文件路徑:

          <action name="HelloWorld" class="tutorial.HelloAction">
                      
          <result>/HelloWorld.jsp</result>
          </action>

            但實際應用中,EasyJWeb的Action大多數都直接繼承AbstractPageCmdAction,因為這個基礎控制器提供了很多非常強大的功能,比如按慣例查找頁面、靈活頁面跳轉及視圖切換,動態特性的命令方法。同樣為了使用Struts2中的很多功能,比如攔截器、依賴注入等都需要Action實現指定的接口,更多的時候直接繼承ActionSuport類。
            也就是說,一個半祼或全祼的Action在實際應用中很少用到。


          四、依賴注入
            兩個框架都實現了依賴注入,都能自動往Action中自動注入所需要的業務組件。EasyJWeb的依賴注入直接依靠他內置的IoC容器,而Struts2的依賴注入依靠攔截器ActionAutowiringInterceptor進行注入。EasyJWeb的依賴注入是真正實現不要任何配置就能自動注入應用程序中各層(業務層、持久層等)中用到的業務組件的,你可以通過這個簡單的添刪改查實例來看見效果。
            兩者都可以直接借助第三方的IoC容器如Spring。下面是在EasyJWeb中使用Spring容器,需要在EasyJWeb的配置文件中加入下面的配置:

          <!-- 申明Spring為easyjweb 應用容器開始 -->
            
          <bean name="springContainer"
             class
          ="org.springframework.web.context.support.XmlWebApplicationContext">
             
          <property name="configLocations">
              
          <list>
               
          <value>WEB-INF/classes/application.xml</value>
              
          </list>
             
          </property>
            
          </bean>
            
          <bean name="innerSpringContainer"
             class
          ="com.easyjf.container.impl.SpringContainer">
             
          <property name="factory" ref="springContainer" />
            
          </bean>
            
          <!-- 申明Spring為easyjweb 應用容器結束 -->
           
          </beans>

           

          Struts2可以使用代理的方式,先在web.xml文件中通過下面的配置啟動spring容器:
          <listener>
                  <listener-class>
                      org.springframework.web.context.ContextLoaderListener
                  </listener-class>
              </listener>
          然后在struts的配置文件使用指定struts.objectFactory為spring即可。
          <constant name="struts.objectFactory" value="spring" />

          另外一點區別是,EasyJWeb的Action都是由EasyJWeb的IoC容器管理,不需要用其它容器來管理,因為EasyJWeb的IoC容器會把其它容器中的業務組件注入到Action的相應屬性中,你可以把業務組件同時放在EJB容器、Spring容器、或者Guice容器中。
          關于如何在EasyJWeb中使用Guice容器,請參考>>

          五、數據的處理
            兩個框架都拋棄了Struts1.x中那種需要借助ActionFrom來處理數據的機制,而采用更為先進的注入方式。EasyJWeb中的WebForm中提供了一個toPo方法,用來處理數據注入。
            比如,為了在Action中注入Person對象:
            EasyJWeb的Action代碼中直接使用toPo方法手動注入,如:

          public class PersonAction extends AbstractPageCmdAction {
              
          private PersonService service;
           
          public void setService(PersonService service)
          {
          this.service=service;
          }

              
          public void save(WebForm form) {
            Person person
          =form.toPo(Person.class);
                  
          this.service.save(person);
            page(
          "list");
              }

          }

          對應的表單是普通的html表示,如下所示:

          <form action="save" validate="true">
                 
          <input type="text" id="id" name="id" cssStyle="display:none"/>
              
          <input type="text" id="firstName" label="First Name" name="firstName"/>
              
          <input type="text" id="lastName" label="Last Name" name="lastName"/>
              
          </form>

          Struts2中則不需要寫代碼,只需要把要注入的數據在Action中準備好即可,如:

          public class PersonAction {
              
          private PersonService service;
              
          private Person person;

              
          public PersonAction(PersonService service) {
                  
          this.service = service;
              }


              
          public String execute() {
                  
          //this.persons = service.findAll();
                  return Action.SUCCESS;
              }

              
          public String save() {
                  
          this.service.save(person);
                  
          this.person = new Person();
                  
          return execute();
              }

              
          public Person getPerson() {
                  
          return person;
              }

              
          public void setPerson(Person person) {
                  
          this.person = person;
              }

          }


           

          對應的表單如下所示:

          <s:form action="save" validate="true">
                 
          <s:textfield id="id" name="person.id" cssStyle="display:none"/>
              
          <s:textfield id="firstName" label="First Name" name="person.firstName"/>
              
          <s:textfield id="lastName" label="Last Name" name="person.lastName"/>
              
          </s:form>

          當然,Struts2關于數據轉換方面提供了很多可供選擇,比如也可以實現ModelDriven接口提供getModel來按指定的規則注入模型數據。

            對于關聯對像的加載及注入,比如Person中的Department屬性,EasyJWeb只需要在屬性上加上一個@POLoad標簽即可,而struts2則不能。

          六、其它
          1、驗證處理
            EasyJWeb提供了一個基于注解標簽實現的靈活框架,可以直接在要驗證的數據對象(一般是模型對象)中直接添加驗證標簽來實現驗證,另外在Action中加入自定義的驗證內容也非常容易,只需要使用addError方法即可。當前EasyJWeb-1.0m3只支持通過注解的方式驗證。
            Struts2的驗證框架結合了Strut1.x及webwork,可以直接使用驗證標簽來標注驗證,也可以使用xml文件來配置驗證規則及驗證目標對象。
            EasyJWeb的驗證標簽:

          @Validator(name=”string”,value=”blank;trim;required;min:5;max:10;minMsg:最少不能少于5個字符;maxMsg:最大不能超過10字符”)
          更多參考:http://www.easyjf.org/html/20070822/12867758-1954570.htm

          Struts2的驗證配置,

          <field name="stringLengthValidatorField">
            
          <field-validator type="stringlength">
             
          <param name="maxLength">4</param>
             
          <param name="minLength">2</param>
             
          <param name="trim">true</param>
             
          <message><![CDATA[ must be a String of a specific greater than 1 less than 5 if specified ]]></message>
            
          </field-validator>
           
          </field>


          更多參考:http://struts.apache.org/2.x/docs/validation.html


          2、ajax支持  Struts2提供對dojo的全面支持及封裝,提供了一套富組件的支持,并且可以在自定義標簽中指定form以ajax方式提交表單等,功能較為完善。
            EasyJWeb則提供了一個類似DWR框架的Ajax實現,可以用于直接把業務層對象發布到客戶端通過json調用,對于Ajax提交及頁面部分刷新等則直接在頁面中調用EasyAjaxUtil這個實用工具中的ajaxSubmit、loadPage等方法實現。相對來說EasyJWeb的Ajax支持還有待進一步完善。
          3、開發效率
            EasyJWeb的目標在于提高開發效率,整個項目除了核心MVC部分以外,在easyjweb-ext-xx.jar包中還提供了一些通用業務邏輯,如Crud應用、添刪改查、基于JPA+Spring2的泛型DAO支持、分頁處理引擎等,可以在程序中直接使用;另外在easyjweb-generator-xx.jar包中提供了基于模板的代碼生成引擎,可以快速生成基于EJS(EasyJWeb+JPA+Spring2)的Crud應用。
          Struts2有著眾多的第三方支持,官方網站上提供了一些應用骨架可以直接使用,另外還可以使用AppFuse等這個第三方框架生成基于Struts2的應用。
          4、文檔
            Struts2的文檔非常全,也比較系統,關于struts2的書也可以在市場上買到,但EasyJWeb在這方面由于參與貢獻的人少,因此文檔及教程相對來說就如很多網友說的:“還存在很多問題”,這里也邀請廣大的國內開源愛好者一起來參與完善EasyJWeb的文檔完善。

            另外,EasyJWeb及Struts2都還具有其它自己很多獨特的優點??偟膩碚f,對于框架的選擇應該是多方面考慮的,沒有絕對的誰好或者誰壞,更應該是順手適用才行,如果你愿意,繼續使用Struts1.x兩三年也沒問題。由于本人對Struts2應用得不夠多,所以文中一些不足或偏頗之處,還請各位朋友不吝賜教。

          by EasyJF開源 大峽

          posted on 2007-12-26 09:54 簡易java框架 閱讀(2651) 評論(8)  編輯  收藏

          FeedBack:
          # re: EasyJWeb vs Struts2 2007-12-26 10:06 shaomin
          及時趕到
          呵呵
          應該是客觀評價
          正在學習
            回復  更多評論
            
          # re: EasyJWeb vs Struts2 2007-12-26 10:10 小雨開源
          不錯不錯,我有空保證貢獻幾篇,支持你們。不過希望多給我發一些你們的資料,發到我郵箱吧,謝謝!rain____2008#163.com  回復  更多評論
            
          # re: EasyJWeb vs Struts2 2007-12-26 20:25 金大為
          不夠客觀,再Webwork實例中,無意寫錯就算了,如果有意些錯,那就有點萎縮了。  回復  更多評論
            
          # re: EasyJWeb vs Struts2 2007-12-26 22:39 lingos
          @小雨開源

          這位朋友似乎不愿意自己研究,更愿意擺弄廣告?  回復  更多評論
            
          # re: EasyJWeb vs Struts2 2007-12-27 11:51 完全不看好EasyJWeb
          對EasyJWeb很不看好
          感覺已經跟不上時代節奏了
          如果早3年能拿出現在這樣的東西可能還有點前途
          不過現在看了 完全沒什么優勢可言  回復  更多評論
            
          # re: EasyJWeb vs Struts2[未登錄] 2007-12-27 15:56 dennis
          我比較關心的是單元測試,EasyJWeb的action能否脫離容器進行測試?  回復  更多評論
            
          # re: EasyJWeb vs Struts2 2007-12-28 22:55 企業精英社區
          值得觀望。。。  回復  更多評論
            
          # re: EasyJWeb vs Struts2 2007-12-29 16:29 mingj
          跟jdw同感
          不可避免的有點傾向

          個人認為easyjweb確實提供了很多便捷的方法
          不過,在ror,grails這些敏捷框架的沖擊下
          easyjweb有多少值得稱道的地方還很難說
            回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 广南县| 灌云县| 深水埗区| 青阳县| 大埔县| 聊城市| 卓资县| 伊吾县| 凤翔县| 六安市| 贺兰县| 五峰| 河曲县| 信丰县| 班戈县| 郓城县| 九江市| 惠水县| 双辽市| 当雄县| 西青区| 荥阳市| 白河县| 宁河县| 沁水县| 新巴尔虎右旗| 庄浪县| 满城县| 大名县| 馆陶县| 张家川| 繁昌县| 桐庐县| 莱芜市| 建德市| 卓尼县| 镇平县| 塔河县| 黄龙县| 凤山县| 依安县|