JAVA涂鴉
          關于JAVA的點點滴滴
          posts - 50,  comments - 689,  trackbacks - 0

          前面的文章:

          struts+spring+hibernate web 應用 < > 架構搭建

          struts+spring+hibernate web 應用 < > Dao 層代碼編寫

          ?

          現(xiàn)在開始編寫 Service 層代碼:

          com.game.products.services.iface 包中新建 ProductsService 接口,代碼如下:

          ?

          package ?com.game.products.services.iface;

          import ?java.util.List;

          import ?com.game.products.model.Products;

          public ? interface ?ProductsService? {
          ????
          void ?addProduct(Products?pd); // 添加記錄
          ???? void ?deleteProduct(Products?pd); // 刪除記錄????
          ????List?getProducts(); // 獲得所有記錄
          ???? int ?getRows();; // 獲得總行數
          ????List?getProducts( int ?pageSize,? int ?startRow)?; // 獲得一段記錄
          ????Products?getProduct(String?gameId); // 根據ID獲得記錄
          ????String?getMaxID(); // 獲得最大ID值
          ???? void ?updateProductd(Products?pd); // 修改記錄
          ????List?queryProducts(String?fieldname,String?value); // 根據條件查詢的所有記錄
          ???? int ?getRows(String?fieldname,String?value); // 獲得總行數
          ????List?queryProducts(String?fieldname,String?value, int ?pageSize,? int ?startRow); // 根據條件查詢的一段記錄
          }

          com.game.products.services 包中新建 ProductsServiceImp 類,這個類實現(xiàn)了 ProductsService 接口,代碼如下:

          package ?com.game.products.services;

          import ?java.util.List;

          import ?com.game.products.dao.iface.ProductsDao;
          import ?com.game.products.model.Products;
          import ?com.game.products.services.iface.ProductsService;

          public ? class ?ProductsServiceImp? implements ?ProductsService {
          ????
          private ?ProductsDao?productsDao;
          ????
          ????
          public ?ProductsServiceImp() {}
          ????
          ????
          /**
          ?????*?函數說明:添加信息
          ?????*?參數說明:對象?
          ?????*?返回值:
          ?????
          */

          ????
          public ? void ?addProduct(Products?pd)? {
          ????????productsDao.addProduct(pd);
          ????}


          ????
          /**
          ?????*?函數說明:刪除信息
          ?????*?參數說明:?對象
          ?????*?返回值:
          ?????
          */

          ????
          public ? void ?deleteProduct(Products?pd)? {
          ????????productsDao.deleteProduct(pd);
          ????}


          ????
          /**
          ?????*?函數說明:獲得所有的信息
          ?????*?參數說明:?
          ?????*?返回值:信息的集合
          ?????
          */

          ????
          public ?List?getProducts()? {
          ????????
          return ?productsDao.getProducts();
          ????}

          ????
          ????
          /**
          ?????*?函數說明:獲得總行數
          ?????*?參數說明:?
          ?????*?返回值:總行數
          ?????
          */

          ????
          public ? int ?getRows()? {
          ????????
          return ?productsDao.getRows();
          ????}

          ????
          ????
          /**
          ?????*?函數說明:獲得一段信息
          ?????*?參數說明:?
          ?????*?返回值:信息的集合
          ?????
          */

          ????
          public ?List?getProducts( int ?pageSize,? int ?startRow)? {
          ????????
          return ?productsDao.getProducts(pageSize,?startRow);
          ????}


          ????
          /**
          ?????*?函數說明:獲得一條的信息
          ?????*?參數說明:?ID
          ?????*?返回值:對象
          ?????
          */

          ????
          public ?Products?getProduct(String?gameId)? {
          ????????
          return ?productsDao.getProduct(gameId);
          ????}


          ????
          /**
          ?????*?函數說明:獲得最大ID
          ?????*?參數說明:?
          ?????*?返回值:最大ID
          ?????
          */

          ????
          public ?String?getMaxID()? {
          ????????
          return ?productsDao.getMaxID();
          ????}


          ????
          /**
          ?????*?函數說明:修改信息
          ?????*?參數說明:?對象
          ?????*?返回值:
          ?????
          */

          ????
          public ? void ?updateProductd(Products?pd)? {
          ????????productsDao.updateProductd(pd);
          ????}


          ????
          /**
          ?????*?函數說明:查詢信息
          ?????*?參數說明:?集合
          ?????*?返回值:
          ?????
          */

          ????
          public ?List?queryProducts(String?fieldname,String?value)? {
          ????????
          return ?productsDao.queryProducts(fieldname,?value);
          ????}

          ????
          ????
          /**
          ?????*?函數說明:獲得總行數
          ?????*?參數說明:?
          ?????*?返回值:總行數
          ?????
          */

          ????
          public ? int ?getRows(String?fieldname,String?value)? {
          ????????
          return ?productsDao.getRows(fieldname,?value);
          ????}

          ????
          ????
          /**
          ?????*?函數說明:查詢一段信息
          ?????*?參數說明:?集合
          ?????*?返回值:
          ?????
          */

          ????
          public ?List?queryProducts(String?fieldname,String?value, int ?pageSize,? int ?startRow)? {
          ????????
          return ?productsDao.queryProducts(fieldname,?value,pageSize,startRow);
          ????}


          ????
          public ?ProductsDao?getProductsDao()? {
          ????????
          return ?productsDao;
          ????}


          ????
          public ? void ?setProductsDao(ProductsDao?productsDao)? {
          ????????
          this .productsDao? = ?productsDao;
          ????}


          }


          ?

          基本的業(yè)務層代碼就這些了。因為還有分頁的業(yè)務,所以接下來編寫分頁的代碼。


          分頁是個公共的類,所以放在
          com.game.commons 中。

          Pager 類,封裝了分頁需要的屬性,代碼如下:

          package ?com.game.commons;

          import ?java.math. * ;

          public ? class ?Pager? {
          ????
          private ? int ?totalRows;? // 總行數
          ???? private ? int ?pageSize? = ? 30 ;? // 每頁顯示的行數
          ???? private ? int ?currentPage;? // 當前頁號
          ???? private ? int ?totalPages;? // 總頁數
          ???? private ? int ?startRow;? // 當前頁在數據庫中的起始行
          ????
          ????
          public ?Pager()? {
          ????}

          ????
          ????
          public ?Pager( int ?_totalRows)? {
          ????????totalRows?
          = ?_totalRows;
          ????????totalPages
          = totalRows / pageSize;
          ????????
          int ?mod = totalRows % pageSize;
          ????????
          if (mod > 0 ) {
          ????????????totalPages
          ++ ;
          ????????}

          ????????currentPage?
          = ? 1 ;
          ????????startRow?
          = ? 0 ;
          ????}

          ????
          ????
          public ? int ?getStartRow()? {
          ????????
          return ?startRow;
          ????}

          ????
          public ? int ?getTotalPages()? {
          ????????
          return ?totalPages;
          ????}

          ????
          public ? int ?getCurrentPage()? {
          ????????
          return ?currentPage;
          ????}

          ????
          public ? int ?getPageSize()? {
          ????????
          return ?pageSize;
          ????}

          ????
          public ? void ?setTotalRows( int ?totalRows)? {
          ????????
          this .totalRows? = ?totalRows;
          ????}

          ????
          public ? void ?setStartRow( int ?startRow)? {
          ????????
          this .startRow? = ?startRow;
          ????}

          ????
          public ? void ?setTotalPages( int ?totalPages)? {
          ????????
          this .totalPages? = ?totalPages;
          ????}

          ????
          public ? void ?setCurrentPage( int ?currentPage)? {
          ????????
          this .currentPage? = ?currentPage;
          ????}

          ????
          public ? void ?setPageSize( int ?pageSize)? {
          ????????
          this .pageSize? = ?pageSize;
          ????}

          ????
          public ? int ?getTotalRows()? {
          ????????
          return ?totalRows;
          ????}

          ????
          public ? void ?first()? {
          ????????currentPage?
          = ? 1 ;
          ????????startRow?
          = ? 0 ;
          ????}

          ????
          public ? void ?previous()? {
          ????????
          if ?(currentPage? == ? 1 )? {
          ????????????
          return ;
          ????????}

          ????????currentPage
          -- ;
          ????????startRow?
          = ?(currentPage? - ? 1 )? * ?pageSize;
          ????}

          ????
          public ? void ?next()? {
          ????????
          if ?(currentPage? < ?totalPages)? {
          ????????????currentPage
          ++ ;
          ????????}

          ????????startRow?
          = ?(currentPage? - ? 1 )? * ?pageSize;
          ????}

          ????
          public ? void ?last()? {
          ????????currentPage?
          = ?totalPages;
          ????????startRow?
          = ?(currentPage? - ? 1 )? * ?pageSize;
          ????}

          ????
          public ? void ?refresh( int ?_currentPage)? {
          ????????currentPage?
          = ?_currentPage;
          ????????
          if ?(currentPage? > ?totalPages)? {
          ????????????last();
          ????????}

          ????}

          }


          ?

          PagerService 類,主要有個 getPager 方法返回 Pager 類。代碼如下:

          package ?com.game.commons;

          public ? class ?PagerService? {
          ????
          public ?Pager?getPager(String?currentPage,String?pagerMethod, int ?totalRows)? {
          ????????
          // ????定義pager對象,用于傳到頁面
          ????????Pager?pager? = ? new ?Pager(totalRows);
          ????????
          // ????如果當前頁號為空,表示為首次查詢該頁
          ????????
          // ????如果不為空,則刷新pager對象,輸入當前頁號等信息
          ???????? if ?(currentPage? != ? null )? {
          ????????????pager.refresh(Integer.parseInt(currentPage));
          ????????}

          ????????
          // ????獲取當前執(zhí)行的方法,首頁,前一頁,后一頁,尾頁。
          ???????? if ?(pagerMethod? != ? null )? {
          ????????????
          if ?(pagerMethod.equals( " first " ))? {
          ????????????????pager.first();
          ????????????}
          ? else ? if ?(pagerMethod.equals( " previous " ))? {
          ????????????????pager.previous();
          ????????????}
          ? else ? if ?(pagerMethod.equals( " next " ))? {
          ????????????????pager.next();
          ????????????}
          ? else ? if ?(pagerMethod.equals( " last " ))? {
          ????????????????pager.last();
          ????????????}

          ????????}

          ????????
          return ?pager;
          ????}

          }

          ?

          ?

          這個分頁方法比較簡單,而且功能也齊全,許多頁面級的開源 table 中分頁很多也是基于這個原理,所以理解了這個分頁,對其他各種分頁技術的理解也就迎刃而解了。

          ?

          服務層的代碼就這些了,接下來就可以寫 spring 的配置文件來用 spring 管理這些 Dao Service 了。

          spring-context 包中新建 applicationContext.xml 。配置的寫法如下:

          <? xml?version="1.0"?encoding="ISO-8859-1" ?>
          <! DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd" >
          ?
          < beans >
          ????
          <!-- ?dataSource?config? -->
          ????
          < bean? id ="dataSource" ?class ="org.springframework.jndi.JndiObjectFactoryBean" >
          ????????
          < property? name ="jndiName" >
          ????????????
          < value > java:comp/env/jdbc/game </ value >
          ????????
          </ property >
          ????
          </ bean >
          <!-- ?SessionFactory? -->
          ????
          < bean? id ="sessionFactory"
          ????????class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >

          ????????
          < property? name ="dataSource" >
          ????????????
          < ref? bean ="dataSource" />
          ????????
          </ property >
          ????????
          < property? name ="configLocation" >
          ????????????
          < value > classpath:com\game\bean\hibernate\hibernate.cfg.xml </ value >
          ????????
          </ property > ????????
          ????
          </ bean >
          ????
          ????
          <!-- ?TransactionManager?? -->
          ????
          < bean? id ="transactionManager"
          ????????class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
          ????????
          < property? name ="sessionFactory" >
          ????????????
          < ref? local ="sessionFactory" />
          ????????
          </ property >
          ????
          </ bean >
          <!-- ?DAO? -->
          ????
          < bean? id ="productsDao" ?class ="com.game.products.dao.hibernate.ProductsMapDao" >
          ????????
          < property? name ="sessionFactory" >
          ????????????
          < ref? bean ="sessionFactory" />
          ????????
          </ property >
          ????
          </ bean >
          ????
          ????
          <!-- ?Services? -->
          ?????
          < bean? id ="productsService" ?class ="com.game.products.services.ProductsServiceImp" >
          ????????
          < property? name ="productsDao" >
          ????????????
          < ref? bean ="productsDao" />
          ????????
          </ property >
          ????
          </ bean > ?
          < bean? id ="pagerService" ?class ="com.game.commons.PagerService" >
          ????
          </ bean >
          </beans>


          ?

          配置文件不難,主要是些 IOC 控制。數據庫鏈接我采用的是數據源方式,需要在 tomcat 的conf文件夾下的 server.xml 中添加數據源,添加的數據如下:

          < Context? path ="/game" ?docBase ="D:\tomcat-5.5.20\webapps\game" ?debug ="0" ?reloadable ="true" >
          ????????
          < Resource
          ????????????
          name ="jdbc/game"
          ????????????type
          ="javax.sql.DataSource"
          ????????????password
          =""
          ????????????driverClassName
          ="net.sourceforge.jtds.jdbc.Driver"
          ????????????maxIdle
          ="2"
          ????????????maxWait
          ="5000"
          ????????????username
          ="sa"
          ????????????url
          ="jdbc:jtds:sqlserver://127.0.0.1:16899/game"
          ????????????maxActive
          ="4" />

          ????????
          </ Context >


          ?

          這個數據源是針對 tomcat 5.5 以上版本的,以下版本的寫法有所不同,不同之處可以用 google 搜索得知。這個數據源很簡單,并沒有過多的配置來優(yōu)化系統(tǒng),只是為了讓項目更容易讓人理解。需要注意都是,我的數據鏈接的JDBC包是jtds包,而不是普通的那個三個jar包。

          ?

          下一篇,將寫 Web 層的代碼了。

          struts+spring+hibernate web 應用 < > Web 層代碼編寫(1)

          struts+spring+hibernate web 應用 < > Web 層代碼編寫(2)


          posted on 2007-03-13 16:52 千山鳥飛絕 閱讀(14211) 評論(11)  編輯  收藏 所屬分類: Web開發(fā)

          FeedBack:
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2007-03-13 17:04 | w
          多謝lz   回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2007-03-13 22:22 | tornado
          哥們辛苦了  回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫[未登錄]
          2007-03-14 12:50 | 阿蜜果
          up!
          期待下篇  回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2007-03-15 17:40 | walk man
          service層在spring配置中沒有對方法進行事務配置  回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2007-03-16 08:47 | 千山鳥飛絕
          @walk man

          在下一篇,使用權限配置的時候,將對service進行事務管理。
          一般的添刪改查不需要事務處理。
            回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2007-03-16 10:20 | walk man
          @千山鳥飛絕
          建議:作為例子再把異常體系設計一下,尤其當你的dao層和service層通過spring組裝時候,需要根據dao層異常來提交或回滾service層的事務。 現(xiàn)在這樣簡單寫很容易把哪些新入門的人誤導了啊。以為這就萬事大吉了。  回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2008-02-25 09:28 | xx
          為什么要搞那么多接口呀?  回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2008-04-25 17:14 | whttaotao
          你在Service層聲明了ProductsDao借口對象???
          調用 ProductsDao的子類方法 編譯能通過???
            回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2008-04-25 17:16 | whttaotao
          還有你的spring沒有用到自醒機制啊~!建議補上~!  回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2008-04-25 17:45 | whttaotao
          @whttaotao
          這里當我白說 說錯了
            回復  更多評論
            
          # re: struts+spring+hibernate的web應用 Service層代碼編寫
          2010-06-08 14:30 | 細菌
          Service層無法創(chuàng)建~~~
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobservice' defined in ServletContext resource [/WEB-INF/classes/action.xml]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
          求助啊~~
          email:levin_xh@hotmail.com  回復  更多評論
            
          正在閱讀:



          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(35)

          隨筆檔案

          文章分類

          文章檔案

          好友的blog

          我的其他blog

          老婆的Blog

          搜索

          •  

          積分與排名

          • 積分 - 775408
          • 排名 - 56

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 赤壁市| 云龙县| 疏附县| 台中县| 尼玛县| 舟曲县| 衡东县| 湖口县| 观塘区| 通山县| 巴林右旗| 佛冈县| 徐州市| 垫江县| 五原县| 桂东县| 汨罗市| 新余市| 沽源县| 古田县| 郯城县| 定陶县| 包头市| 普陀区| 邵武市| 南平市| 灯塔市| 仪征市| 马关县| 舟曲县| 伊春市| 柳林县| 田东县| 偏关县| 雷山县| 清原| 嵊州市| 临澧县| 格尔木市| 淳安县| 苍梧县|