<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     

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

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

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

    開始EasyJWeb 源碼下載

    實(shí)現(xiàn)一個簡單的添刪改查 源碼下載

    Easyjweb+Spring2+JPA 實(shí)現(xiàn)一個基本CRUD應(yīng)用示例 英文版

    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中大量使用了慣例代替配置的機(jī)制,把應(yīng)用程序按模塊進(jìn)行劃分,慣例代替配置包含頁面視圖模板的查找,多國語言屬性文件的查找、依賴注入等,已經(jīng)在很多項(xiàng)目中成功應(yīng)用。struts2也使用了一些慣例代替配置,但不知道能否用于實(shí)際開發(fā)。 
    3、框架配置文件
      兩個框架都可以有自己的配置文件,通過配置文件來提高系統(tǒng)的可維護(hù)性。EasyJWeb的配置文件中可以定義系統(tǒng)中的模塊Module(相當(dāng)于控制器或Action)、頁面模板視圖Page等MVC框架特有的屬性,另外還可以配置業(yè)務(wù)組件<bean>、攔截器、異常處理器、及依賴注入,配置將要支持遠(yuǎn)程Web調(diào)用服務(wù)的Ajax業(yè)務(wù)組件等;EasyJWeb的配置文件功能更廣,初學(xué)有一點(diǎn)大雜燴的感覺。
    Struts2的配置文件同樣可以用來配置Action、頁面導(dǎo)向、攔截器,也可以配置業(yè)務(wù)組件Bean等,這一點(diǎn)跟EasyJWeb非常類似。采用分包及攔截器鏈的方式組織應(yīng)用程序中的各個部件。
    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
      兩個框架的控制器在默認(rèn)情況下都是線程安全的,而且都不依賴于具體的類。EasyJWeb默認(rèn)的處理器實(shí)現(xiàn)要求Actionn必須實(shí)現(xiàn)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";
     }

    }

    當(dāng)然,這個祼體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字符對應(yīng)的文件路徑:

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

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


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

    <!-- 申明Spring為easyjweb 應(yīng)用容器開始 -->
      
    <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 應(yīng)用容器結(jié)束 -->
     
    </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" />

    另外一點(diǎn)區(qū)別是,EasyJWeb的Action都是由EasyJWeb的IoC容器管理,不需要用其它容器來管理,因?yàn)镋asyJWeb的IoC容器會把其它容器中的業(yè)務(wù)組件注入到Action的相應(yīng)屬性中,你可以把業(yè)務(wù)組件同時放在EJB容器、Spring容器、或者Guice容器中。
    關(guān)于如何在EasyJWeb中使用Guice容器,請參考>>

    五、數(shù)據(jù)的處理
      兩個框架都拋棄了Struts1.x中那種需要借助ActionFrom來處理數(shù)據(jù)的機(jī)制,而采用更為先進(jìn)的注入方式。EasyJWeb中的WebForm中提供了一個toPo方法,用來處理數(shù)據(jù)注入。
      比如,為了在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");
        }

    }

    對應(yīng)的表單是普通的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中則不需要寫代碼,只需要把要注入的數(shù)據(jù)在Action中準(zhǔn)備好即可,如:

    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;
        }

    }


     

    對應(yīng)的表單如下所示:

    <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>

    當(dāng)然,Struts2關(guān)于數(shù)據(jù)轉(zhuǎn)換方面提供了很多可供選擇,比如也可以實(shí)現(xiàn)ModelDriven接口提供getModel來按指定的規(guī)則注入模型數(shù)據(jù)。

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

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

    @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的驗(yàn)證配置,

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

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

    by EasyJF開源 大峽

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

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲成在人线av| 在线观看亚洲av每日更新| 亚洲av永久无码精品三区在线4| 亚洲经典在线观看| 亚洲人成电影网站色| 美女露100%胸无遮挡免费观看| 在线观看国产一区亚洲bd| 成人自慰女黄网站免费大全| 无码日韩精品一区二区免费暖暖 | 一级毛片免费在线观看网站| 99精品视频在线观看免费| 57pao国产成永久免费视频| 天天操夜夜操免费视频| 国产成人精品久久亚洲| 亚洲一区二区三区首页| 亚洲精品无码mⅴ在线观看| av成人免费电影| 69式互添免费视频| 无码专区一va亚洲v专区在线| 亚洲国产精品无码专区| 久久久久亚洲国产| 香蕉视频在线免费看| 91av免费观看| 亚洲Av无码乱码在线znlu| 久久国产亚洲电影天堂| 亚洲精品无码专区在线| 国产成人精品无码免费看| 天堂在线免费观看中文版| 亚洲欧洲日产国码无码网站| 亚洲a级在线观看| eeuss影院ss奇兵免费com| 国产男女爽爽爽爽爽免费视频| 全黄性性激高免费视频| 91情国产l精品国产亚洲区| 欧美亚洲国产SUV| 精品一区二区三区免费毛片爱| 国产片免费在线观看| 亚洲欧洲视频在线观看| 午夜免费国产体验区免费的| 国产免费的野战视频| 亚洲综合av永久无码精品一区二区 |