云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          在數據庫的設計中,字典項是經常使用的技巧。
          比如在一個圖書館系統中,書籍表(Book)會有一個分類字段,這時候我們一般會單獨建立一張分類表(Category),在書籍表只保存分類表的ID。
          在用戶界面上顯示書籍明細的時候,會要求顯示CategoryID在Category表中對應的名稱。
          這樣通常的做法是把Book和Category兩張表進行關聯。
          但在實際應用中,Category一般都是Cache在應用服務器端,再使用數據表的連接就不夠高效。
          我的做法是這樣的:在iBatis中使用SqlMap從表中將數據取出,此時不使用數據表的連接。
          package com.demo;
          public class Book {
                
          /* 省略了getter和setter方法 */
                  private int id;
                  
          private String name;
                  
          private int categoryId;
                  
          private String author;
          }


          package com.demo;

          public class Category {
                 
          private static Map<Integer, Category> cacheMap;

                  
          /* 省略了這兩個屬性的getter和setter方法 */

                  
          private int id;
                  
          private String name;
                 
          public static Category getCategory(int id) {
                       init();
                      
          return cacheMap.get(id);
                  }
           
                  
          public static Map<Integer, Category> getCategoryMap() {
                      init();
                     
          return cacheMap();
                  }

                 
          private init() {
                      
          if ( cacheMap != null ) return;

                      
          // the code to load category from datebase
                      
          // 在這里為了演示的需要,使用以下代碼

                       cacheMap 
          = new HashMap<Integer, Category>();
                       Category category 
          = new Category();
                       category.setId(
          1);
                       category.setName(
          "Fiction");
                       cacheMap.put(
          1, category);
           
                       category 
          = new Category();
                       category.setId(
          2);
                       category.setName(
          "Cartoon");
                  }
          }



          package com.demo;

          public class BookAction  {
                  
          /* 省略了屬性的getter和setter方法 */
                  Book book;

                  
          public String execute() {
                          book 
          = new Book();
                          book.setId(
          1);
                          book.setName(
          "Thinking in java");
                          book.setCategoryId(
          1);
                          bookList.add(book);
                          
                          
          return SUCCESS;                
                  }
          }

          JSP:
          <%@ taglib prefix="s" uri="/struts-tags"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
           
          <head>
            
          <s:head />
           
          </head>

           
          <body>

            
          <table border="1">
              
          <tr>
               
          <td>
                
          <s:text name="page.label.userName" />
               
          </td>
               
          <td>
                
          <s:property value="book.name" />
               
          </td>
              
          </tr>
              
          <tr>
               
          <td>
                
          <s:text name="page.label.category" />
               
          </td>
               
          <td>
                 
          <s:property value="@com.demo.Category@getCategory(book.categoryId).getName()"/></td>
              
          </tr>
           
          </body>
          </html>






          評論

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-17 17:57 by 雨奏
          @云自無心水自閑

          其實如果修改一下Book為

          public class Book {
          /* 省略了getter和setter方法 */
          private int id;
          private String name;
          private Category category; //Modify code here
          private String author;
          }

          (當然你的action、dao等需要進行相應的修改)

          可以考慮在JSP頁面中這樣訪問:

          <s:property value="book.category.name"/>

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值[未登錄]  回復  更多評論   

          2008-03-17 19:00 by 云自無心水自閑
          @雨奏
          這篇文章主要就是想利用數據的緩存簡化數據存取。
          Category這樣的緩存方法只是一個示例,其實數據完全可以以其他的方式緩存,這里只是介紹有這么一種方法可以使用。

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-17 21:06 by 長江三峽
          學習

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 00:12 by Edward's
          ognl原來可以這樣用啊

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 09:37 by 雨奏
          @云自無心水自閑
          沒錯,數據緩存方式有多種,你的文章也確實展現了ognl的更多的用法。我只是提出一點個人的看法供參考:就你提供的代碼來看,感覺換一種方式似乎更簡潔、更易理解一點

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 09:59 by hejianhuacn
          webwork2 里也支持“@com.demo.Category@getCategory(book.categoryId).getName()"的語法?看來要試一下了

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 20:55 by 云自無心水自閑
          @雨奏
          想請教一下,你準備如何修改action和Dao? 
          即如何獲得book實例中category的值呢?

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 21:53 by 雨奏
          @云自無心水自閑
          因為我使用的是Hibernate,當把Category作為Book的一個屬性,獲得一個Book實例后可直接訪問該屬性取得相應的Category,Hibernate會自動地加載它(如果設置了laze initialization,Hibernate會在程序第一次訪問該屬性時加載,否則加載Book時同時加載)
          我才注意到你使用的是iBatis,很抱歉我對它并不了解,我提到的這種做法可能并不適合
          主站蜘蛛池模板: 徐汇区| 宝鸡市| 静安区| 双鸭山市| 陇川县| 闵行区| 马关县| 绍兴县| 双流县| 高台县| 邻水| 鄯善县| 黄骅市| 仙游县| 南江县| 平利县| 宣恩县| 东阿县| 石台县| 石狮市| 饶阳县| 台东县| 广德县| 疏勒县| 镇沅| 雅安市| 宁晋县| 全椒县| 宜兰县| 修武县| 广安市| 屏边| 两当县| 获嘉县| 江口县| 信丰县| 宜丰县| 漳浦县| 封丘县| 都昌县| 监利县|