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

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

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

    華山論劍

    一心一意做技術!

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

    1、寫Action

      webwork跟Struts乃至其它的MVC框架一樣,都有一個處理Web請求的Action,我們來看看本例子中這個Action的內容。下面是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(""))//默認按用戶名排序
    ?{
    ?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","數據刪除成功!");???? ?
    ??? }
    ??? else
    ??? {
    ??? ?this.parameters.put("msg","數據修改失敗");?
    ??? }
    ?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","數據操作成功!");???? ?
    ??? }
    ??? else
    ??? {
    ??? ?this.parameters.put("msg","數據操作失敗");?
    ??? }
    ?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();
    }
    //根據頁面參數創建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的標簽,(還好沒有全部搞成標簽,呵呵!),大家注意觀察以<ww: 開頭的標簽寫法就OK了,可以對照Struts的標簽看一下。這兩個頁面從我們這個示例的完整源代碼中可以得到,完整示例源碼下載地址:
    ?
    ?
    3、配置xwork.xml
    ?

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

      <!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文件的全部內容:

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

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

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

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

    Feedback

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

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

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

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

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

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

    # 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;  回復  更多評論
      

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

    這是開源EasyJWeb Tools中的業務引擎,EasyJWeb項目中有源代碼!

    關于該示例中分頁的使用,請看這篇:http://m.tkk7.com/easyjf/archive/2006/04/10/40169.html   回復  更多評論
      

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

    好凌亂~~~  回復  更多評論
      

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

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

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

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

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

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

    如,EasyJWeb Tools中的類似實現組合模糊查詢及分頁的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;
    }
    }  回復  更多評論
      

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


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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲一区二区在线免费观看| 亚洲精品动漫免费二区| 国产精品成人四虎免费视频| 亚洲精品国产肉丝袜久久| 日本免费在线观看| 国产成A人亚洲精V品无码性色 | 一本色道久久综合亚洲精品高清| 亚洲精品无码你懂的| 卡一卡二卡三在线入口免费| 亚洲国产精品无码久久九九大片| 女人被男人桶得好爽免费视频| 亚洲日韩精品A∨片无码加勒比| 免费鲁丝片一级在线观看| 亚洲av永久无码天堂网| 国产aa免费视频| 一区二区三区视频免费| 亚洲中文久久精品无码| 国产精品视频白浆免费视频| 亚洲首页在线观看| 特级做A爰片毛片免费69| 精品无码专区亚洲| 精品国产日韩亚洲一区| 久久aa毛片免费播放嗯啊| 亚洲欧洲日产专区| 国产成人精品免费视频大全五级 | 亚洲欧美日韩综合俺去了| 日韩激情淫片免费看| 特级毛片aaaa免费观看| 亚洲成人精品久久| 日韩版码免费福利视频| 国产AV日韩A∨亚洲AV电影| 亚洲午夜久久久久妓女影院 | 中文字幕免费人成乱码中国| 91在线亚洲精品专区| 天天摸天天操免费播放小视频| 边摸边吃奶边做爽免费视频网站| 亚洲国产另类久久久精品| 免费观看成人毛片a片2008| 一级视频在线免费观看| 亚洲国产精品白丝在线观看| 亚洲&#228;v永久无码精品天堂久久 |