posts - 60,comments - 71,trackbacks - 0
          form: http://www.aygfsteel.com/woweiwokuang/archive/2007/08/16/137171.html

          最近學(xué)習(xí)了easyjweb,發(fā)現(xiàn)easyjweb和struts較量了,雖然說(shuō)都傳統(tǒng)的基于請(qǐng)求的MVC思想,但是它竭盡所能是java代碼和頁(yè)面分開(kāi)了,結(jié)果的確做到了這一點(diǎn),在easyjweb項(xiàng)目的頁(yè)面上面你是找不到有java代碼的,你看看頁(yè)面的后綴都成了html了,不是jsp了。除此之外,easyjweb中還有獨(dú)特的一面,不僅實(shí)現(xiàn)了像struts一樣的MVC(MVC是easyjweb的核心),還有下面的具體實(shí)現(xiàn):

          1、容器及通用業(yè)務(wù)邏輯封裝。作為一個(gè)旨在讓基于Java的Web應(yīng)用程序開(kāi)發(fā)變得直接、快速、簡(jiǎn)易的框架,EasyJWeb提供了一個(gè)IoC容器,并對(duì)企業(yè)級(jí)應(yīng)用中的一些通用業(yè)務(wù)邏輯(如分頁(yè)、查詢(xún)、DAO等)進(jìn)行了抽象及封裝,提供了一套可以直接操作、應(yīng)用企業(yè)資源的組件及API。

          2、代碼生成引擎及工具。僅僅依靠一個(gè)靈活、簡(jiǎn)易的MVC核心引擎還不能最大限度的提高開(kāi)發(fā)速度,因此EasyJWeb還提供了一個(gè)靈活、易用的代碼生成引擎及工具,通過(guò)使用代碼生成引擎,可以快速完成基于JavaEE平臺(tái)的企業(yè)級(jí)應(yīng)用程序生成。如數(shù)據(jù)庫(kù)添刪改查(CRUD)代碼生成、自動(dòng)頁(yè)面模版生成、自動(dòng)配置文件管理等。

          3、EasyJWeb插件體系,項(xiàng)目中的各種實(shí)用功能的擴(kuò)展,可以靈活地通過(guò)基于插件的形式安裝到EasyJWeb中,提供各種針對(duì)性的功能。如ajax實(shí)用插件、代碼生成插件等

             別的我也是不太了解,就MVC這方面說(shuō)吧!不過(guò)我對(duì)easyjweb和struts都不是特別精通,就我對(duì)他們的了解說(shuō)說(shuō)我的看法吧!
          第一:先來(lái)看看他們的配置文件吧!他們都有web.xml,下面的配置easyjweb和struts必須有的。
          easyjweb中的web.xml文件的配置

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app>
          <filter>
          <filter-name>CharsetFilter</filter-name>
          <filter-class>com.easyjf.web.CharsetFilter</filter-class>
          <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value> 
          </init-param>
          <init-param>
          <param-name>ignore</param-name>
          <param-value>true</param-value>
          </init-param>
          </filter>
          <filter-mapping>
          <filter-name>CharsetFilter</filter-name>
          <servlet-name>easyjf</servlet-name>
          </filter-mapping> 
            <servlet>
              <servlet-name>easyjf</servlet-name>
              <servlet-class>com.easyjf.web.ActionServlet</servlet-class>   
            </servlet>
            <servlet-mapping>
              <servlet-name>easyjf</servlet-name>
              <url-pattern>*.ejf</url-pattern>  
            </servlet-mapping> 
          </web-app>


          struts中的web.xml中的配置:

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns=" <easyjf-web>


          <module path="/hello" form="" scope="request"
            action="com.easyjweb.action.MessageAction" defaultPage="hehe">
            <page name="hehe" url="/message.html" type="template" />

          </module>
          </easyjf-web>


          sturts-config.xml中的配置:


          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "

          <struts-config>
            <data-sources />
            <form-beans >
             <form-bean name="productForm" type="com.cclen.forms.ProductForm"/>
            </form-beans>
           <action path="/marketWeb"
               type="com.cclen.actions.MarketWebAction"
               name="marketWebForm"
               scope="request">
               <forward name="listmarkweb"           path="/administrator/proxy/proxy_Add.jsp"></forward>
               </action>
            </action-mappings>
          </struts-config>


          在以easyjweb中的配置文件中,我們需要有hello.ejf來(lái)請(qǐng)求com.easyjweb.action.MessageAction的處理。     
          不過(guò)module這里還有比struts更牛比的東西配置呢,就是Module中也包含了Page對(duì)象,控制器,攔截器,注入的bean.
          這里可以參考easyjweb的文檔來(lái)具體的了解。。


          在struts里面中的配置文件中,我們需要有marketWeb.do來(lái)請(qǐng)求com.cclen.actions.MarketWebAction的處理。
          哦,他們的后綴名都可以隨便的改變,在需要在web.xml中配置,你改一下試試就可以明白了。

          第三:終于到了Action了,這個(gè)里面的東西我們來(lái)看看了,就我知道的說(shuō)啊!在網(wǎng)上千萬(wàn)可別罵我。
          1、easyjweb中三種的Action分別是IWebAction  AbstractCmdAction  AbstractPageCmdAction

           struts中有兩種的Acton分別是Action,DispatchAction

          他們要作為父類(lèi),你要實(shí)現(xiàn)他們中間的方法啊!

          2、easyjweb中的IWebAction相當(dāng)于struts中的Action了啊!他們分別要實(shí)現(xiàn)的方法是:

          IWebAction中要實(shí)現(xiàn)的方法是:

          public Page execute(WebForm form, Module module) throws Exception;

          struts中的Action要實(shí)現(xiàn)的方法是:

          public ActionForward execute(ActionMapping mapping,ActionForm form,
             HttpServletRequest request,
             HttpServletResponse response) throws Exception ;

          從這里就可以看到easyjweb的簡(jiǎn)易,他只有兩個(gè)參數(shù),而struts中的Action方法要有四個(gè)參數(shù),這給測(cè)試就帶來(lái)了麻煩啊!

          3、easyjweb中的AbstractCmdAction相當(dāng)于struts中的DispatchAction了啊!即在一個(gè)Action中提供多個(gè)處理方法,比如說(shuō):
          AbstractCmdAction中有這樣的處理方法:
          public Page doAdd(WebForm form, Module module) throws Exception;
          public Page doDel(WebForm form, Module module) throws Exception;
          public Page doUpdate(WebForm form, Module module) throws Exception;

          在請(qǐng)求中使用easyJWebCommand或者cmd傳遞的參數(shù)直,會(huì)作為請(qǐng)求執(zhí)行的方法名的構(gòu)成。構(gòu)成的規(guī)則為doXxxx()。
          如:

          xxx.ejf?easyJWebCommand=add,就會(huì)執(zhí)行doAdd()方法了。
          這個(gè)easyjwebCommand和cmd是不用配置的,不用問(wèn)他們擔(dān)心了。


          那么struts中的DispatchAction中就應(yīng)該有這樣的方法了
          public ActionForward add(ActionMapping mapping,ActionForm form,
             HttpServletRequest request,
             HttpServletResponse response) throws Exception;

          public ActionForward del(ActionMapping mapping,ActionForm form,
             HttpServletRequest request,
             HttpServletResponse response) throws Exception;

          public ActionForward update(ActionMapping mapping,ActionForm form,
             HttpServletRequest request,
             HttpServletResponse response) throws Exception;
          在請(qǐng)求中要通過(guò)struts-config.xml中的Action配置的parameter參數(shù)來(lái)傳遞,
          如:
          <action path="/marketWeb"
               type="com.cclen.actions.MarketWebAction"
               name="marketWebForm"
               parameter="hahahaha"
               scope="request"/>
          marketWeb.do?hahahaha=del,就會(huì)執(zhí)行方法
          public ActionForward del(ActionMapping mapping,ActionForm form,
             HttpServletRequest request,
             HttpServletResponse response) throws Exception;

           


          不過(guò)easyjweb中的AbstractCmdAction有一個(gè)默認(rèn)的方法是:
          public Page doInit(WebForm form, Module module)
          這個(gè)方法是當(dāng)你沒(méi)有傳入具體參數(shù)時(shí),要調(diào)用的方法了。
          就是說(shuō)用 執(zhí)行xxx.ejf時(shí),就是執(zhí)行上面的方法了


          4、easyjweb中的AbstractPageCmdAction是非常智能的啊!struts中真的沒(méi)有了啊!easyjweb中特有的方法了。
          在AbstractCmdAction的基礎(chǔ)上,EasyJWeb提供了另外一個(gè)對(duì)視圖具有自動(dòng)識(shí)別能力的AbstractPageCmdAction。該類(lèi)能通過(guò)應(yīng)用“慣例代替配置”來(lái)智能判斷程序中要使用的視圖模板,甚至不需要書(shū)寫(xiě)方法簽名也可以調(diào)用視圖模板。如:
          public void doEdit(){}
          該方法中雖然沒(méi)有一句代碼,也沒(méi)有明確的視圖切換或轉(zhuǎn)向。但AbstractPageCmdAction會(huì)根據(jù)慣例原則,自動(dòng)選擇edit.html文件作為視圖模板。
          這些牛牛人啊!還弄這么智能的東西出來(lái)啊。佩服佩服!

           

          第四:來(lái)看看easyjweb和struts對(duì)表單數(shù)據(jù)的獲取和返回吧! 分別用easyjweb中的IWebAction和struts中的Action來(lái)說(shuō)明問(wèn)題吧!
           1、用實(shí)現(xiàn)IwebAction就要實(shí)現(xiàn)方法
          public Page execute(WebForm form, Module module) throws Exception;
          看到了吧!其中只要兩個(gè)參數(shù),webForm就可以解決獲取表單數(shù)據(jù)和返回頁(yè)面數(shù)據(jù)(返回頁(yè)面數(shù)據(jù)就是指在action中處理過(guò)的數(shù)據(jù)將添加到頁(yè)面上)
           
          在WebForm中可以直接使用WebForm.get("poropertyName")來(lái)得到文本參數(shù),而對(duì)于二進(jìn)制的內(nèi)容,直接使用WebForm.getFileElement("poropertyName")來(lái)處理.
          一般不會(huì)用到form的,<form>元素用來(lái)定義前臺(tái)頁(yè)面表單的信息,一個(gè)WebForm就可以做到了。
          WebForm還提供了兩個(gè)方法:WebForm.toPo(Object obj):傳入一個(gè)對(duì)象,直接從WebForm中拷貝值到改對(duì)象中。

          WebForm.toPo(Class clazz):傳入一個(gè)類(lèi)型,WebForm會(huì)初始化這個(gè)類(lèi)型的實(shí)例再將WebForm中的值拷貝
          具體這兩個(gè)方法的有更多的用法,請(qǐng)參考easyjweb的文檔:
          www.easyjf.com

           

          而表示層返回?cái)?shù)據(jù)的話(huà),就要用new WebForm().addResult()把數(shù)據(jù)添加到Velocity上下文中。WebForm也提供了一個(gè)簡(jiǎn)便的WebForm.addPo(obj)來(lái)處理多屬性的對(duì)象的值的添加

          還要注意這點(diǎn)啊 !WebForm在將數(shù)據(jù)保存到Velocity上下文時(shí),不光要保存使用addResult方法和addPo方法放入的值,還要向Velocity上下文中保存textElement中的數(shù)據(jù),意味著重復(fù)的數(shù)據(jù)可以不用在Action中重復(fù)的添加,這在應(yīng)用中需要特別注意。

           

          2、用實(shí)現(xiàn)Action就要實(shí)現(xiàn)方法
          public ActionForward execute(ActionMapping mapping,ActionForm form,
             HttpServletRequest request,
             HttpServletResponse response) throws Exception ;
          MessageForm messageForm = (MessageForm) form;

          你可以配置ActionForm來(lái)取得數(shù)據(jù),也可以通過(guò)request.getParameter(arg0)來(lái)去的數(shù)據(jù),但是這里存在了情況了,但我不知道struts里面沒(méi)有沒(méi)更好的解決方法。比如說(shuō),對(duì)于二進(jìn)制的內(nèi)容,如果用到了org.apache.struts.upload.FormFile的話(huà),你就必須用到ActionForm來(lái)取的數(shù)據(jù)了。

          返回到表示層的數(shù)據(jù)就request.setAttribute("",object);


          第五:頁(yè)面數(shù)據(jù)的輸出:

          1、easyjweb中用的是Velocity作為頁(yè)面引擎的,Velocity的語(yǔ)法簡(jiǎn)單,易學(xué),并且是美工最喜歡的html頁(yè)面,在這里你是找不到j(luò)ava的代碼的。
          2、struts有自己的標(biāo)簽,或者用sun公司支持的jstl標(biāo)簽,你不得不在頁(yè)面上引用對(duì)象的類(lèi)型,因?yàn)槟銈魉偷巾?yè)面上的對(duì)象他們是無(wú)法識(shí)別的。
          你可以看看你的jsp頁(yè)面的頂部有沒(méi)有這樣的代碼 import="java.sql.*,java.lang.*"這就是java代碼啊!


          第六:頁(yè)面的轉(zhuǎn)向。
          1、easyjweb中的處理控制器就交給了Module,其實(shí)一個(gè)Module是包含著IWebAction,而在IWebAction中,卻是在調(diào)用Module的資源。
          如果要返回一個(gè)Page模版頁(yè)面,只需要調(diào)用module.findPage("pageName")就能得到了。因?yàn)樵贛odule中給我們配置了資源:
          如:
          <module path="/hello" form="" scope="request"
             action="com.easyjweb.action.MessageAction" defaultPage="hehe">
             <page name="hehe" url="/message.html" type="template" />
            </module>

          它<page name="hehe" url="/message.html" type="template" />就是給我們配置的模板資源,只要在com.easyjweb.action.MessageAction 中通過(guò)module.findPage("hehe")就可以調(diào)用message.html的模板了。也可以直接返回new Page(,,),如:return new Page("succ","/user/success.html","html")


          2、在struts中是把頁(yè)面控制交給了ActionMapping,ActionMapping通過(guò)調(diào)用findForward(),即ActionMapping.findForward("name")轉(zhuǎn)向。

          如:
           <action path="/product"
                      type="com.cclen.actions.ProductAction"
                      name="productForm"
                      parameter="method"
                      >
                      <forward name="listproduct" path="/administrator/product/listproduct.jsp"></forward>
                     </action>
            你需要在com.cclen.actions.ProductAction中這樣來(lái)指定頁(yè)面ActionMapping.findForward("listproduct");


          第六:我再重申一下在easyjweb中struts沒(méi)有的東西。

          easyjweb之所以能實(shí)現(xiàn)快速開(kāi)發(fā),是因?yàn)槔锩娼o我們提供了更好的實(shí)現(xiàn),提供了工具類(lèi),強(qiáng)大的超級(jí)容器等等,由于俺是初學(xué)者,等俺精通了以后將慢慢補(bǔ)充easyjweb精彩方面!

           

           

           

          posted on 2008-07-14 17:29 henry1451 閱讀(248) 評(píng)論(2)  編輯  收藏

          FeedBack:
          # re: EasyJWeb vs Struts(轉(zhuǎn))[未登錄](méi)
          2008-07-14 20:26 | javaread.com
          看了覺(jué)得應(yīng)該跟appfuse比或者springside  回復(fù)  更多評(píng)論
            
          # re: EasyJWeb vs Struts(轉(zhuǎn))
          2008-07-18 21:36 | henry1451
          @javaread.com
          呵呵,謝謝你的評(píng)論,確實(shí),可能EasyJWeb用的比較少,但這是次要的,主要是比較兩個(gè)優(yōu)秀的框架時(shí)能看出它們的長(zhǎng)處與不足之處,這樣有利于我們明白一個(gè)優(yōu)秀框架的精華所在,以便吸取它們的良好設(shè)計(jì)思想.  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 靖西县| 汨罗市| 阿瓦提县| 万荣县| 周口市| 黔东| 综艺| 日照市| 巴南区| 沾化县| 玉山县| 枝江市| 常山县| 蒙城县| 天祝| 海南省| 葫芦岛市| 平南县| 台安县| 阳新县| 绩溪县| 雅江县| 湘西| 桦甸市| 明水县| 衡南县| 洛浦县| 鄂伦春自治旗| 阿合奇县| 临西县| 鄄城县| 松溪县| 鲁山县| 常熟市| 新乡市| 镶黄旗| 永济市| 德昌县| 连州市| 宜兴市| 西吉县|