華山論劍

          一心一意做技術(shù)!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            31 Posts :: 0 Stories :: 447 Comments :: 0 Trackbacks
            (本故事除了部分點明道姓并具有故事詳細(xì)發(fā)生的具體時間點地等部分情節(jié)以外,其它內(nèi)容純屬虛構(gòu),若有雷同,純屬巧合。)
          ?
            看本文的朋友請先看上一篇文章:玩玩Spring之struts+hibernate+spring添刪改查示例,否則會看不懂滴(的)。
            該示例程序的運行效果先睹為快:
            http://www.easyjf.com/html/bbs/20060510/1512699849613700.htm?ejid=1141219960424115
          ?
            新同學(xué):聽說Struts有很多致命的技術(shù)缺陷啊,是嗎?
            大牛:恩,專家都說了。
            新同學(xué):聽說J2EE程序員很講究藝術(shù)及高雅,能舉個例子嗎?
            大牛:對啊,MVC中webwork就是高雅啊,用他寫起程序來真是賞心悅目,華麗得真是沒法容易。
          ?
            主演:webwork
            配角:struts、jsp、hibernate、spring等
            
            借著吹spring的風(fēng),今天筆者給大家介紹一種很多人都非常欣賞的輕量極、高雅的J2EE組合,那就是hibernate+ webwork+ spring。說介紹不準(zhǔn)確,應(yīng)該還只是一個簡單的演示,畢竟webwork的贊歌已經(jīng)有很多人唱過了,這里就不重復(fù)(主要還是因為唱不出來,慚愧!)。我只希望能通過簡單的代碼,讓大家去體會webwork的高雅、過人之處。
          ?
            同樣是上一篇中有關(guān)一個用戶表“添刪改查”的例子,這里只是把Web層改成使用webwork實現(xiàn),下面我們直接介紹Web開發(fā)部分,其它部分的開發(fā)請照搬前面一篇的例子,新人可以結(jié)合上個例子中的Struts部分進(jìn)行看。

          1、寫Action

            webwork跟Struts乃至其它的MVC框架一樣,都有一個處理Web請求的Action,我們來看看本例子中這個Action的內(nèi)容。下面是UserManageAction.java的全部代碼:
          ?

          package com.easyjf.webwork.action;
          import java.util.ArrayList;
          import java.util.Collection;
          import java.util.List;
          import java.util.Map;
          import com.easyjf.example.business.IUser;
          import com.easyjf.example.business.IUserService;
          import com.easyjf.util.CommUtil;
          import com.easyjf.web.tools.IPageList;
          import com.easyjf.web.tools.ListQuery;
          import com.easyjf.web.tools.PageList;
          import com.opensymphony.webwork.interceptor.ParameterAware;
          import com.opensymphony.xwork.ActionSupport;
          import com.opensymphony.xwork.Preparable;
          public class UserManageAction extends ActionSupport implements ParameterAware,Preparable {
          private List allUser;
          private IUserService userService;?
          private IUser user;
          private Map parameters;
          //用戶查詢
          public String query() throws Exception {?
          ?String[] temp=(String[])parameters.get("page");
          ?int currentPage=CommUtil.null2Int(temp!=null?temp[0]:"0");
          ?temp=(String[])parameters.get("pageSize");
          ?int pageSize=CommUtil.null2Int(temp!=null?temp[0]:"0");
          ?if(currentPage<1)currentPage=1;
          ?if(pageSize<1)pageSize=10;
          ?String scope="1=1";
          ?Collection paras=new ArrayList();
          ?temp=(String[])parameters.get("orderType");
          ?String orderType=CommUtil.null2String(temp!=null?temp[0]:"");?
          ?temp=(String[])parameters.get("orderField");
          ?String orderField=CommUtil.null2String(temp!=null?temp[0]:"");
          ?temp=(String[])parameters.get("queryUserName");
          ?String userName=CommUtil.null2String(temp!=null?temp[0]:"");
          ?temp=(String[])parameters.get("queryTel");
          ?String tel=CommUtil.null2String(temp!=null?temp[0]:"");????
          ?if(!userName.equals(""))
          ?{
          ??scope+=" and userName like ?";
          ??paras.add("%"+userName+"%");
          ?}
          ?if(!tel.equals(""))
          ?{
          ??scope+=" and tel like ?";
          ??paras.add("%"+tel+"%");
          ?}??
          ?if(orderField.equals(""))//默認(rèn)按用戶名排序
          ?{
          ?orderField="userName";
          ?orderType="desc";????
          ?}?
          ?if(!orderField.equals(""))
          ?{
          ?scope +=" order by "+orderField;
          ?if(!orderType.equals(""))scope+=" "+orderType;
          ?}
          ?IPageList pList=new PageList(new ListQuery(userService.query(scope,paras)));
          ?pList.doList(pageSize,currentPage,"","");
          ?if(pList!=null){
          ??this.parameters.put("list",pList.getResult());
          ??this.parameters.put("pages",new Integer(pList.getPages()));
          ??this.parameters.put("rows",new Integer(pList.getRowCount()));
          ??this.parameters.put("page",new Integer(pList.getCurrentPage()));??
          ??this.parameters.put("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
          ??}
          ?this.parameters.put("orderType",orderType);
          ?this.parameters.put("orderField",orderField);
          ??? this.allUser = userService.query(scope,paras);
          ??? return execute();
          }
          //添加或修改用戶
          public String? edit() throws Exception
          {?
          ?return execute();
          }
          //刪除用戶
          public String? del() throws Exception
          {?
          ??? if(user!=null && userService.del(this.user))
          ??? {
          ??? ?this.parameters.put("msg","數(shù)據(jù)刪除成功!");???? ?
          ??? }
          ??? else
          ??? {
          ??? ?this.parameters.put("msg","數(shù)據(jù)修改失敗");?
          ??? }
          ?return query();
          }
          //保存用戶信息
          public String? save() throws Exception
          {
          ?IUser? obj=this.getUser();
          ?boolean ret=false;
          ?if(obj!=null){
          ?if((obj.getCid()!=null)&&(!obj.getCid().equals("")))ret=userService.update(user);
          ?else ret=userService.save(user);
          ?}
          ??? if(ret)
          ??? {
          ??? ?this.parameters.put("msg","數(shù)據(jù)操作成功!");???? ?
          ??? }
          ??? else
          ??? {
          ??? ?this.parameters.put("msg","數(shù)據(jù)操作失敗");?
          ??? }
          ?return query();
          }
          public IUserService getUserService() {
          ?return userService;
          }
          public List getAllUser() {
          ?return allUser;
          }
          public IUser getUser() {
          ?return user;
          }
          public void setUser(IUser user) {
          ?this.user = user;
          }
          public void setUserService(IUserService userService)
          {
          ?this.userService=userService;
          }
          public void setParameters(Map parameters) {
          ?this.parameters=parameters;
          }
          public Map getParameters() {
          ?return parameters;
          }
          public void prepare() throws Exception {
          ?this.form2Obj();
          }
          //根據(jù)頁面參數(shù)創(chuàng)建IUser對象
          private void form2Obj() {
          ?String[] temp=(String[])parameters.get("cid");
          ?String cid=temp!=null?temp[0]:"";
          ?IUser user=null;
          ?if(cid!=null && (!cid.equals("")))user=userService.read(cid);
          ?if(user==null)user=userService.newUser();
          ?setUser(user);
          }?
          }
          ?
          ?
          2、寫頁面文件
            xwork支持多種頁面模板,可以是JSP,也可以是Freemarker等,這里我們使用的是大家比較熟悉的JSP作模板。頁面同樣分為userEdit.jsp以及userList.jsp兩個,模板中使用了一些wework的標(biāo)簽,(還好沒有全部搞成標(biāo)簽,呵呵!),大家注意觀察以<ww: 開頭的標(biāo)簽寫法就OK了,可以對照Struts的標(biāo)簽看一下。這兩個頁面從我們這個示例的完整源代碼中可以得到,完整示例源碼下載地址:
          ?
          ?
          3、配置xwork.xml
          ?

            可以理解成struts中的struts-config.xml文件,當(dāng)然等你真正熟悉他以后,發(fā)現(xiàn)他的配置文件中的玩藝及技術(shù)含量都要比Struts牛的多。下面是xwork.xml文件的全部內(nèi)容:

            <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "<xwork>??
          ?<include file="webwork-default.xml"/>??
          ???? <package name="userManage"? extends="webwork-default" namespace="/userManage">???????
          ??????? <action name="query" class="com.easyjf.webwork.action.UserManageAction" method="query">
          ??????????? <result>/userList.jsp</result>
          ??????????? <interceptor-ref name="params" />
          ??????????? <interceptor-ref name="basicStack"/>
          ??????? </action>
          ??????? <action name="edit" class="com.easyjf.webwork.action.UserManageAction" method="edit">
          ??????????? <result>/userEdit.jsp</result>?
          ??? <interceptor-ref name="params" />??????
          ??????????? <interceptor-ref name="basicStack"/>
          ??????? </action>
          ??????? <action name="save" class="com.easyjf.webwork.action.UserManageAction" method="save">
          ??????????? <result name="input">/userEdit.jsp</result>
          ???????????? <result>/userList.jsp</result>
          ??????? </action>
          ??????? <action name="del" class="com.easyjf.webwork.action.UserManageAction" method="del">???????????
          ???????????? <result>/userList.jsp</result>
          ??????? </action>
          ??? </package>
          </xwork>
          ?
          ?
          4、修改web.xml文件
            以Struts類似,同樣需要修改web.xml文件,才能讓webwork處理指定的請求。下面是本例中的web.xml文件的全部內(nèi)容:

          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "
          <web-app>
          ??? <filter>
          ??????? <filter-name>webwork</filter-name>
          ??????? <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
          ??? </filter>
          ??? <filter-mapping>
          ??????? <filter-name>webwork</filter-name>
          ??????? <url-pattern>/*</url-pattern>
          ??? </filter-mapping>
          ??? <listener>
          ??????? <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          ??? </listener>
          </web-app>

            通過上面的配置,使得所有的請求都會交給webwork處理。
          ?
            好,現(xiàn)在一個完整的webwork示例程序就完了。不知webwork新朋友注意到?jīng)],webwork中沒有了ActionForm Bean,配置文件也相對比較清晰明了,Action中的方法不再有類似public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)這樣一大串讓人看起來就不爽的參數(shù),其干凈得一個參數(shù)也沒有。大家可以閉上眼睛摸著腦門再體會一下Webwork的Action的寫法,是不是要簡潔、華麗、優(yōu)雅得多。
          ?
            當(dāng)然,那么多技術(shù)牛人在支持webwork,并不是單看中這個Action的簡潔,webwork本身還有很多東西,還包括AJAX支持,報表集成,強(qiáng)大的驗證系統(tǒng)以及IOC等,其中有很多是Spring也有的東西,僅從技術(shù)的角度來看,筆者也認(rèn)為他確實能稱上是數(shù)一數(shù)二的。
          ?
            當(dāng)然,本人不是webwork的粉絲,因此其它MVC框架的粉絲這里不要PK我,Struts的朋友就更不應(yīng)該了,因為webwork開發(fā)團(tuán)隊與struts團(tuán)隊已經(jīng)合并了,合并后的作品Apache Struts Action 2.0也即將出來了。Tapestry 、JSF的粉絲看到這里也別納悶,有競爭才有技術(shù)進(jìn)步嘛。
            
            好,今天就先玩到這里。由于筆者對webwork只是粗淺的看了一下,因此也許還不能完全通過這個示例表述出webwork的原意。還請webwork的超級粉絲或?qū)<襾韼兔ρa(bǔ)充一下,若發(fā)現(xiàn)不足的地方,請不吝批評指教。

            本示例的全部源碼下載地址:
           

            本示例的運行效果圖:
            
            (備注:由于筆者不想拐彎抹角浪費大家玩的時間,有些“表白”難免過于直接,還請不喜歡Spring或者過分喜歡Spring的同行多多見諒! 本文中的“我們”,僅指與筆者有著同樣成長經(jīng)歷的80后人,對于文章提到的觀點,多數(shù)皆屬于筆者個人觀點,不代表任何人。
            本文作者:EasyJF開源團(tuán)隊?? 大峽 版權(quán)歸EasyJF開源團(tuán)隊所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留作者版權(quán)聲明,謝謝!)
          ?

          關(guān)于玩玩Spring系列,玩的過程及結(jié)果將會不定期在以下三個網(wǎng)站全球同步公布:
          1.EasyJF開源團(tuán)隊官方網(wǎng)站,網(wǎng)址:http://www.easyjf.com
          2.筆者的Blog,網(wǎng)址:http://www.aygfsteel.com/daxia/
          3.Java研究組織(JR) ,網(wǎng)址:http://www.javaresearch.org
          歡迎更多跟我一樣愛玩的哥哥姐姐弟弟妹妹一起來玩。
          ?
          posted on 2006-05-10 18:13 大峽 閱讀(2280) 評論(12)  編輯  收藏

          Feedback

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-10 18:20 大峽
          框架只是工具,用熟悉了就OK。不知道大家都用什么什么框架呢?  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-10 19:06 Jonney
          框架往往把簡單的事情往復(fù)雜里整,真是受不了.
          還是最原始的MVC最好,一個JSP頁面處理邏輯,一個JSP頁面負(fù)責(zé)表示,若干個JavaBean做Model。
          就算所有的開發(fā)人員都跳槽了,新來的開發(fā)人員也能夠維護(hù)。
          SpringMVC就很簡單,僅僅負(fù)責(zé)了MVC的關(guān)系,我很喜歡。  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-10 20:25 原創(chuàng)專欄 開源學(xué)習(xí)
          @Jonney
          很不同意.SpringMVC簡單嗎?比struts,webwork上手快嗎?

          webwork核心是xwork的攔截器.
          樓主代碼有壞味道  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-10 20:36 大峽
          @原創(chuàng)專欄 開源學(xué)習(xí)
          樓主代碼有壞味道

            主要是前面的組合、模糊查詢及分頁部分,由于偶webwork用得不多,沒有找到比較簡單的方法,熟悉Webwork的朋友不妨改一下query中部分不爽的代碼,丟上來大家一起學(xué)習(xí)學(xué)習(xí)!
            當(dāng)然其它MVC框架的粉絲不妨也來給webwork找點骨頭。嘿嘿,偶喜歡看熱鬧滴說!  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 11:00 spacecoeboy
          為什么源代碼里找不到這幾個類
          import com.easyjf.util.CommUtil;
          import com.easyjf.web.tools.IPageList;
          import com.easyjf.web.tools.ListQuery;
          import com.easyjf.web.tools.PageList;  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 15:03 大峽
          @spacecoeboy

          這是開源EasyJWeb Tools中的業(yè)務(wù)引擎,EasyJWeb項目中有源代碼!

          關(guān)于該示例中分頁的使用,請看這篇:http://www.aygfsteel.com/easyjf/archive/2006/04/10/40169.html   回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 15:47 mingo
          樓主的代碼優(yōu)雅嗎?

          好凌亂~~~  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 16:34 大峽
          呵呵,水平有限,只能達(dá)到這樣了。實現(xiàn)同樣的功能,歡迎朋友們來點真正優(yōu)雅的,丟上來大家一起學(xué)習(xí)學(xué)習(xí)!
            回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 20:03 mingo
          (!userName.equals(""))

          這種常量跟變量比較相等的寫法 還是改改的好 好的習(xí)慣是常量一般放前面  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 20:12 mingo
          這么多翻頁信息最起碼可以抽取一個翻頁類。

          而且增刪改和查詢最好是分來的兩個action比較好 一個action塞的執(zhí)行方法太多會讓人看暈的。  回復(fù)  更多評論
            

          # re: 玩玩Spring之hibernate+ webwork+ spring添刪改查示例 2006-05-11 20:37 大峽
          @mingo
          謝謝 mingo兄的建議,EasyJWeb實際是對這些邏輯進(jìn)行了封裝的。也有相應(yīng)業(yè)務(wù)功能的Action基類等AbstractCrudAction,有時間請在幫忙看看EasyJWeb Tools中的寫法,也請更多高手來一起研究,謝謝。

          如,EasyJWeb Tools中的類似實現(xiàn)組合模糊查詢及分頁的query方法代碼:

          public class MessageAction extends AbstractCrudAction {

          public IPageList doQuery(WebForm form, int currentPage, int pageSize) {
          String belongUser=CommUtil.null2String(form.get("belongUser"));
          String scope="1=1";
          Collection paras=new ArrayList();
          if(!"".equals(belongUser))
          {
          scope+=" and belongUser=?";
          paras.add(belongUser);
          }
          String orderType=CommUtil.null2String(form.get("orderType"));
          String orderField=CommUtil.null2String(form.get("orderField"));
          if("".equals(orderField))
          {
          orderField="inputTime";
          orderType="desc";
          }
          scope +=" order by "+orderField;
          if(!orderType.equals(""))scope+=" "+orderType;
          DbPageList pList=new DbPageList(Message.class,scope,paras);
          pList.doList(currentPage,pageSize);
          return pList;
          }
          }  回復(fù)  更多評論
            

          # louis vuitton handbags 2011-06-10 16:41 louis vuitton handbags
          amazing  回復(fù)  更多評論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 延津县| 临澧县| 屏东县| 乃东县| 新干县| 潼关县| 漾濞| 汶川县| 肥城市| 长乐市| 龙游县| 嵊州市| 德兴市| 方山县| 射洪县| 青冈县| 临城县| 黄平县| 徐汇区| 剑川县| 邢台市| 中江县| 镇原县| 吴江市| 漯河市| 浦县| 长武县| 民勤县| 铁岭县| 大冶市| 英德市| 泸定县| 洞口县| 犍为县| 章丘市| 金溪县| 磐安县| 揭阳市| 磐石市| 东丽区| 水富县|