J2EE劍俠行

          直覺我的J2EE應用生涯,打造我心中的一把利劍。

          常用鏈接

          統計

          技術鏈接

          最新評論

          2006年7月19日 #

          找到一個好用的UML建模工具-argouml

           很不錯的一個UML建模工具-argouml
               argouml下載地址
               我一眼就看上他的原因是:生成的用例和包圖可能直接生成JAVA代碼,而且準備無誤,這正是我要找的。
               我想:以后使用一些框架的話,可能由PD生成一些實體,然后Hibernate生成pojo等,加入到argouml,然后根據一個框架的特性生成一些包 和類.就等于詳細設計了吧.應該來說是比詳細設計還實用的東西.總比哪些WORD文檔好吧.還有讓人看不懂的概要設計.
              我想從技術出發,這個是一條比較適用的路子.下班了.我明天將會匯報一下我使用的情況和一些范例.
              反過來又想像.這好象是一個組合的腳手架.好象ROR的零星操作步驟.應該學習.ROR畢竟是一個新生事物,JAVAEYE的推廣也需要一個時間.如果像我這樣的打工,混口飯吃的人還是專心的研究J2EE好一點.否則明天就沒有飯吃了.

              呵呵.我的文章可被JAVAEYE收回到水貼里了,可能自己的能力不如人吧,好好學習,天天向上,如果看客有什么好的工具和軟件生產思路,可以共同交流。

          posted @ 2007-06-20 13:29 @家軍 閱讀(1852) | 評論 (1)編輯 收藏

          ROR:習慣約定優于配置(學習ROR的第一天)

          今天學習了一下ROR,有一些學習經驗東西要與大家分享。
          給ROR加一個座右銘--------狹窄心腸的日本產物。
          首先,不要一個一個的下載Ruby,Rails,建議使用一鍵安裝,下載地址如下:
          InstantRails-1.3-win
          版本說明:ruby 1.8.4 (2005-12-24) [i386-mswin32]
          其次,下載一個目前為止比較好的一個ROR的實踐工具:RadRails
          下載地址:radrails-0.7.1-win32
          接下來,設置一下Radrails的環境
          1)、Windows/perferences/Ruby/Installed Inteperters/ ->add ruby所在路徑:比如D:\InstantRails\ruby\bin\ruby.exe
          2)、Windows/perferences/Rails/Configuration ->Rails path:比如D:\InstantRails\ruby\bin\rails
          ->Rake path:比如D:\InstantRails\ruby\bin\rake 絕不是bat/cmd
          ->mogrel path:比如D:\InstantRails\ruby\bin\mongrel_rails絕不是bat/cmd

          有了如上的配置后,就只需要和在JAVA當中ANT一樣使用。(成功用過APPFUSE的人就不用害怕了)

          看看日本人寫的第一步:
          1),在RadRails中創建一個Rails Project,怎么樣會出來一堆的東東。
          2),進入DOS命令吧,后面的工序都是這樣的,好象買了海爾的洗衣機,第一次是送貨、第二次是用戶回訪,第三次是.....
          進入到你的項目處,運行ruby script\generate controller MyTest,
          則得到的服務如下:
          exists app/controllers/
          exists app/helpers/
          create app/views/my_test
          exists test/functional/
          create app/controllers/my_test_controller.rb
          create test/functional/my_test_controller_test.rb
          create app/helpers/my_test_helper.rb
          修改一下my_test_controller.rb

          代碼
          ?????? class ?MyTestController? < ?ApplicationController
          ??????def?index
          ????????render_text?
          " Hello?world!! "
          ??????end?
          ??????end

          在瀏覽器里輸入:http://127.0.0.1:3000/my_test/
          會出現 Hello world!!字樣,
          不過有意思的是你可以輸入:http://127.0.0.1:3000/My_test/
          http://127.0.0.1:3000/My_Test/
          http://127.0.0.1:3000/my_Test/
          都可以得到這個值,可能沒有JAVA哪樣嚴格吧。
          3)、還有對數據庫的操作,要配置一個database.yml(好象Log4j的東東)
          4)、創建數據庫表的時候只能夠使用復數起名,比如User就不行,只能夠起Users
          下面只要執行幾個命令就可以使用增刪改查了。
          如下是我的操作,下班了,就不多寫了,例子能夠說明一切問題:
          代碼
          ?1?E:\RORProject\demo>ruby?script/generate?model?user
          ?2?
          ?3???????exists??app/models/
          ?4?
          ?5???????exists??test/unit/
          ?6?
          ?7???????exists??test/fixtures/
          ?8?
          ?9???????create??app/models/user.rb
          10?
          11???????create??test/unit/user_test.rb
          12?
          13???????create??test/fixtures/users.yml
          14?
          15???????exists??db/migrate
          16?
          17???????create??db/migrate/001_create_users.rb
          18?
          19?E:\RORProject\demo>ruby?script/generate?controller?user
          20?exists?app/controllers/
          21?exists?app/helpers/
          22?create?app/views/user
          23?exists?test/functional/
          24?create?app/controllers/user_controller.rb
          25?create?test/functional/user_controller_test.rb
          26?create?app/helpers/user_helper.rb
          27?

          修改user_controller.rb如下:
          代碼
          1????class?UserController?<?ApplicationController
          2????????scaffold:user
          3????end

          最后你的瀏覽器當中輸入:http://127.0.0.1:3000/user/list,就包括了對數據庫表的四個操作.當然你也可以自己定義四個操作的任意一種.
          最后總結:
          ROR可能是敏捷開發的一個好實踐,但是我覺得他完成復雜應用進不會有大做為,而至于這一點還需要再做探究。不過現階段最好的需求就是能夠給用戶快速的寫出一個不完整的DEMO,這一點為以后打單取得主動。

          posted @ 2006-09-29 11:47 @家軍 閱讀(1999) | 評論 (1)編輯 收藏

          三個JAVA文件完成你的MVC應用

               摘要: 只需要你三個JAVA類和兩個配置文件,就可以完成你的MVC應用,我們就做一個示例吧。本文以一個登錄為例。第一個JAVA文件Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/**======================================...  閱讀全文

          posted @ 2006-09-29 11:43 @家軍 閱讀(1904) | 評論 (3)編輯 收藏

          struts標簽,請你走開(系列一)

          在項目開發的很多時候,用戶需要更友好,更容易理解的操作界面,而為了能夠達到這種表現界面,struts標簽顯得力不從心,本人經過幾個項目的開發當中 逐漸的擯棄了struts標簽,而由JSTL來做為JSP頁面的表達者。
          struts標簽之死穴一 不支持嵌套
          看看這種常見的需求吧。一個用戶隸屬于一個職能部門,比如
          項目要求 職能部門有五個(亂寫的)
          1、企劃部
          2、網絡集成部
          3、行政部
          4、營銷部
          5、產品部
          項目要求 一共有二個員工
          1、張三 隸屬于行政部
          2、李四 隸屬于營銷部
          而你想把張三和李四都列表出來,顯示為如下:
          姓名 部門名稱
          張三 行政部
          李四 營銷部
          而且還需要用戶的列表鏈接到修改頁面當中(假如只修改部門)應該如何做呢。
          在使用struts標簽是很難做到的,除非你非常不在意內存的使用(亂寫技術性代碼)
          看看JSTL是如何做的吧。
          從STRUTS的ACTION當中加載兩個對象

          List?GetAllDept? = ?UserDAO.GetAllDept(); // 取得所有部門

          List?GetALLUser?
          = ?UserDAO.GetAllUser(); // 取得所有用戶

          request.setAttribute(
          " View_Dept " ,?GetAllDept);

          request.setAttribute(
          " View_User " ,?GetALLUser);
          在頁面當中加入對JSTL的引用
          <%@?taglib?uri="http://java.sun.com/jsp/jstl/core"?prefix="c"%>

          然后寫代碼如下:
          <table>

          <tr>

          <td?align="center">

          <a?href="User.do?method=EditUser&UserId=<c:out?value='${View_User.UserId}'/>">

          <c:out?value="${View_User.UserName}"?/>?</a>

          </td>

          <td?align="center">

          <c:forEach?items="${View_Dept}"?var="View_Dept">

          <c:if?test="${View_User.Dept.DeptId==View_Dept.DeptId}">

          <c:out?value="${View_Dept.DeptName}"?/>

          </c:if>????????????????????????????

          </c:forEach>

          </td>

          </tr>

          </table>

          其中View_User.Dept.DeptId表示USER表與DEPT表的一個關系(外鍵)
          你就可以看到所顯示的列表了。

          還有如果在修改用戶時,則也與上面的差不多,首先在ACTION當中加入:

          String?ModifyUserId?=?request.getParameter("GroupUserId");

          if?(ModifyUserId?==?null?&&?ModifyUserId.equals(""))?{

          //這是出錯處理

          request.setAttribute(
          "UserMsg",?"User.ValidateUser");

          return?mapping.findForward("Fail");

          }

          DynaValidatorForm?UserActionForm?
          =?(DynaValidatorForm)?form;

          User?user?
          =?UserDAO.GetUser(ModifyUserId);????????

          List?GetAllDept?
          =?UserDAO.GetAllDept();//取得所有部門

          request.setAttribute(
          "View_Dept",?GetAllDept);

          UserActionForm.set(
          "User",?User);
          然后頁面當中顯示如下(部門為LISTBOX),例子當中只顯示部門
          <html:select?property="DeptAsString">????????????

          <c:forEach?items="${View_Dept}"?var="View_Dept">????????

          <c:choose>????????????????????????

          <c:when?test="${User.Dept.DeptId==View_Dept.DeptId}">

          <option????value="<c:out?value='${View_Dept.DeptId}'?/>"selected>????

          <c:out?value="${View_Dept.DeptName}"?/>????????????

          </option>????????????????????????????

          </c:when>????????????????????????????

          <c:otherwise>????????????????????????

          <option?value="<c:out?value='${View_Dept.DeptId}'?/>">????????

          <c:out?value="${View_Dept.DeptName}"?/></option>????????

          </c:otherwise>????????????????????????

          </c:choose>

          </c:forEach>

          </html:select>

          可以看到HTML的SELECT有一個DeptAsString,你可以在FORM當中指定一個STRING的FORM屬性。
          這樣用戶的要求就可以完成了。
          本次只說明方法,而代碼沒有經過測試。希望大家多多觀注我的BLOG,下一次將臭罵ACTIONFROM不支持的DATE類型及解決方法。

          posted @ 2006-09-25 16:36 @家軍 閱讀(452) | 評論 (0)編輯 收藏

          用二維數組管理好你零亂的狀態、分類和其它常用選項

               摘要: 在大家的編碼過程當中,有沒有遇到過這么一種情況,很多零亂的狀態、分類和其它常用選項常常是定義死了。但是沒有一個完整的東東來約束他,在每個模塊當中使用相關的信息時,往往重新COPY一次,或者COPY過來修改一次。如果多人協作的話,務必會讓代碼變的零亂、不好管理等。
          本次主要是把一些靜態的分類、狀態或者其它常用選項使用二維數組管理起來。如果你是一個使用JSTL或者STRUTS做前臺表現的話,你就更應該好好關注了.......  閱讀全文

          posted @ 2006-09-05 13:31 @家軍 閱讀(1282) | 評論 (0)編輯 收藏

          如果失去工作會怎么辦?

          ??? 在工作當中,遇到了一個不明智的上級,我是劉羅鍋,但是領導不一定是乾隆。設計當中的爭執成為私下做對的理由,從此,我感覺到今年的財運不佳。
          ??? 因為工作當中的爭執,而讓領導失去了面子??我在郁悶當中,為什么呀!好事反而成了壞事。
          ??? 領導的報復心理,讓我失去了績效,所以我感覺到財運不佳。我很想跳出這個魔鬼圈,是不是能夠改善一下自己的經濟收入呢?正在想離開這個公司......
          ??? 發現自己的軟肋:UML整體設計(最好有代碼生成)和XP敏捷開發。近期需要加強這兩方面的學習,可以以權限設計為UML做為訓練(生成代碼??),以CRM->VtigerCRM為業務主線,做一個XP開發,不過VtigerCRM的表設計真是很糟糕,Indiea人呀。
          ??? 今年的公司很亂,是一個很糟糕的管理層,可能我以后離開這個公司后才感覺到領導者的“聰明才智”吧!完全在內耗當中生存。我已經被領導國邊緣化,我會在灰色的區域彷徨很長的時間,或許公司另有高人吧,我已經被領導逐漸忽視,自己發光的時間也只有一年,好象知了一樣。
          ??? “人貴有自知之明”,如果領導沒有重視,只是為了發揮自己的最低性能的話,我完全有很多的時間來學習知識,我很慶幸自己和開源代碼有很大的信心,我將在以后的時間里,為開源界展示自己的能力。
          ??? 首先要把自己學習到的知識透明化,其次我會在開源中小型的CRM軟件當中做出自己應有的貢獻。

          posted @ 2006-07-24 11:37 @家軍 閱讀(472) | 評論 (1)編輯 收藏

          struts表單 vs JSTL表現之多條件查詢示例

          ??? struts表單主要是利用actionform來取得JSP頁面所有的request的,所有的Struts標簽無非在取得request當中的所有INPUT,并賦值回標簽值的,同理,JSTL能夠在JSP表單當中輕易的表現要輸出的結果。
          ??? 如果你是高手,你就知道這個標題有誤,是的,struts表單與JSTL表現沒有可比性,但是如果我們要在實現一個多條件的查詢頁面時,這個比較就比較有效了。
          ??? 我不妨比較一下利用struts表單的查詢實現 和 利用JSTL做為表現而實現的查詢功能有什么不同,讓讀者尋其方便。
          ??? 示例說明:
          ??? 用戶表-USER
          ??? username? 用戶名稱
          ??? loginid?? 登錄ID
          ??? sex?????? 性別
          ??? 一、利用struts表單的查詢實現
          ??????? 實現步驟:
          ??????? 創建多條件的序列化對象(java)->在struts.config當中申明actionform->Action當中實現->輸出結果
          ???????
          ????/**?The?value?of?the?simple?userName?property.?*/
          ????
          private?java.lang.String?userName;
          ????
          /**?The?value?of?the?simple?loginId?property.?*/
          ????
          private?java.lang.String?loginId;
          ????
          /**?The?value?of?the?simple?sex?property.?*/
          ????
          private?java.lang.String?sex;
          ????
          /**
          ?????*?Return?the?value?of?the?USER_NAME?column.
          ?????*?
          @return?java.lang.String
          ?????
          */
          ????
          public?java.lang.String?getUserName()
          ????{
          ????????
          return?this.userName;
          ????}

          ????
          /**
          ?????*?Set?the?value?of?the?USER_NAME?column.
          ?????*?
          @param?userName
          ?????
          */
          ????
          public?void?setUserName(java.lang.String?userName)
          ????{
          ????????
          this.userName?=?userName;
          ????
          /**
          ?????*?Return?the?value?of?the?LOGIN_ID?column.
          ?????*?
          @return?java.lang.String
          ?????
          */
          ????
          public?java.lang.String?getLoginId()
          ????{
          ????????
          return?this.loginId;
          ????}

          ????
          /**
          ?????*?Set?the?value?of?the?LOGIN_ID?column.
          ?????*?
          @param?loginId
          ?????
          */
          ????
          public?void?setLoginId(java.lang.String?loginId)
          ????{
          ????????
          this.loginId?=?loginId;
          ????}
          ????
          /**
          ?????*?Return?the?value?of?the?sex?column.
          ?????*?
          @return?java.lang.String
          ?????
          */
          ????
          public?java.lang.String?getSex()
          ????{
          ????????
          return?this.sex;
          ????}

          ????
          /**
          ?????*?Set?the?value?of?the?sex?column.
          ?????*?
          @param?loginId
          ?????
          */
          ????
          public?void?setSex(java.lang.String?sex)
          ????{
          ????????
          this.sex?=?sex;
          ????}
          <!-- struts_fonfig -->
          ???????
          <form-bean?name="UserActionForm"?type="org.apache.struts.validator.DynaValidatorForm">
          <form-property?name="userCondition"?type="com.antbee.searchCondition.UserFindCondition"?/>????????
          ????????
          </form-bean>
          Action當中
          DynaValidatorForm?UserForm?=?(DynaValidatorForm)?form;
          ????????UserFindCondition?Condition?
          =?(UserFindCondition)?UserActionForm
          ????????????????.get(
          "userCondition");//?取得查詢條件
          List?user?=?userManager.find(Condition,
          ????????????????(iCurPageNo?
          -?1)?*?pageCon.PAGE_SIZE,?pageCon.PAGE_SIZE);//呵呵,加入了hibernate的分頁
          具體實現:
          ????public?List?find(UserFindCondition?Condition,?int?begin,
          ????????????
          int?count)?{
          ????????StringBuffer?sql?
          =?new?StringBuffer("from?User?as?a?where?1=1");??????????????
          ? ? ? ?
          if?(Condition?!=?null)?{
          ????????????makeSql(sql,?shipmentFindCondition);
          ????????}
          ????????String?fsql?
          =?sql.toString();
          ????????Query?query?
          =?this.getSession().createQuery(fsql);
          ????????
          if?(Condition?!=?null)?{
          ????????????setParameter(query,?Condition);
          ????????}
          ????????query.setFirstResult(begin);
          ????????query.setMaxResults(count);
          ????????List?tt?
          =?query.list();
          ????????
          return?tt;
          ????}

          --
          ??? /**
          ??? ?* 根據條件生成一個sql語句
          ??? ?*
          ??? ?* @author 和
          ??? ?* @param sql
          ??? ?*??????????? 初始的sql語句(一般為select a from A as a where 1=1)
          ??? ?* @param condition
          ??? ?*??????????? 查詢的條件
          ??? ?* @return
          ??? ?* @version 1.0
          ??? ?*/
          private
          ?void?makeSql(StringBuffer?sql, UserFindCondition?condition)?{
          ????????
          if?(condition.getUsername()?!=?null
          ????????????????
          &&?!condition.getUsername().toString().equals(""))?{
          ????????????sql
          ????????????????????.append(
          "?and a.username like?:username");
          ????????}

          ????????
          if?(condition.getLoginid()?!=?null
          ????????????????
          &&?!condition.getLoginid(().equals(""))?{
          ????????????sql
          ????????????????????.append(
          "?and a.loginid( =?:loginid(");
          ????????}

          ????????
          if?(condition.getSex()?!=?null
          ????????????????
          &&?!condition.getSex().equals(""))?{
          ????????????sql.append(
          "?and a.sex =?:sex");
          ????????}


          ????}

          ????
          /**
          ?????*?根據條件設置query的值
          ?????*?
          ?????*?
          @author?和
          ?????*?
          @param?query
          ?????*????????????一個hibernate的Query對象
          ?????*?
          @param?condition
          ?????*????????????查詢的條件
          ?????*?
          @return
          ?????*?
          @version?1.0
          ?????
          */
          ????
          private?void?setParameter(Query?query, UserFindCondition?condition)?{

          ????????
          if?(condition.getUsername()?!=?null
          ????????????????
          &&?!condition.getUsername().equals(""))?{
          ????????????query.setString(
          "username",?"%"?+?condition.getUsername()
          ????????????????????
          +?"%");
          ????????}

          ????????
          if?(condition.getLoginid()?!=?null
          ????????????????
          &&?!condition.getLoginid().equals(""))?{
          ????????????query.setString(
          "loginid",?condition.getLoginid());
          ????????}

          ????????
          if?(condition.getSex()?!=?null
          ????????????????
          &&?!condition.getSex().equals(""))?{
          ????????????query.setString(
          "sex",?condition.getSex());
          ????????}?????

          ????}

          呵呵,笑死人了,這個方法很通用,我才在我的第二個項目當中才用到,真是可惜,當然了,使用Actionform有一個毛病就是對date類型要轉換成STRING類型來處理,這是actionform的一個死穴。還有對Actionform不能夠重置,只能夠回來從前。不知道這群設計者怎么想的,真是由于這一點,所以我們有必要使用最原始的方法來解決問題了。使用頁面當中的input,我們來拼request如何?
          ?? 二、利用JSTL做為表現而實現的查詢功能
          ???? 步驟:在JSP頁面布置很多的input,當然,你可以加入value了。(省略了...)
          ?????????? 創建查詢條件的序列化對象(同樣user.java)
          ?????????? 在action當中拼個condition了,做為查詢條件,后面的處理類同第一種方式。
          ?????UserSearchCondition?userSearchCondition?=?null;
          ?????userSearchCondition?
          =?makeUserSearchCondition(request);

          private UserSearchCondition?makeUserSearchCondition(HttpServletRequest?request)?throws?Exception{
          ???????
          UserSearchCondition userSearchCondition?=?new?OrderSearchCondition();
          ????????String username
          =?request.getParameter("Username");
          ????????String loginid
          =?request.getParameter("Loginid");
          ????????String sex
          =?request.getParameter("Sex");??
          ???????

          ????????????????
          ????????
          if(username!=?null?&&?!username.trim().equals("")){
          ???????????
          usernameSearchCondition.setUsername(username);
          ????????}
          ????????
          ????????
          if(loginid? !=?null?&&?!loginid.trim().equals("")){
          ??????????? userSearchCondition.set
          Loginid (loginid );
          ????????}
          ????????
          ????????
          if(sex !=?null?&&?!sex.trim().equals("")){????????
          ??????????? userSearchCondition.setSex(
          sex);
          ????????}??????

          ????????
          ????????
          return userSearchCondition;
          ????}

          ???? 以后的方法,我就不用再做舉例了吧,可以參考如上第一種方法的實現.
          ???? 第二種方法的好處就是:在頁面上比較好控制,比如重置,又比如日期性數據等。
          ???? (所有過程當中的代碼沒有經過測試,只是說明這種方法而已)

          posted @ 2006-07-21 11:20 @家軍 閱讀(2717) | 評論 (1)編輯 收藏

          hibernate的延遲加載通用方法

          呵呵,在忙一個項目,潛水很久,現在冒個泡:
          (本文適用在struts+spring+hibernate3上做開發的蟲蟲們)
          類名:HibernateUtil

          package?com.antbee.j2eemodel.util;

          import?java.lang.reflect.InvocationTargetException;
          import?java.lang.reflect.Method;
          import?java.util.Collection;
          import?java.util.Iterator;

          import?org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          public?class?HibernateUtil?extends?HibernateDaoSupport?{

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @param?methodName?方法名稱
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object,?String?methodName)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          String[]?methodArray?
          =?methodName.split("\\.");
          Method?method?
          =?null;
          Object?initializeObject?
          =?object;

          if(methodArray.length?==?1){
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          method?
          =?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          this.getHibernateTemplate().initialize(initializeObject);
          }
          else{
          for(int?i=0;i<methodArray.length;i++){
          method?
          =?initializeObject.getClass().getMethod(methodArray[i],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          }
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(initializeObject);
          }
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @param?methodName?方法名稱數組
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object,?String?methodName[])
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for?(int?i?=?0;?i?<?methodName.length;?i++)?{
          String[]?methodArray?
          =?methodName[i].split("\\.");
          Method?method?
          =?null;
          Object?initializeObject?
          =?object;

          if(methodArray.length?==?1){
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          method?
          =?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          this.getHibernateTemplate().initialize(initializeObject);
          }
          else{
          for(int?j=0;j<methodArray.length;j++){
          method?
          =?initializeObject.getClass().getMethod(methodArray[j],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          }
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(initializeObject);
          }
          }

          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
          this.getHibernateTemplate().lock(object,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(object);
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?collection?POJO對象集合
          *?
          @param?methodName?方法名稱數組
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Collection?collection,?String?methodName[])
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for(Iterator?i=collection.iterator();i.hasNext()Wink{
          Object?object?
          =?i.next();
          this.initialize(object,methodName);
          }
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?collection?POJO對象集合
          *?
          @param?methodName?方法名稱
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Collection?collection,?String?methodName)
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for(Iterator?i=collection.iterator();i.hasNext()Wink{
          Object?object?
          =?i.next();
          this.initialize(object,methodName);
          }
          }
          }?

          這個方法的好外是:可以不在hbm.xml的文件當中,指定為lazy=true這個模式,可以直接使用。使用方法如下:
          如果你使用SPRING,則需要把hibernateUtil注入其中:
          ?<bean?id="hibernateUtilTarget"?class="com.antbee.j2eemodel.util.HibernateUtil">
          <property?name="sessionFactory">
          <ref?local="mssqlSessionFactory"?/>
          </property>
          </bean>

          <bean?id="hibernateUtil"?parent="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
          <property?name="target">
          <ref?local="hibernateUtilTarget"?/>
          </property>
          </bean>
          <!--配置基礎事務-->
          <bean?id="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?abstract="true">
          <property?name="transactionManager">
          <ref?bean="mssqltransactionManager"?/>
          </property>
          <property?name="proxyTargetClass">
          <value>true</value>
          </property>
          <property?name="transactionAttributes">
          <props>
          <prop?key="*">PROPAGATION_REQUIRED</prop>
          </props>
          </property>
          </bean>?

          使用示例:
          如果你使用STRUTS,則需要這樣:
          List?what_ur_view?=?XXXManager.find(.);//取得你要展示的對象
          //如果這個對象當中有延遲加載的對象(SET)時,則需要如下加載就行
          this.hibernateUtil.initialize(what_ur_view,?"getTbShipmentSale");
          //其中getTbShipmentSale是其對象(SET也可以操作)?

          在頁面顯示的時候,你就可以使用JSTL如下表述:
          <c:out?value="${what_ur_view.tbShipmentSale.goodsReceivePersonPhone}"?/>//呵呵,是不是很爽呀。?

          同樣的方法,我們也可以對一個SET在頁面進行顯示,方法如下:
          <c:forEach?items="${what_ur_view.tbShipmentProductMappingSet}"?var="ProductMapping"?varStatus="status">
          <c:out?value="${ProductMapping.productNum}"?/>
          <c:out?value="${ProductMapping.tbOutOfWarehouse.outOfWarehouseNum}"?/>
          </c:forEach>
          //呵呵,支持多級嵌套,?

          在ACTION當中則需要加入
          hibernateUtil.initialize(what_ur_view.getTbShipmentProductMappingSet(),
          new?String[]?{?"getTbProduct",?"getTbOutOfWarehouse",
          "getTbProductConfigure"?});?
          呵,如果你要是在HIBERNATE當中使用,這個就太簡單了吧。

          怎么樣?呵呵呵,
          從此,我對STRUTS的標簽深惡痛絕,而對JSTL情有獨鐘了。

          posted @ 2006-07-21 10:09 @家軍 閱讀(5600) | 評論 (2)編輯 收藏

          成功是一種病態的堅持!

          ?? 很長的時間陷入到與同事上級的斗爭當中,無聊死了,今天回來看看自己書簽當中的網站,感覺到自己是小人了。我不應該留戀明爭暗斗,我應該自立自強,永不停息。
          ?? 在年前的時候我曾經非常看好compiere的應用,想不到今天再看看國內使用的形勢,長三角和珠三角的廣泛應用,還有ORACLE免費數據庫的推出,更加印證了我錯誤的做法。
          ?? 一個人最重要的事情就是三個字:做決定。
          ?? 一個人想要成功,尤其像我這樣不甘愿給別人打工又有很多想法的人,除非是一種病態的堅持才能夠取得成功。
          ?? 我很討厭公司現行的CRM系統,簡單的說一句就是:簡直就是一個糊人的、丑陋的MIS系統,一點設計思想都沒有,一點產品理念都沒有。最重要的設計者在拼命的逃脫自己的責任,開發者在忍受莫大的痛苦,業務在每一個開發者思想里扭曲......唉,想抽出一點時間來都難。
          ?? 我要在以后的時候里,一則增加自己的業務能力,以compiere的應用為主;二則要增強我的技術能力,以 vTigerCRM為藍本,做一個J2EE的產品移植。
          ?? 在今年年底以前,自己必須要做到對compiere的應用熟練,能夠完成 vTigerCRM的J2EE實現。所以自己最重要要做的事是:時間安排,

          posted @ 2006-07-19 16:35 @家軍 閱讀(398) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 昌平区| 绵阳市| 瑞安市| 民丰县| 宜兰市| 景泰县| 定西市| 丰顺县| 南通市| 安阳市| 通海县| 阳城县| 布尔津县| 沛县| 遂平县| 揭西县| 乌鲁木齐市| 北海市| 大荔县| 凯里市| 通江县| 蓝田县| 台东县| 公主岭市| 弋阳县| 扎鲁特旗| 瑞昌市| 饶阳县| 渝北区| 苏尼特右旗| 广昌县| 丽江市| 瓦房店市| 桦南县| 察哈| 芮城县| 丹东市| 鄯善县| 荥阳市| 静宁县| 上栗县|