千山鳥飛絕 萬徑人蹤滅
          勤練內功,不斷實踐招數。爭取早日成為武林高手

          2009年8月23日

          在實現程序的修改模塊時,要在頁面端檢查用戶是否修改過數據,以便提醒用戶及時保存修改后的數據。
          實現要求:
            判斷用戶是否修改了輸入的內容,要能判斷input中的checkbox,text,radio等,不知道會多少個input,也不知道input的ID和name,要在客戶端判斷是否修改,不能產

          生提交。還要同時滿足IE和firefox兩種環境。也要支持master和content頁的使用。
          解決方案;
            處理思路:在頁面加載時記錄所有的input的值或狀態,如果要求在用戶進行修改操作時立即調整控件狀態,則在數據區div上的onclick和onkeypress事件里調用檢查數據

          是否改變的函數,并設置相應控件的狀態(用ha_setch())。如果是在提交或用戶手動控制檢查過程時,則在相應的操作事件中調用檢查數據是否改變(例在button的onclick

          ()中使用ha_checkin()控制提交)。
             以下是實現代碼
          var ha_last=new Array;//定義一個全局的空對象,存放所有的初始值。
          function ha_get()//讀取初始值
          { var ha_input = document.getElementsByTagName("input");
          for (var i=0;i<ha_input.length;i++)
          {
          if (ha_input[i].type=="password"){ ha_last.push(ha_input[i].value);}//根本頁面需要設置type的值和對象屬性
          if (ha_input[i].type=="radio") {ha_last.push(ha_input[i].checked);}//要保證檢查的范圍是否準確
          }
          }
          window.onload=ha_get;//綁定讀取初始值的函數
          function ha_checkin()//檢查新的輸入值和初始值是否相等。返回判斷結果。true為沒有發生修改,false為有修改。
          { var ha_now=new Array;
          var ha_input = document.getElementsByTagName("input");
          for (var i=0;i<ha_input.length;i++)
          {
          if (ha_input[i].type=="password"){ ha_now.push(ha_input[i].value);}//根本頁面需要設置type的值和對象屬性。
          if (ha_input[i].type=="radio") {ha_now.push(ha_input[i].checked);}//也要保證和ha_get()中檢查的標簽相一致
          }
          if (ha_now.toString()==ha_last.toString())//沒修改
          {return true;}
          else//有修改
          {return false;}
          }
          function ha_setch(){//設置相應的控件狀態
          if (ha_checkin())//沒有變化
             //改變控件的顯示和功能狀態
          else//有變化
             //改變控件的顯示和功能狀態
          }


          做了適當的修改。最后在button里面onclick直接調用

           

               var ha_last=new Array;//定義一個全局的空對象,存放所有的初始值。
                      function ha_get()//讀取初始值
                      {
                          var ha_input = document.getElementsByTagName("input");
                          ha_last.push($("#select").val());//采用jquery獲取select 選擇的值
                          for (var i=0;i<ha_input.length;i++)
                          {
                              if (ha_input[i].type=="text"){ ha_last.push(ha_input[i].value);}//根本頁面需要設置type的值和對象屬性
                          }
                      }
                      window.onload=ha_get;//綁定讀取初始值的函數
                      function ha_checkin(action)//檢查新的輸入值和初始值是否相等。返回判斷結果。true為沒有發生修改,false為有修改。
                      {
                               if(action=="update"){
                              var ha_now=new Array;
                              var ha_input = document.getElementsByTagName("input");
                              ha_now.push($("#select").val());
                             
                              for (var i=0;i<ha_input.length;i++)
                              {
                                  if (ha_input[i].type=="text"){ ha_now.push(ha_input[i].value);}//根本頁面需要設置type的值和對象屬性。
                              }
                              if (ha_now.toString()==ha_last.toString())//沒修改
                              {
                                  alert("沒有修改");
                                  return false;
                              }
                              else//有修改
                              {
                                  //  return true;
                              }
                          }
                      }

           


           
                  

           

           

          posted @ 2009-11-23 17:36 笑口常開、財源滾滾來! 閱讀(564) | 評論 (0)編輯 收藏
           

          來自:http://www.javaeye.com/topic/304818

          jQuery 是我最喜歡的一個Javascript框架,下表中包含了240+可以為jQuery愛好者們使用的插件。我斷定一定還有下表沒有包括的,如果你還知道其他的好東西,歡迎與大家分享。

          文件上傳

          Ajax File Upload
          jQUploader
          Multiple File Upload plugin
          jQuery File Style
          Styling an input type file
          Progress Bar Plugin

          表單驗證

          jQuery Validation
          Auto Help
          Simple jQuery form validation
          jQuery XAV - form validations
          jQuery AlphaNumeric
          Masked Input
          TypeWatch Plugin
          Text limiter for form fields
          Ajax Username Check with jQuery

          Form - Select Box stuff

          jQuery Combobox
          jQuery controlled dependent (or Cascadign) Select List
          Multiple Selects
          Select box manipulation
          Select Combo Plugin
          jQuery - LinkedSelect
          Auto-populate multiple select boxes
          Choose Plugin (Select Replacement)

          表單基本、輸入與、復選框等

          jQuery Form Plugin
          jQuery-Form
          jLook Nice Forms
          jNice
          Ping Plugin
          Toggle Form Text
          ToggleVal
          jQuery Field Plugin
          jQuery Form’n Field plugin
          jQuery Checkbox manipulation
          jTagging
          jQuery labelcheck
          Overlabel
          3 state radio buttons
          ShiftCheckbox jQuery Plugin
          Watermark Input
          jQuery Checkbox (checkboxes with imags)
          jQuery SpinButton Control
          jQuery Ajax Form Builder
          jQuery Focus Fields
          jQuery Time Entry

          時間,日期和顏色選取器

          jQuery UI Datepicker
          jQuery date picker plugin
          jQuery Time Picker
          Time Picker
          ClickPick
          TimePicker
          Farbtastic jQuery Color Picker Plugin
          Color Picker by intelliance.fr

          投票插件

          jQuery Star Rating Plugin
          jQuery Star Rater
          Content rater with asp.net, ajax and jQuery
          Half-Star Rating Plugin

          搜索插件

          Autocomplete Box
          jQuery Suggest
          jQuery Autocomplete
          jQuery Autocomplete Mod
          jQuery Autocomplete by AjaxDaddy
          jQuery Autocomplete Plugin with HTML formatting
          jQuery Autocompleter
          AutoCompleter (Tutorial with PHP&MySQL)
          quick Search jQuery Plugin

          編輯器

          jTagEditor
          WYMeditor
          jQuery jFrame
          Jeditable - edit in place plugin for jQuery
          jQuery editable
          jQuery Disable Text Select Plugin
          Edit in Place with Ajax using jQuery
          jQuery Plugin - Another In-Place Editor
          TableEditor
          tEditable - in place table editing for jQuery

          聲音,視頻,Flash, SVG等

          jMedia - accessible multi-media embedding
          JBEdit - Ajax online Video Editor
          jQuery MP3 Plugin
          jQuery Media Plugin
          jQuery Flash Plugin
          Embed QuickTime
          SVG Integration
          jQuery Multimedia Portfolio
          jQuery YouTube Plugin

          圖片

          ThickBox
          jQuery lightBox plugin
          jQuery FancyBox
          jQuery Multimedia Portfolio
          jQuery Image Strip
          jQuery slideViewer
          jQuery jqGalScroll 2.0
          jQuery - jqGalViewII
          jQuery - jqGalViewIII
          jQuery Photo Slider
          jQuery Thumbs - easily create thumbnails
          jQuery jQIR Image Replacement
          jCarousel Lite
          jQPanView
          jCarousel
          Interface Imagebox
          Image Gallery using jQuery, Interface & Reflactions
          simple jQuery Gallery
          jQuery Gallery Module
          EO Gallery
          jQuery ScrollShow
          jQuery Cycle Plugin
          jQuery Flickr
          jQuery Lazy Load Images Plugin
          Zoomi - Zoomable Thumbnails
          jQuery Crop - crop any image on the fly
          Image Reflection

          Google Map

          jQuery Plugin googlemaps
          jMaps jQuery Maps Framework
          jQmaps
          jQuery & Google Maps
          jQuery Maps Interface forr Google and Yahoo maps
          jQuery J Maps - by Tane Piper

          游戲

          Tetris with jQuery
          jQuery Chess
          Mad Libs Word Game
          jQuery Puzzle
          jQuery Solar System (not a game but awesome jQuery Stuff)
          jQuery Memory

          表格

          UI/Tablesorter
          jQuery ingrid
          jQuery Grid Plugin
          Table Filter - awesome!
          TableEditor
          jQuery Tree Tables
          Expandable “Detail” Table Rows
          Sortable Table ColdFusion Costum Tag with jQuery UI
          jQuery Bubble
          TableSorter
          Scrollable HTML Table
          jQuery column Manager Plugin
          jQuery tableHover Plugin
          jQuery columnHover Plugin
          jQuery Grid
          TableSorter plugin for jQuery
          tEditable - in place table editing for jQuery
          jQuery charToTable Plugin
          jQuery Grid Column Sizing
          jQuery Grid Row Sizing

          圖表

          Flot
          jQuery Wizard Plugin
          jQuery Chart Plugin
          Bar Chart
          Accessible Charts using Canvas and jQuery

          邊框,圓角,背景

          jQuery Corner
          jQuery Curvy Corner
          Nifty jQuery Corner
          Transparent Corners
          jQuery Corner Gallery
          Gradient Plugin

          文本和鏈接

          jQuery Spoiler plugin
          Text Highlighting
          Disable Text Select Plugin
          jQuery Newsticker
          Auto line-height Plugin
          Textgrad - a text gradient plugin
          LinkLook - a link thumbnail preview
          pager jQuery Plugin
          shortKeys jQuery Plugin
          jQuery Biggerlink
          jQuery Ajax Link Checker
          Chili jQuery code highlighter plugin
          jScroller

          鼠標提示

          jQuery Plugin - Tooltip
          jTip - The jQuery Tool Tip
          clueTip
          BetterTip
          Flash Tooltips using jQuery
          ToolTip

          菜單,導航欄

          jQuery Tabs Plugin - awesome! [demo nested tabs ]
          another jQuery nested Tab Set example (based on jQuery Tabs Plugin)
          jQuery idTabs
          jdMenu - Hierarchical Menu Plugin for jQuery
          jQuery SuckerFish Style
          jQuery Plugin Treeview
          treeView Basic
          FastFind Menu
          Sliding Menu
          Lava Lamp jQuery Menu
          jQuery iconDock
          jVariations Control Panel
          ContextMenu plugin
          clickMenu
          CSS Dock Menu
          jQuery Pop-up Menu Tutorial
          Sliding Menu

          手風琴,幻燈片等效果

          jQuery Plugin Accordion
          jQuery Accordion Plugin Horizontal Way
          haccordion - a simple horizontal accordion plugin for jQuery
          Horizontal Accordion by portalzine.de
          HoverAccordion
          Accordion Example from fmarcia.info
          jQuery Accordion Example
          jQuery Demo - Expandable Sidebar Menu
          Sliding Panels for jQuery
          jQuery ToggleElements
          Coda Slider
          jCarousel
          Accesible News Slider Plugin
          Showing and Hiding code Examples
          jQuery Easing Plugin
          jQuery Portlets
          AutoScroll
          Innerfade
          CodaSlider

          拖拽

          UI/Draggables
          EasyDrag jQuery Plugin
          jQuery Portlets
          jqDnR - drag, drop resize
          Drag Demos

          XML XSL JSON Feeds

          XSLT Plugin
          jQuery Ajax call and result XML parsing
          xmlObjectifier - Converts XML DOM to JSON
          jQuery XSL Transform
          jQuery Taconite - multiple Dom updates
          RSS/ATOM Feed Parser Plugin
          jQuery Google Feed Plugin

          瀏覽器

          Wresize - IE Resize event Fix Plugin
          jQuery ifixpng
          jQuery pngFix
          Link Scrubber - removes the dotted line onfocus from links
          jQuery Perciformes - the entire suckerfish familly under one roof
          Background Iframe
          QinIE - for proper display of Q tags in IE
          jQuery Accessibility Plugin
          jQuery MouseWheel Plugin

          對話框,確認窗口

          jQuery Impromptu
          jQuery Confirm Plugin
          jqModal
          SimpleModal

          CSS

          jQuery Style Switcher
          JSS - Javascript StyleSheets
          jQuery Rule - creation/manipulation of CSS Rules
          jPrintArea

          DOM, Ajax 和其他插件

          FlyDOM
          jQuery Dimenion Plugin
          jQuery Loggin
          Metadata - extract metadata from classes, attributes, elements
          Super-tiny Client-Side Include Javascript jQuery Plugin
          Undo Made Easy with Ajax
          JHeartbeat - periodically poll the server
          Lazy Load Plugin
          Live Query
          jQuery Timers
          jQuery Share it - display social bookmarking icons
          jQuery serverCookieJar
          jQuery autoSave
          jQuery Puffer
          jQuery iFrame Plugin
          Cookie Plugin for jQuery
          jQuery Spy - awesome plugin
          Effect Delay Trick
          jQuick - a quick tag creator for jQuery
          Metaobjects

          elementReady

          posted @ 2009-11-15 15:21 笑口常開、財源滾滾來! 閱讀(450) | 評論 (0)編輯 收藏
           

          starterkit.html

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
          <title>jQuery Starterkit</title>

          <link rel="stylesheet" type="text/css" media="screen" href="style.css" />
          <script type="text/javascript" src="http://www.css88.com/jquery-1.3.2/jquery-1.3.2.min.js"></script>
          <script src="jquery.js" type="text/javascript"></script>
          <script src="custom.js" type="text/javascript"></script>
          <script src="jquery.tablesorter.js" type="text/javascript"></script>
          <script src="jquery-latest.js" type="text/javascript"></script>
          <script src="jquery.tablesorter.min.js" type="text/javascript"></script>
          <script src="jquery.metadata.js" type="text/javascript"></script>
          </head>
          <body>

          <!-- tablecode taken from tablesorter examples -->

          <table class="tablesorter " cellspacing=1>
          <thead>

           <tr>
            <th class="{sorter:'text'}">Email</th>
            <th>Id</th>
            <th>Phone</th>
            <th>Total</th>
            <th>Ip</th>

            <th class="{sorter:'procent'}">Url</th>
            <th>Time</th>
            <th>ISO Date</th>
            <th>UK Date</th>
           </tr>
          </thead> 
          <tbody>
           <tr>

            
           </tr>
            
           <tr>
            <td>henry@mountdev.net</td>

            <td>35889</td>
            <td>941-964-9543</td>
            <td>$2776.09</td>
            <td>119.232.182.142</td>
            <td>http://www.gmail.com</td>
            <td>3:54</td>

            <td>1974/1/19</td>
            <td>19/1/1974</td>
           </tr>
            
           <tr>
            <td>christian@reno.gov</td>
            <td>60021</td>

            <td>941-964-5617</td>

            <td>$2743.41</td>
            <td>167.209.64.181</td>
            <td>http://www.dotnet.ca</td>
            <td>10:58</td>
            <td>2000/3/25</td>

            <td>25/3/2000</td>

           </tr>
            
           <tr>
            <td>muffins@donuts.com</td>
            <td>17927</td>
            <td>941-964-9511</td>

            <td>$2998.18</td>
            <td>210.214.231.182</td>

            <td>http://google.se</td>
            <td>21:22</td>
            <td>1993/1/24</td>
            <td>24/1/1993</td>

           </tr>
            
           <tr>
            <td>muffins@reno.gov</td>

            <td>76375</td>
            <td>941-964-2757</td>
            <td>$1836.09</td>

            <td>220.222.93.171</td>
            <td>http://www.samba.org</td>
            <td>15:22</td>

            <td>1988/4/4</td>
            <td>4/4/1988</td>
           </tr>   
            <tr>
            <td>found@flexomat.com</td>

            <td>20953</td>
            <td>941-964-5544</td>
            <td>$575.42</td>
            <td>247.246.235.138</td>
            <td>http://gmail.com</td>
            <td>3:12</td>

            <td>1978/6/10</td>
            <td>10/6/1978</td>
           </tr>   

             
           <tr>
            <td>foo@reno.gov</td>
            <td>03603</td>
            <td>941-964-8942</td>

            <td>$1677.07</td>
            <td>176.96.162.192</td>

            <td>http://www.flexomat.com</td>
            <td>19:11</td>
            <td>1980/7/31</td>
            <td>31/7/1980</td>

           </tr>
            
           <tr>
            <td>found@flexomat.com</td>

            <td>84939</td>
            <td>941-964-7004</td>
            <td>$3916.83</td>

            <td>240.145.198.78</td>
            <td>http://www.fish.org</td>
            <td>1:29</td>

            <td>1980/8/26</td>
            <td>26/8/1980</td>
           </tr>
           
           <tr>
            <td>muffins@reno.gov</td>
            <td>95926</td>
            <td>941-964-147</td>

            <td>$3897.91</td>
            <td>105.85.121.209</td>

            <td>http://www.flexomat.com</td>
            <td>9:50</td>
            <td>2003/4/1</td>
            <td>1/4/2003</td>

           </tr>
             
              </tbody>
          </table>

           

          </body>
          </html>


          custom.js


          jQuery(document).ready(function() {
           $.tablesorter.defaults.widgets=['zebra'];
           $.tablesorter.defaults.sortList=[[0,0]];
           $("table").tablesorter();
          });

          posted @ 2009-10-10 17:07 笑口常開、財源滾滾來! 閱讀(825) | 評論 (0)編輯 收藏
           
          starterkit.html

          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
          <title>jQuery Starterkit</title>

          <link rel="stylesheet" type="text/css" media="screen" href="screen.css" />
          <script type="text/javascript" src="http://www.css88.com/jquery-1.3.2/jquery-1.3.2.min.js"></script>
          <script src="jquery.js" type="text/javascript"></script>
          <script src="custom.js" type="text/javascript"></script>
          <script src="jquery.tablesorter.js" type="text/javascript"></script>
          <script src="jquery-latest.js" type="text/javascript"></script>
          <script src="jquery.tablesorter.min.js" type="text/javascript"></script>
          <script src="jquery.metadata.js" type="text/javascript"></script>
          </head>


          <body>

          <table id="large" cellspacing="0">
          <thead>

           <tr>
            <th>Email</th>
            <th>Id</th>
            <th>Phone</th>
            <th>Total</th>
            <th>Ip</th>

            <th>Url</th>
            <th>Time</th>
            <th>ISO Date</th>
            <th>UK Date</th>
           </tr>
          </thead> 
          <tbody>
           <tr>

            <td>devo@flexomat.com</td>
            <td>66672</td>
            <td>941-964-8535</td>
            <td>$2482.79</td>
            <td>172.78.200.124</td>

            <td>http://gmail.com</td>

            <td>15:10</td>
            <td>1988/12/14</td>
            <td>14/12/1988</td>
           </tr>
            
           <tr>
            <td>henry@mountdev.net</td>

            <td>35889</td>
            <td>941-964-9543</td>
            <td>$2776.09</td>
            <td>119.232.182.142</td>
            <td>http://www.gmail.com</td>
            <td>3:54</td>

            <td>1974/1/19</td>
            <td>19/1/1974</td>
           </tr>
            
           <tr>
            <td>christian@reno.gov</td>
            <td>60021</td>

            <td>941-964-5617</td>

            <td>$2743.41</td>
            <td>167.209.64.181</td>
            <td>http://www.dotnet.ca</td>
            <td>10:58</td>
            <td>2000/3/25</td>

            <td>25/3/2000</td>

           </tr>
            
           <tr>
            <td>muffins@donuts.com</td>
            <td>17927</td>
            <td>941-964-9511</td>

            <td>$2998.18</td>
            <td>210.214.231.182</td>

            <td>http://google.se</td>
            <td>21:22</td>
            <td>1993/1/24</td>
            <td>24/1/1993</td>

           </tr>
            
           <tr>
            <td>muffins@reno.gov</td>

            <td>76375</td>
            <td>941-964-2757</td>
            <td>$1836.09</td>

            <td>220.222.93.171</td>
            <td>http://www.samba.org</td>
            <td>15:22</td>

            <td>1988/4/4</td>
            <td>4/4/1988</td>
           </tr>

            
           <tr>
            <td>mendez@gmail.com</td>
            <td>45834</td>
            <td>941-964-2575</td>

            <td>$2805.46</td>
            <td>228.170.245.253</td>

            <td>http://flexomat.com</td>
            <td>11:31</td>
            <td>1975/12/12</td>
            <td>12/12/1975</td>

           </tr>
            
           <tr>

            <td>dev@gmail.com</td>
            <td>20022</td>
            <td>941-964-4967</td>
            <td>$3296.54</td>
            <td>175.248.70.240</td>

            <td>http://www.flexomat.com</td>

            <td>4:27</td>
            <td>2002/7/3</td>
            <td>3/7/2002</td>
           </tr>
            
           <tr>
            <td>foo@polyester.se</td>

            <td>55977</td>
            <td>941-964-745</td>
            <td>$2953.73</td>
            <td>222.114.227.156</td>
            <td>http://www.donuts.com</td>
            <td>23:49</td>

            <td>1977/8/4</td>
            <td>4/8/1977</td>
           </tr>
            
           <tr>
            <td>adam@aftonbladet.se</td>
            <td>38867</td>

            <td>941-964-6302</td>

            <td>$1949.27</td>
            <td>116.241.143.196</td>
            <td>http://flexomat.com</td>
            <td>23:35</td>
            <td>1995/7/27</td>

            <td>27/7/1995</td>

           </tr>
            
           <tr>
            <td>devo@donuts.com</td>
            <td>51426</td>
            <td>941-964-1234</td>

            <td>$1067.00</td>
            <td>88.96.149.82</td>

            <td>http://www.polyester.se</td>
            <td>15:17</td>
            <td>1986/1/5</td>
            <td>5/1/1986</td>

           </tr>
            
           <tr>
            <td>henry@samba.org</td>

            <td>40859</td>
            <td>941-964-4856</td>
            <td>$3401.19</td>

            <td>68.152.250.74</td>
            <td>http://www.flexomat.com</td>
            <td>4:36</td>

            <td>1990/3/7</td>
            <td>7/3/1990</td>
           </tr>

            
           <tr>
            <td>found@dotnet.ca</td>
            <td>23986</td>
            <td>941-964-2686</td>

            <td>$1393.52</td>
            <td>98.102.181.138</td>

            <td>http://lostnfound.org</td>
            <td>5:51</td>
            <td>1993/7/22</td>
            <td>22/7/1993</td>

           </tr>
            
           <tr>

            <td>carl@fish.org</td>
            <td>73392</td>
            <td>941-964-5792</td>
            <td>$3876.04</td>
            <td>246.234.182.243</td>

            <td>http://www.google.se</td>

            <td>6:52</td>
            <td>1984/7/14</td>
            <td>14/7/1984</td>
           </tr>
            
           <tr>
            <td>found@mountdev.net</td>

            <td>03519</td>
            <td>941-964-1599</td>
            <td>$1176.48</td>
            <td>104.212.122.177</td>
            <td>http://donuts.com</td>
            <td>18:52</td>

            <td>2000/8/6</td>
            <td>6/8/2000</td>
           </tr>
            
           <tr>
            <td>lost@fish.org</td>
            <td>36628</td>

            <td>941-964-5975</td>

            <td>$822.23</td>
            <td>153.63.68.208</td>
            <td>http://www.gmail.com</td>
            <td>7:53</td>
            <td>1994/7/14</td>

            <td>14/7/1994</td>

           </tr>
            
           <tr>
            <td>mendez@dotnet.ca</td>
            <td>90442</td>
            <td>941-964-1649</td>

            <td>$1975.72</td>
            <td>128.161.95.170</td>

            <td>http://reno.gov</td>
            <td>8:35</td>
            <td>1997/10/20</td>
            <td>20/10/1997</td>

           </tr>
            
           <tr>
            <td>carl@donuts.com</td>

            <td>00412</td>
            <td>941-964-6432</td>
            <td>$1834.77</td>

            <td>141.231.126.192</td>
            <td>http://gmail.com</td>
            <td>16:15</td>

            <td>1997/8/23</td>
            <td>23/8/1997</td>
           </tr>

            
           <tr>
            <td>foo@fish.org</td>
            <td>80653</td>
            <td>941-964-1022</td>

            <td>$260.26</td>
            <td>98.102.97.81</td>

            <td>http://samba.org</td>
            <td>8:27</td>
            <td>1991/11/24</td>
            <td>24/11/1991</td>

           </tr>
            
           <tr>

            <td>found@fish.org</td>
            <td>54635</td>
            <td>941-964-6439</td>
            <td>$1442.80</td>
            <td>108.133.231.154</td>

            <td>http://dotnet.ca</td>

            <td>6:47</td>
            <td>1977/7/12</td>
            <td>12/7/1977</td>
           </tr>
            
           <tr>
            <td>found@flexomat.com</td>

            <td>20953</td>
            <td>941-964-5544</td>
            <td>$575.42</td>
            <td>247.246.235.138</td>
            <td>http://gmail.com</td>
            <td>3:12</td>

            <td>1978/6/10</td>
            <td>10/6/1978</td>
           </tr>
            
           <tr>
            <td>lost@aftonbladet.se</td>
            <td>60810</td>

            <td>941-964-8406</td>

            <td>$1054.39</td>
            <td>130.80.125.154</td>
            <td>http://www.samba.org</td>
            <td>15:50</td>
            <td>1978/5/18</td>

            <td>18/5/1978</td>

           </tr>
            
           <tr>
            <td>carl@reno.gov</td>
            <td>22666</td>
            <td>941-964-104</td>

            <td>$373.59</td>
            <td>185.150.127.115</td>

            <td>http://www.lostnfound.org</td>
            <td>10:11</td>
            <td>1971/11/5</td>
            <td>5/11/1971</td>

           </tr>
            
           <tr>
            <td>carl@donuts.com</td>

            <td>82867</td>
            <td>941-964-1031</td>
            <td>$631.03</td>

            <td>62.244.222.152</td>
            <td>http://www.reno.gov</td>
            <td>11:24</td>

            <td>1985/1/22</td>
            <td>22/1/1985</td>
           </tr>

            
           <tr>
            <td>foo@donuts.com</td>
            <td>11268</td>
            <td>941-964-208</td>

            <td>$3730.64</td>
            <td>234.192.138.252</td>

            <td>http://aftonbladet.se</td>
            <td>22:45</td>
            <td>1979/8/4</td>
            <td>4/8/1979</td>

           </tr>
            
           <tr>

            <td>devo@google.se</td>
            <td>17059</td>
            <td>941-964-2903</td>
            <td>$1404.67</td>
            <td>73.189.246.202</td>

            <td>http://www.gmail.com</td>

            <td>22:28</td>
            <td>1983/4/28</td>
            <td>28/4/1983</td>
           </tr>
            
           <tr>
            <td>muffins@flexomat.com</td>

            <td>90584</td>
            <td>941-964-4640</td>
            <td>$3706.01</td>
            <td>243.162.73.115</td>
            <td>http://www.fish.org</td>
            <td>11:12</td>

            <td>1997/4/8</td>
            <td>8/4/1997</td>
           </tr>
            
           <tr>
            <td>foo@samba.org</td>
            <td>82966</td>

            <td>941-964-7245</td>

            <td>$1001.38</td>
            <td>255.182.148.252</td>
            <td>http://www.reno.gov</td>
            <td>8:42</td>
            <td>1995/11/1</td>

            <td>1/11/1995</td>

           </tr>
            
           <tr>
            <td>foo@reno.gov</td>
            <td>03603</td>
            <td>941-964-8942</td>

            <td>$1677.07</td>
            <td>176.96.162.192</td>

            <td>http://www.flexomat.com</td>
            <td>19:11</td>
            <td>1980/7/31</td>
            <td>31/7/1980</td>

           </tr>
            
           <tr>
            <td>found@flexomat.com</td>

            <td>84939</td>
            <td>941-964-7004</td>
            <td>$3916.83</td>

            <td>240.145.198.78</td>
            <td>http://www.fish.org</td>
            <td>1:29</td>

            <td>1980/8/26</td>
            <td>26/8/1980</td>
           </tr>

            
           <tr>
            <td>henry@lostnfound.org</td>
            <td>76453</td>
            <td>941-964-3084</td>

            <td>$3875.88</td>
            <td>235.225.168.168</td>

            <td>http://www.fish.org</td>
            <td>15:31</td>
            <td>2000/10/22</td>
            <td>22/10/2000</td>

           </tr>
            
           <tr>

            <td>sam@aftonbladet.se</td>
            <td>36274</td>
            <td>941-964-7784</td>
            <td>$73.43</td>
            <td>114.190.194.148</td>

            <td>http://www.dn.se</td>

            <td>18:24</td>
            <td>1994/11/11</td>
            <td>11/11/1994</td>
           </tr>
            
           <tr>
            <td>dev@polyester.se</td>

            <td>15971</td>
            <td>941-964-7527</td>
            <td>$1855.18</td>
            <td>179.121.143.189</td>
            <td>http://www.flexomat.com</td>
            <td>10:25</td>

            <td>1984/8/16</td>
            <td>16/8/1984</td>
           </tr>
            
           <tr>
            <td>devo@fish.org</td>
            <td>31734</td>

            <td>941-964-9760</td>

            <td>$3201.35</td>
            <td>213.186.220.205</td>
            <td>http://www.samba.org</td>
            <td>19:37</td>
            <td>1979/3/4</td>

            <td>4/3/1979</td>

           </tr>
            
           <tr>
            <td>devo@reno.gov</td>
            <td>52074</td>
            <td>941-964-2068</td>

            <td>$3035.24</td>
            <td>189.62.225.163</td>

            <td>http://www.dn.se</td>
            <td>21:18</td>
            <td>1998/2/24</td>
            <td>24/2/1998</td>

           </tr>
            
           <tr>
            <td>mendez@fish.org</td>

            <td>87800</td>
            <td>941-964-7933</td>
            <td>$618.59</td>

            <td>254.119.153.91</td>
            <td>http://www.dn.se</td>
            <td>22:34</td>

            <td>1979/5/28</td>
            <td>28/5/1979</td>
           </tr>

            
           <tr>
            <td>muffins@reno.gov</td>
            <td>95926</td>
            <td>941-964-147</td>

            <td>$3897.91</td>
            <td>105.85.121.209</td>

            <td>http://www.flexomat.com</td>
            <td>9:50</td>
            <td>2003/4/1</td>
            <td>1/4/2003</td>

           </tr>
            
           <tr>

            <td>carl@donuts.com</td>
            <td>74513</td>
            <td>941-964-4507</td>
            <td>$2150.68</td>
            <td>106.175.123.125</td>

            <td>http://www.fish.org</td>

            <td>21:42</td>
            <td>1977/4/8</td>
            <td>8/4/1977</td>
           </tr>
            
           <tr>
            <td>sam@fish.org</td>

            <td>82420</td>
            <td>941-964-2134</td>
            <td>$3947.54</td>
            <td>129.78.102.122</td>
            <td>http://mountdev.net</td>
            <td>11:33</td>

            <td>1990/11/26</td>
            <td>26/11/1990</td>
           </tr>
            
           <tr>
            <td>devo@mountdev.net</td>
            <td>81905</td>

            <td>941-964-3535</td>

            <td>$722.17</td>
            <td>229.101.84.111</td>
            <td>http://fish.org</td>
            <td>7:29</td>
            <td>1975/12/28</td>

            <td>28/12/1975</td>

           </tr>
            
           <tr>
            <td>john@lostnfound.org</td>
            <td>93124</td>
            <td>941-964-1508</td>

            <td>$394.82</td>
            <td>61.184.235.77</td>

            <td>http://www.mountdev.net</td>
            <td>14:38</td>
            <td>1979/12/10</td>
            <td>10/12/1979</td>

           </tr>
             </tbody>
          </table>


          </body>


          custom.js

          jQuery(document).ready(function() {
            $("#large").tablesorter( {sortList: [[0,0], [1,0]]} );
          });


          posted @ 2009-10-10 16:02 笑口常開、財源滾滾來! 閱讀(2033) | 評論 (0)編輯 收藏
           
          1.在當前類路徑下新建一個properties文件;
          編寫DBconfig.properties

          driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
          url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=school   
          user=sa   
          password=sa


          2.新建工具類

          package com.itcast.db;

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.util.Properties;

          public class ConnectionUtil {

           public Connection openConnection() {
            String driver = "";
            String url = "";
            String user = "";
            String password = "";
            Properties prop = new Properties();
            Connection conn = null;
            try {
             //加載屬性文件   
             prop.load(this.getClass().getClassLoader().getResourceAsStream(
               "DBConfig.properties"));
             driver = prop.getProperty("driver");
             url = prop.getProperty("url");
             user = prop.getProperty("user");
             password = prop.getProperty("password");
             //Class.forName加載驅動   
             Class.forName(driver);
             //DriverManager獲得連接   
             conn = DriverManager.getConnection(url, user, password);
             return conn;
            } catch (Exception e) {
             e.printStackTrace();
            }
            return null;
           }

          }


          3.業務實現類


          package com.itcast.service.impl;

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.PreparedStatement;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.util.ArrayList;
          import java.util.List;

          import com.itcast.db.ConnectionUtil;
          import com.itcast.db.DBConnection;
          import com.itcast.model.User;
          import com.itcast.service.IUser;

          /**
           * 業務邏輯處理
           *
           * @author Administrator
           *
           */
          public class UserImpl implements IUser {

          // DBConnection db = new DBConnection();

           private PreparedStatement pstm;
           
           /**
            * 添加用戶
            */
           public void  add_User(User user) {
            try{
          //  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
          //  conn= DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=school", "sa", "sa");
             Connection conn = new ConnectionUtil().openConnection();
            pstm=conn.prepareStatement("insert into userTable(user_name , user_password ,user_age,user_sex,user_address,user_telephone) values(?,?,?,?,?,?)");
            pstm.setString(1, user.getUsername());
            pstm.setString(2, user.getPassword());
            pstm.setInt(3, user.getAge());
            pstm.setString(4, user.getSex());
            pstm.setString(5, user.getAddress());
            pstm.setString(6, user.getTelephone());
            pstm.executeUpdate();
            }catch(SQLException e){
             e.printStackTrace();
            }catch(Exception e){
             e.printStackTrace();
            }
          //  String sql="insert into userTable(user_name , user_password ,user_age,user_sex,user_address,user_telephone) values(?,?,?,?,?,?)";
          //  
          //  db.GetConnection();
            

           }

           /**
            * 刪除用戶
            */
           public boolean del_User(int id) {
            boolean result=false;
            try{
             Connection conn = new ConnectionUtil().openConnection();
             pstm=conn.prepareStatement("delete from  userTable where user_id="+id);
             
             pstm.executeUpdate();
             result=true;
             }catch(SQLException e){
              e.printStackTrace();
             }catch(Exception e){
              e.printStackTrace();
             }
             return result;
           }

           /**
            * 查找用戶
            */
           public List<User> find_User() {
           
            Connection conn = new ConnectionUtil().openConnection();
            List<User> list = new ArrayList();
            User user = new User();
            
            String sql = "select * from userTable ";
            try {
             pstm=conn.prepareStatement(sql);
          //   pstm.setInt(1, id);
             ResultSet rs=pstm.executeQuery();
             while (rs.next()) {
              user.setId(rs.getInt(1));
              user.setUsername(rs.getString(2));
              user.setPassword(rs.getString(3));
              user.setAge(rs.getInt(4));
              user.setSex(rs.getString(5));
              user.setAddress(rs.getString(6));
              user.setTelephone(rs.getString(7));
              user.setTime(rs.getDate(8));
          //    System.out.println(rs.getString(7));
              list.add(user);
             }
            } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            return list;
            
            
           }

           /**
            * 按照id查詢用戶信息
            */
           public List find_Users(int id) {
            Connection conn = new ConnectionUtil().openConnection();
            List list = new ArrayList();
            User user = new User();
            
            String sql = "select * from userTable where user_id=?";
            try {
             pstm=conn.prepareStatement(sql);
             pstm.setInt(1, id);
             ResultSet rs=pstm.executeQuery();
             while (rs.next()) {
              user.setId(rs.getInt(1));
              user.setUsername(rs.getString(2));
              user.setPassword(rs.getString(3));
              user.setAge(rs.getInt(4));
              user.setSex(rs.getString(5));
              user.setAddress(rs.getString(6));
              user.setTelephone(rs.getString(7));
              user.setTime(rs.getDate(8));
          //    System.out.println(rs.getString(7));
              list.add(user);
             }
            } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            return list;
           }

           /**
            * 修改用戶信息
            */
           public IUser modify_User() {
            // TODO Auto-generated method stub
            return null;
           }

          }

          posted @ 2009-09-26 14:09 笑口常開、財源滾滾來! 閱讀(741) | 評論 (0)編輯 收藏
           
               摘要: JSTL 入門: 探討 core JSTL 入門: 探討 core 使用定制標記進行流控制和 URL 管理 ...  閱讀全文
          posted @ 2009-09-22 10:50 笑口常開、財源滾滾來! 閱讀(405) | 評論 (0)編輯 收藏
           
          由于采用sql server2000作為數據庫。用java進行jdbc連接時

          出現Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.

          發現原來是少了sp4補丁。

          先下載補丁文件

          SQL2000-KB884525-SP4-x86-CHS.EXE

          之后安裝該文件,默認安裝在c:/下

          進入該文件夾,點擊set up.bat 進行更新。

          最后重新開啟服務。就ok啦!


          posted @ 2009-09-21 16:35 笑口常開、財源滾滾來! 閱讀(225) | 評論 (0)編輯 收藏
           
                      以前用myeclipse連接sql server 2005時,直接用的一個jdbcdriver.jar就ok了。但是目前為了需要
          必須用sql server 2000,所以我才在網上找了找連接驅動。
                     
                   
          SQLServer2000的JDBC驅動
          轉自  
          http://blog.csdn.net/javalf00/archive/2009/06/09/4254478.aspx



          一、下載SQL SERVER2000的jdbc驅動程序。在微軟站點就有這個驅動程序: Window操作系統

          http://download.microsoft.com/download/3/0/f/30ff65d3-a84b-4b8a-a570-27366b2271d8/setup.exe Unix操作系統

          Mssqlserver.tar http://download.microsoft.com/download/3/0/f/30ff65d3-a84b-4b8a-a570-27366b2271d8/mssqlserver.tar

           二、安裝JDBC 執行ms_jdbc_setup.exe可執行文件,一切只需要點擊下一

          步,至到出現finish按鈕,完成安裝。注: (1) ms_JDBC_setup默認安裝路

          徑為:c:\Program Files\Microsoft SQL Server 2000 Driver for JDBC (2)此版

          (Version 2.2.0022)本僅支持Microsoft SQL Server 2000 Driver for JDBC (3)安

          裝目錄\lib\下的三個jar文件即是我們要的JDBC驅動核心 msbase.jar

          mssqlserver.jar msutil.jar

           三、將以上(3)中指的三個jar文件加入到環境變量中去 classpath:
           
          d:\webserver\lib\msbase.jar;d:\webserver\lib\mssqlserver.jar;d:\webserver\lib\msutil.jar
           
          注:也可以省事的將以上三個文件拷貝至你的jvm機所在的

          JAVA_HOME\jre\lib\ext目錄下,不過不建議這么做。 對于web項目,可

          直接將以上三個jar包拷貝到WEB-INF下的lib文件夾下即可。

          四、測試 jsp文件:

          您的第一個字段內容為:

          您的第二個字段內容為:

          五、注意事項 1. 要保證你的Sql服務是啟動狀態 2. 在Sql 的管理器中能夠

          使用sa或其它用戶正常登錄;(有些人在安裝sql時用了nt用戶管理模式,

          這里可能會有一定問題) 3. 第一次配置好環境變量最好能重啟一下電腦

          4. 注意JVM和DataBase的啟動順序:先啟動DataBase,再啟動JVM機。

          注:在停止Web服務器后,再重啟動,中間最好能有10秒以上的間隔。
           
          5. 注意操作系統的網絡連通性 A.啟動了Tcp/IP服務 B.配置了相關IP地址,

          有些人機器可能用的是自動分配IP或有配置IP時,但網絡不通可能也找不

          到IP 6. 有些機器在調試明最好能將(四)中的連接地址localhost改成數據

          庫服務器的IP,這也是要注意5的原因。

           package zmsjdbc;
          import java.sql.*;
          public class sqlserver1 {
          private String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=catv"; //catv是數據庫!loacalhost可以用IP和主機
          private String user="sa";
          private String pwd="";
          public Connection getcon() {
          Connection con;
          try { //加載驅動程序
          Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //創建連接 con=DriverManager.getConnection(url,user,pwd);
          return con;
          } catch(ClassNotFoundException e) {
          System.out.println("加載驅動程序出錯");
          } catch(SQLException e) {
          System.out.println(e.getMessage());
          } catch(Exception e) {
           System.out.println("出現了好大的錯誤");
          }
           return null;
           }
          public ResultSet executeSql(String sqlstr) {
          Connection conn; Statement stmt;
           try { conn=getcon();
          stmt=conn.createStatement();
          ResultSet rs=stmt.executeQuery(sqlstr);
          return rs;
          } catch(SQLException e) {
          System.out.print("獲取數據集時出現錯誤");
           }
          return null;
          }
           public static void main(String[] args) {
          ResultSet rs1;
          sqlserver1 sql1=new sqlserver1();
           rs1=sql1.executeSql("select ui_id,ui_name from userinfo");
           try {
          while(rs1.next()) {
          System.out.println(rs1.getString("ui_id")+" 姓名:"+rs1.getString("ui_name"));
           
               }
          } catch(Exception e)
          {
          System.out.println(e.getMessage());
          }
          } } /*

          1、對于SQLSERVER 必須下載 SQLSERVER驅動 http://download.microsoft.com/download/3/0/f/30ff65d3-a84b-4b8a-a570-27366b2271d8/setup.exe 然后把 msbase.jar mssqlserver.jar msutil.jar 復制到 D:\JBuilder9\jdk1.4\jre\lib\ext,或者放在web項目的WEB-INF/lib下。

          2:如果出現錯誤: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket. 說明 SQLERVER 端口號 不對 》》》更改端口號:SQLSERVER->屬性-常規-網絡配置-常規-TCP/IP-屬性--更改端口號有個命令可以用: cmd-> netstat -a 例如:String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=zmstv"; 說明你使用的是1433 在CMD 下 輸入 netstat -a -n 應該看不到:TCP 127.0.0.1:1433 0.0.0.0:0 LISTENING 如果安裝 sqlserver 2000 出現 報錯 "以前的某個程序安裝已在安裝計算機上創建掛起的文件操作。。。。" 打開注冊表編輯器,在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations項目,并刪除它。這樣就可以清除安裝暫掛項目。

           

           


          posted @ 2009-09-21 12:08 笑口常開、財源滾滾來! 閱讀(11424) | 評論 (0)編輯 收藏
           

          在J2ME程序開發過程中,為了一定的需要,經常需要來獲得用戶的手機號碼,但是這個功能卻在標準的J2ME類庫中沒有提供。

          在使用中國移動的CMWAP方式連接網絡時,中國移動會將用戶的手機號碼放在一個名稱為x-up-calling-line-id的頭信息中,可以通過讀取該頭信息,獲得用戶的手機號碼,具體代碼如下:

          String usermphone = http.getHeader("x-up-calling-line-id");

          偽手機號,用戶在移動夢網的ID:

          String usermphone = http.getHeader("MISC_MID");

          其中http是HttpConnction類型的對象。 

          [color=Green]注意:必須要是CNWAP聯網才行。 [/color]

          posted @ 2009-09-17 20:42 笑口常開、財源滾滾來! 閱讀(791) | 評論 (2)編輯 收藏
           

          原來獲取用戶手機號碼很簡單,關鍵是通信營運商給不給你送。如果給你送的話,手機號碼是在Http請求頭里獲取,通常在x-up-calling-line-id項里,如果通過此項得不到的話。可采用循環讀出所有的Http頭里的信息,號碼在哪一個頭里就一目了然了。
          String userPhone = request.getHeader("x-up-calling-line-id");一般通過這句就能獲取到手機號碼。
          如果號碼不在上面這條請求頭里,采用下面方法讀取看號碼在哪一條請求頭里。

          Enumeration headers = request.getHeaderNames() ;
          while(headers.hasMoreElements())
          {
               String head = (String)headers.nextElement();
               out.println(head+":"+request.getHeader(head));
          }
          這樣就可以將所有的信息打印出來,看到號碼的位置了。注意獲取號碼的前提是跟營運商有合作或者跟他們申請。同意給你送,否則程序實現了也沒有用。

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jhjinhua/archive/2008/12/12/3505675.aspx

          posted @ 2009-09-17 20:19 笑口常開、財源滾滾來! 閱讀(5869) | 評論 (6)編輯 收藏
           
          轉載:http://www.host01.com/article/Wap/wap001/05922162843330.htm

          JSP下獲取手機號碼

          //取手機號
          String mobile = "" ;
          String MO="";
          String temvit = "";
          String version = "";

          Enumeration headerNames = request.getHeaderNames();
          while(headerNames.hasMoreElements()) {
          String headerName = (String)headerNames.nextElement();
          if (headerName.equals("x-up-calling-line-id")) {
          temvit=request.getHeader(headerName);
          if (temvit.substring(0,3).trim().equals("861")) {
          mobile=temvit.substring(2,13);
          }
          if (temvit.substring(0,2).trim().equals("13")) {
          mobile=temvit;
          }
          }

          if (headerName.equals("user-agent")) {
          <--ubbcodetab--> <--/ubbcodetab-->MO=request.getHeader(headerName);
          }

          if (headerName.equals("x-up-calling-line-id")) {
          temvit=request.getHeader(headerName);
          if (temvit.substring(0,2).trim().equals("13")) {
          mobile=temvit;
          }
          }
          }
          posted @ 2009-09-17 20:15 笑口常開、財源滾滾來! 閱讀(1313) | 評論 (2)編輯 收藏
           
          轉載:
          http://hi.baidu.com/yashengwh/blog/item/27130edf7ec447156327980b.html


          手機號碼:Request.ServerVariables("HTTP_X_UP_CALLING_LINE_ID")
          手機型號:request.ServerVariables("HTTP_User-Agent")

          補充:
          手機號碼,要看當地的運營商了
          有三種方法獲得(聯通的)
          1.加密的手機號碼:被加密的手機號碼,與手機號碼一一對應。
          中國聯通WAP平臺向CP Server(主域或IP地址)傳送加密手機號碼,CP Server獲取該加密手機號碼的方法為:在每次用戶發送的請求http header中取“deviceid”。
          2.公開的手機號碼:中國聯通WAP平臺向CP Server(主域或IP地址)傳送公開的手機號碼,CP Server獲取該公開手機號碼的方法為:在每次用戶發送的請求http header中取“x-up-calling-line-id”。
          以上要和聯通進行申請

          3、你可以試這樣的方法獲得手機號碼: Mobile = request.ServerVariables("HTTP_X_UP_subno")
          Mobile =mid(FromMobile,3,11) ??
          asp?lp=27&id=1782582>http://www.blueidea.com/bbs/NewsDetail.asp?lp=27&id=1782582
          聲明:第三種方法不保險

          頭文件參考:
          答7:
          POST /default.asp HTTP/1.0
          Host: 211.94.121.3:81
          content-type: text/plain
          accept-language: zh
          accept-charset: ISO-8859-1, UTF-8; Q=0.8, ISO-10646-UCS-2; Q=0.6
          profile:
          http://nds.nokia.com/uaprof/N7210r100.xml
          user-agent: Nokia7210/1.0 (3.09) Profile/MIDP-1.0 Configuration/CLDC-1.0
          x-wap.tod-coded: Thu, 01 Jan 1970 00:00:00 GMT
          accept: */*
          content-length: 1
          Cookie: ASPSESSIONIDGGGQGAPU=KFHHMHPCHJFPKPEPBEDFHCJL
          via: WTP/1.1 wapgw2 (Nokia WAP Gateway 3.1/CD1/3.1.43), HTTP/1.1 httpproxy2[0A0000C3] (Traffic-Server/4.0.9 [uSc ])
          X-Network-info: GPRS,10.15.96.127,13810027XXX,211.139.172.70,unsecured
          X-Forwarded-For: 10.15.96.127
          X-Up-Calling-Line-ID: 13810027XXX
          X-Source-ID: 211.139.172.70
          X-Nokia-CONNECTION_MODE: CLESS
          X-Nokia-BEARER: GPRS
          X-Nokia-gateway-id: NAWG/3.1/Build43
          Client-ip: 192.168.0.6
          Connection: keep-alive

          posted @ 2009-09-17 19:51 笑口常開、財源滾滾來! 閱讀(1628) | 評論 (0)編輯 收藏
           

          package cn.itcast.bean;

          public class Person {

           private Integer id;
           private String name;
           
           public Person(){
            
           }
           
           public Person(String name) {
            this.name=name;
           }
           
             getter&&setter方法 
          }


          Person.hbm.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC
                  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping package="cn.itcast.bean">
           <class name="Person" table="person">
           
            <id name="id" type="integer">
             <generator class="native"></generator>
            </id>
            <property name="name" length="10" not-null="true">
            </property>
           </class>

          </hibernate-mapping>

          定義業務接口

          package cn.itcast.service;

          import java.util.List;

          import cn.itcast.bean.Person;

          public interface IPersonService {

           /**
            * 保存人員信息
            * @param person
            */
           public abstract void save(Person person);

           /**
            * 更新信息
            * @param person
            */
           public abstract void update(Person person);

           /**
            * 獲取人員
            * @param personId
            * @return
            */
           public abstract Person getPerson(Integer personId);

           /**
            * 刪除人員信息
            * @param personId
            */
           public abstract void delete(Integer personId);

           /**
            * 獲取人員列表
            * @return
            */
           public abstract List<Person> getPersons();

          }


          業務實現類

          package cn.itcast.service.impl;

          import java.util.List;

          import javax.annotation.Resource;

          import org.hibernate.SessionFactory;
          import org.springframework.transaction.annotation.Propagation;
          import org.springframework.transaction.annotation.Transactional;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;

          /**
           * 業務層,采用注解聲明事務
           *
           * @author Administrator
           *
           */
          @Transactional
          public class PersonServiceBean implements IPersonService {

           @Resource
           private SessionFactory sessionFactory;

           public void save(Person person) {

            // 從spring 容器中得到正在管理的sessionFactory,persist方法用于保存實體

            sessionFactory.getCurrentSession().persist(person);

           }

           public void update(Person person) {
            sessionFactory.getCurrentSession().merge(person);
           }
          @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
           public Person getPerson(Integer personId) {
            return (Person) sessionFactory.getCurrentSession().get(Person.class,
              personId);
           }

           public void delete(Integer personId) {
            sessionFactory.getCurrentSession()
              .delete(
                sessionFactory.getCurrentSession().load(Person.class,
                  personId));
           }
           @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
           @SuppressWarnings("unchecked")
           public List<Person> getPersons() {
            return sessionFactory.getCurrentSession().createQuery("from Person")
              .list();
           }

          }


          hibernate && spring的配置文件
          beans.xml

          <?xml version="1.0" encoding="UTF-8"?>

          <!--
           - Application context definition for JPetStore's business layer.
           - Contains bean references to the transaction manager and to the DAOs in
           - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
          -->
          <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

           <context:annotation-config />
           <!-- 配置數據源 -->
           <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName"
             value="org.gjt.mm.mysql.Driver" />
            <property name="url"
             value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8" />
            <property name="username" value="root" />
            <property name="password" value="" />
            <!-- 連接池啟動時的初始值 -->
            <property name="initialSize" value="1" />
            <!-- 連接池的最大值 -->
            <property name="maxActive" value="500" />
            <!-- 最大空閑值.當經過一個高峰時間后,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
            <property name="maxIdle" value="2" />
            <!--  最小空閑值.當空閑的連接數少于閥值時,連接池就會預申請去一些連接,以免洪峰來時來不及申請 -->
            <property name="minIdle" value="1" />
           </bean>

           <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" /><!-- 將datasource注入到sessionFactory -->
            <property name="mappingResources">
             <list>
              <value>cn/itcast/bean/Person.hbm.xml</value>
             </list>
            </property>
            <property name="hibernateProperties">
             <value>
              hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
              hibernate.hbm2ddl.auto=update hibernate.show_sql=false
              hibernate.format_sql=false
             </value>
            </property>
           </bean>

           <!--  通過事務管理 管理sessionFactory -->
           <bean id="txManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">

            <property name="sessionFactory" ref="sessionFactory" />
           </bean>

           <tx:annotation-driven transaction-manager="txManager" />
           <bean id="personServiceBean"
            class="cn.itcast.service.impl.PersonServiceBean">
           </bean>
          </beans>



          /**
          測試類**/

          package junit;


          import java.util.List;

          import org.junit.BeforeClass;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;

          public class IPersonServiceTest {

           private static IPersonService ipersonservice;
           @BeforeClass
           public static void setUpBeforeClass() throws Exception {
            try {
             ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
             ipersonservice=(IPersonService)ctx.getBean("personServiceBean");
            } catch (RuntimeException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
           }
           
           @Test
           public void TestSave(){
            
            ipersonservice.save(new Person("小張"));
            System.out.println("保存成功");
           }

           @Test public void testGetPerson(){
            Person person=ipersonservice.getPerson(1);
            System.out.println(person.getName());
           }
           
           @Test public void testUpdate(){
            Person person=ipersonservice.getPerson(1);
            person.setName("小麗");
            ipersonservice.update(person);
           }
           
           @Test public void testGetPersons(){
            List<Person> persons=ipersonservice.getPersons();
            for(Person person : persons){
             System.out.println(person.getId()+"  :" +person.getName());
            }
           }
           
           @Test public void testDelete(){
            ipersonservice.delete(1);
           }
          }

          table :person
          id  int
          name varchar

          posted @ 2009-09-13 16:38 笑口常開、財源滾滾來! 閱讀(443) | 評論 (0)編輯 收藏
           
          接口

          package cn.itcast.service;

          import java.util.List;

          import cn.itcast.bean.Person;

          public interface IPersonService {

           public void save(Person person);
           
           public void update(Person person);
           
           public void delete(int personId);
           
           public Person getPerson(int personId);
           
           public List<Person> getPersons();
          }

          實現類:

          package cn.itcast.service.impl;

          import java.util.List;

          import javax.annotation.Resource;
          import javax.sql.DataSource;

          import org.springframework.jdbc.core.JdbcTemplate;
          import org.springframework.jdbc.core.RowMapper;
          import org.springframework.stereotype.Service;
          import org.springframework.transaction.annotation.Transactional;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;


          @Transactional
          public class PersonServiceImpl implements IPersonService {

           private JdbcTemplate jdbcTemplete;

           // private DataSource datasource;
          @Resource
           public void setDatasource(DataSource datasource) {
            this.jdbcTemplete = new JdbcTemplate(datasource);
           }

           public void delete(int personId) {
            this.jdbcTemplete
              .update("delete from  person where id=?",
                new Object[] { personId },
                new int[] { java.sql.Types.INTEGER });

           }

           public Person getPerson(int personId) {
            return (Person) this.jdbcTemplete.queryForObject(
              "select * from person where id=?", new Object[] { personId },
              new int[] { java.sql.Types.INTEGER }, new PersonRowMapper());

           }

           @SuppressWarnings("unchecked")
           public List<Person> getPersons() {

            return (List<Person>) this.jdbcTemplete.query("select * from person",
              new PersonRowMapper());

           }

           public void save(Person person) {
            System.out.println(person.getName());

            this.jdbcTemplete.update("insert into person(name) values(?)",
              new Object[] { person.getName() },
              new int[] { java.sql.Types.VARCHAR });

           }

           public void update(Person person) {
            this.jdbcTemplete.update("update person set name=? where id=?",
              new Object[] { person.getName(), person.getId() }, new int[] {
                java.sql.Types.VARCHAR, java.sql.Types.INTEGER });

           }

          }


          實體類:

          package cn.itcast.bean;

          public class Person {

           private int id;
           
           private String name;

           public Person() {
            
           }

           public Person(String name) {
           
            this.name = name;
           }

           public int getId() {
            return id;
           }

           public void setId(int id) {
            this.id = id;
           }

           public String getName() {
            return name;
           }

           public void setName(String name) {
            this.name = name;
           }
          }



          package cn.itcast.service.impl;

          import java.sql.ResultSet;
          import java.sql.SQLException;

          import org.springframework.jdbc.core.RowMapper;

          import cn.itcast.bean.Person;

          public class PersonRowMapper implements RowMapper {

           public Object mapRow(ResultSet rs, int index) throws SQLException {
            cn.itcast.bean.Person person=new Person(rs.getString("name"));
            person.setId(rs.getInt("id"));
            
            return person;
           }

          }


          配置文件:

          <?xml version="1.0" encoding="UTF-8"?>

          <!--
           - Application context definition for JPetStore's business layer.
           - Contains bean references to the transaction manager and to the DAOs in
           - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
          -->
          <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
           <aop:aspectj-autoproxy proxy-target-class="true"/>

           
           <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value=""/>
            <!-- 連接池啟動時的初始值 -->
            <property name="initialSize" value="1"/>
            <!-- 連接池的最大值 -->
            <property name="maxActive" value="500"/>
            <!-- 最大空閑值.當經過一個高峰時間后,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
            <property name="maxIdle" value="2"/>
            <!--  最小空閑值.當空閑的連接數少于閥值時,連接池就會預申請去一些連接,以免洪峰來時來不及申請 -->
            <property name="minIdle" value="1"/>
           </bean>


           <bean id="txManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
           </bean>

           <tx:annotation-driven transaction-manager="txManager" />


           <bean id="personServiceImpl"
            class="cn.itcast.service.impl.PersonServiceImpl">
            <property name="datasource" ref="dataSource" />
           </bean>

          </beans>

          測試類:

          package junit.test;


          import java.util.List;

          import org.junit.BeforeClass;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;

          public class TestSpringAndJdbc {

           public static IPersonService iPersonService;
           @BeforeClass
           public static void setUpBeforeClass() throws Exception {
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            iPersonService=(IPersonService)ctx.getBean("personServiceImpl");
           }
           @Test
           public void TestSave(){
            for(int i=1;i<5;i++){
             iPersonService.save(new Person("傳智博客"+i));
            }
            
           }
           @Test
           public void TestFindPerson(){
            
            iPersonService.getPerson(1);
            System.out.println(iPersonService.getPerson(1).getName());
           }
           
           @Test
           public void TestUpdate(){
            Person person=iPersonService.getPerson(1);//通過id取得person對象
            person.setName("張三");//設置名字
            iPersonService.update(person);//更新
           }
           
           @Test
           public void TestDelete(){
            Person person=iPersonService.getPerson(2);
            iPersonService.delete(person.getId());
           }

           @Test
           public void testFindAllPeron(){
            List<Person> list=iPersonService.getPersons();
            for(Person person:list){
             System.out.println(person.getId()+"  "+person.getName());
            }
           }
          }







          posted @ 2009-09-03 16:03 笑口常開、財源滾滾來! 閱讀(242) | 評論 (0)編輯 收藏
           
          Spring提供了兩種切面聲明方式,實際工作中我們可以選用其中一種:
                基于XML配置方式聲明切面。
                基于注解方式聲明切面。
          要進行AOP編程,首先我們要在spring的配置文件中引入aop命名空間:
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:aop="http://www.springframework.org/schema/aop"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
          </beans>


          基于注解方式聲明切面

          @Aspect
          public class LogPrint {
           @Pointcut("execution(* cn.itcast.service..*.*(..))")
           private void anyMethod() {}//聲明一個切入點 
           @Before("anyMethod() && args(userName)")//定義前置通知
           public void doAccessCheck(String userName) {
           } 
           @AfterReturning(pointcut="anyMethod()",returning="revalue")//定義后置通知
           public void doReturnCheck(String revalue) {
           }
           @AfterThrowing(pointcut="anyMethod()", throwing="ex")//定義例外通知
              public void doExceptionAction(Exception ex) {
           }
           @After("anyMethod()")//定義最終通知
           public void doReleaseAction() {
           }
           @Around("anyMethod()")//環繞通知
           public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
            return pjp.proceed();
           }
          }



          基于基于XML配置方式聲明切面


          public class LogPrint {
           public void doAccessCheck() {}定義前置通知
           public void doReturnCheck() {}定義后置通知
              public void doExceptionAction() {}定義例外通知
           public void doReleaseAction() {}定義最終通知
           public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
            return pjp.proceed();環繞通知
           }
          }


          <bean id="orderservice" class="cn.itcast.service.OrderServiceBean"/>
          <bean id="log" class="cn.itcast.service.LogPrint"/>
          <aop:config>
            <aop:aspect id="myaop" ref="log">
             <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/>
             <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
             <aop:after-returning pointcut-ref="mycut" method="doReturnCheck "/>
             <aop:after-throwing pointcut-ref="mycut" method="doExceptionAction"/>
             <aop:after pointcut-ref="mycut" method=“doReleaseAction"/>
             <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
            </aop:aspect>
          </aop:config>
           

          posted @ 2009-09-02 12:14 笑口常開、財源滾滾來! 閱讀(2181) | 評論 (0)編輯 收藏
           
          第一步:加入log4j-1.2.8.jar到lib下。

          第二步:在CLASSPATH下建立log4j.properties。內容如下:

          1 log4j.rootCategory=INFO, stdout , R

          2

          3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

          5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

          6

          7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

          8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

          9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

          10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

          11

          12 log4j.logger.com.neusoft=DEBUG

          13 log4j.logger.com.opensymphony.oscache=ERROR

          14 log4j.logger.net.sf.navigator=ERROR

          15 log4j.logger.org.apache.commons=ERROR

          16 log4j.logger.org.apache.struts=WARN

          17 log4j.logger.org.displaytag=ERROR

          18 log4j.logger.org.springframework=DEBUG

          19 log4j.logger.com.ibatis.db=WARN

          20 log4j.logger.org.apache.velocity=FATAL

          21

          22 log4j.logger.com.canoo.webtest=WARN

          23

          24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

          25 log4j.logger.org.hibernate=DEBUG

          26 log4j.logger.org.logicalcobwebs=WARN

          第三步:相應的修改其中屬性,修改之前就必須知道這些都是干什么的,在第二部分講解。

          第四步:在要輸出日志的類中加入相關語句:

          定義屬性:protected final Log log = LogFactory.getLog(getClass());

          在相應的方法中:

          if (log.isDebugEnabled())

          {

          log.debug(“System …..”);

          }

          二、Log4j說明

          1 log4j.rootCategory=INFO, stdout , R

          此句為將等級為INFO的日志信息輸出到stdout和R這兩個目的地,stdout和R的定義在下面的代碼,可以任意起名。等級可分為OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何信息,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會被顯示,具體講解可參照第三部分定義配置文件中的logger。

          3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          此句為定義名為stdout的輸出端是哪種類型,可以是

          org.apache.log4j.ConsoleAppender(控制臺),

          org.apache.log4j.FileAppender(文件),

          org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

          org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)

          org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

          具體講解可參照第三部分定義配置文件中的Appender。

          4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

          此句為定義名為stdout的輸出端的layout是哪種類型,可以是

          org.apache.log4j.HTMLLayout(以HTML表格形式布局),

          org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

          org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

          org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

          具體講解可參照第三部分定義配置文件中的Layout。

          5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

          如果使用pattern布局就要指定的打印信息的具體格式ConversionPattern,打印參數如下:

          %m 輸出代碼中指定的消息

          %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

          %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

          %c 輸出所屬的類目,通常就是所在類的全名

          %t 輸出產生該日志事件的線程名

          %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

          %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

          %l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。

          [QC]是log信息的開頭,可以為任意字符,一般為項目簡稱。

          輸出的信息

          [TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

          具體講解可參照第三部分定義配置文件中的格式化日志信息。

          7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

          此句與第3行一樣。定義名為R的輸出端的類型為每天產生一個日志文件。

          8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

          此句為定義名為R的輸出端的文件名為D:\Tomcat 5.5\logs\qc.log

          可以自行修改。

          9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

          與第4行相同。

          10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

          與第5行相同。

          12 log4j.logger.com. neusoft =DEBUG

          指定com.neusoft包下的所有類的等級為DEBUG。

          可以把com.neusoft改為自己項目所用的包名。

          13 log4j.logger.com.opensymphony.oscache=ERROR

          14 log4j.logger.net.sf.navigator=ERROR

          這兩句是把這兩個包下出現的錯誤的等級設為ERROR,如果項目中沒有配置EHCache,則不需要這兩句。

          15 log4j.logger.org.apache.commons=ERROR

          16 log4j.logger.org.apache.struts=WARN

          這兩句是struts的包。

          17 log4j.logger.org.displaytag=ERROR

          這句是displaytag的包。(QC問題列表頁面所用)

          18 log4j.logger.org.springframework=DEBUG

          此句為Spring的包。

          24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

          25 log4j.logger.org.hibernate=DEBUG

          此兩句是hibernate的包。

          以上這些包的設置可根據項目的實際情況而自行定制。

          三、log4j詳解

          1、定義配置文件

          Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:

          、配置根Logger

          Logger 負責處理日志記錄的大部分操作。

          其語法為:

          log4j.rootLogger = [ level ] , appenderName, appenderName, …

          其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定 義了INFO級別,只有等于及高于這個級別的才進行處理,則應用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關 閉所有的日志輸出。 appenderName就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。

          、配置日志信息輸出目的地 Appender

          Appender 負責控制日志記錄操作的輸出。

          其語法為:

          log4j.appender.appenderName = fully.qualified.name.of.appender.class

          log4j.appender.appenderName.option1 = value1



          log4j.appender.appenderName.optionN = valueN

          這里的appenderName為在①里定義的,可任意起名。

          其中,Log4j提供的appender有以下幾種:

          org.apache.log4j.ConsoleAppender(控制臺),

          org.apache.log4j.FileAppender(文件),

          org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

          org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),可通過 log4j.appender.R.MaxFileSize=100KB設置文件大小,還可通過 log4j.appender.R.MaxBackupIndex=1設置為保存一個備份文件。

          org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

          例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          定義一個名為stdout的輸出目的地,ConsoleAppender為控制臺。

          、配置日志信息的格式(布局)Layout

          Layout 負責格式化Appender的輸出。

          其語法為:

          log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

          log4j.appender.appenderName.layout.option1 = value1



          log4j.appender.appenderName.layout.optionN = valueN

          其中,Log4j提供的layout有以下幾種:

          org.apache.log4j.HTMLLayout(以HTML表格形式布局),

          org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

          org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

          org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

          2、格式化日志信息

          Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:

          %m 輸出代碼中指定的消息

          %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

          %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

          %c 輸出所屬的類目,通常就是所在類的全名

          %t 輸出產生該日志事件的線程名

          %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

          %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

          %l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。

          3、在代碼中使用Log4j

          我們在需要輸出日志信息的類中做如下的三個工作:

          1、導入所有需的commongs-logging類:

          import org.apache.commons.logging.Log;

          import org.apache.commons.logging.LogFactory;

          2、在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員:

          private final Log log = LogFactory.getLog(getClass());

          LogFactory.getLog()方法的參數使用的是當前類的class。

          3、使用org.apache.commons.logging.Log類的成員方法輸出日志信息:

          if (log.isDebugEnabled())
          {
          log.debug("111");
          }
          if (log.isInfoEnabled())
          {
          log.info("222");
          }
          if (log.isWarnEnabled())
          {
          log.warn("333");
          }
          if (log.isErrorEnabled())
          {
          log.error("444");
          }
          if (log.isFatalEnabled())
          {
          log.fatal("555")
          }
          posted @ 2009-08-29 19:32 笑口常開、財源滾滾來! 閱讀(207) | 評論 (0)編輯 收藏
           
          轉載:http://hi.baidu.com/panqf/blog/item/b0db04874b1ccb2bc65cc313.html

           Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖 1 所示。
          圖 1. Spring 框架的 7 個模塊
          Spring 框架圖示

          組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:

          • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
          • Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
          • Spring AOP: 通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
          • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫 的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
          • Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
          • Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
          • Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

                  Spring 框架的功能可以用在任何 J2EE 服務器中,大多數功能也適用于不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。


          posted @ 2009-08-28 09:53 笑口常開、財源滾滾來! 閱讀(687) | 評論 (0)編輯 收藏
           

          public interface IPersonService {

           public abstract void Save();
           public Set<String> getSets() ;
           public List<String> getLists() ;
           public Properties getProperties() ;
           public Map<String, String> getMaps() ;

          }



          public class PersonServiceBean implements IPersonService {

           private IPersonDao iPersonDao;
           private Set<String> sets=new HashSet<String>();
           private List<String> lists=new ArrayList<String>();
           private Properties properties=new Properties();
           private Map<String,String> maps=new HashMap<String,String>();
           
           public PersonServiceBean(IPersonDao personDao, String name) {
            
            iPersonDao = personDao;
            this.name = name;
           }
           public void Save(){
            System.out.println(name);//輸出name
            iPersonDao.add();
           }

           private String name;
           
           public String getName() {
            return name;
           }

           public void setName(String name) {
            this.name = name;
           }

           public Map<String, String> getMaps() {
            return maps;
           }

           public void setMaps(Map<String, String> maps) {
            this.maps = maps;
           }

           public Properties getProperties() {
            return properties;
           }

           public void setProperties(Properties properties) {
            this.properties = properties;
           }

           public Set<String> getSets() {
            return sets;
           }

           public void setSets(Set<String> sets) {
            this.sets = sets;
           }

           public IPersonDao getIPersonDao() {
            return iPersonDao;
           }

           public void setIPersonDao(IPersonDao personDao) {
            iPersonDao = personDao;
           }

           
           public List<String> getLists() {
            return lists;
           }

           public void setLists(List<String> lists) {
            this.lists = lists;
           }
          }



          測試類:

          public class SpringTest {

           @BeforeClass
           public static void setUpBeforeClass() throws Exception {
           }
           @Test
           public void instanceSpring() {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
              "beans.xml");
            // ItcastClassPathXMLApplicationContext ctx=new
            // ItcastClassPathXMLApplicationContext("beans.xml");
            //  
            IPersonService ipersonService = (IPersonService) ctx
              .getBean("personService");
            //集合對象的遍歷
            System.out.println("===========set==================");
            for (String value : ipersonService.getSets()) {
             
             System.out.println(value);
            }
            // ipersonService.Save();
            // ctx.close();
            // ctx.registerShutdownHook();
            System.out.println("===========List=================");
            for(String value:ipersonService.getLists()){
             
             System.out.println(value);
            }
            
            System.out.println("=========properties===============");
            for(Object value:ipersonService.getProperties().keySet()){
             System.out.println(value);
            }
            System.out.println("================maps==================");
            for(Object value:ipersonService.getMaps().keySet()){
             System.out.println(value);
            }
            //調用PersonServiceBean的sava方法,輸出結果
            ipersonService.Save();
            
           }
          }



          <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
           <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>

            <constructor-arg index="0" ref="personDaoBean"
             type="cn.itcast.dao.IPersonDao" />
            <constructor-arg index="1" type="java.lang.String"
             value="傳智博客">
            </constructor-arg>

            <property name="sets">
             <set>
              <value>set1</value>
              <value>set2</value>
              <value>set3</value>
             </set>
            </property>

            <property name="lists">
             <list>
              <value>list1</value>
              <value>list2</value>
              <value>list3</value>
             </list>
            </property>

            <property name="properties">
             <props>
              <prop key="properties1">property1</prop>
              <prop key="properties2">property2</prop>
              <prop key="properties3">property3</prop>
             </props>
            </property>

            <property name="maps">
             <map>
              <entry key="key1" value="keyFirst"></entry>
              <entry key="key2" value="keySecond"></entry>
              <entry key="key3" value="keyThird"></entry>
             </map>
            </property>
           </bean>
           <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>


           <!--
            <bean id="anotherPersonServiceBean"
            class="cn.itcast.service.impl.AnotherPersonServiceBean" >
            </bean>
           -->
          </beans>


          public class PersonDaoBean implements IPersonDao {
           public void add(){
            System.out.println("這是personDaoBean的Add()方法");
           }
          }



          輸出:


          ===========set==================
          set1
          set2
          set3
          ===========List=================
          list1
          list2
          list3
          =========properties===============
          properties3
          properties2
          properties1
          ================maps==================
          key1
          key2
          key3
          傳智博客
          這是personDaoBean的Add()方法

          posted @ 2009-08-27 18:19 笑口常開、財源滾滾來! 閱讀(1603) | 評論 (3)編輯 收藏
           
          依賴注入的方式:
          第一、通過接口注入
          第二、通過構造函數注入,設置對象參數
          第三、通過setter方法注入。
          后兩者運用居多。


          通過內部bean注入,其缺點是內部bean只能被一個外部bean使用
          如下:
          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao">
                   <bean class="cn.itcast.dao.impl.PersonDaoBean"></bean><!--   內部bean注入 -->
            </property>
            
            </bean>
            也可以換為:通過 ref的方式也是可以的,其優點是通過ref參數,可以被多個bean引用。

          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            
            </bean>
            <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>  


          剖析依賴注入的內部機制:通過基本數據類型的向屬性值類型的轉換



          /**
           * 實現的spring容器
           *
           * @author Administrator
           *
           */
          public class ItcastClassPathXMLApplicationContext {

           private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
           private Map<String, Object> sigletons = new HashMap<String, Object>();

           public ItcastClassPathXMLApplicationContext() {

           }

           public ItcastClassPathXMLApplicationContext(String filename) {
            // System.out.println("構造方法 ");
            this.readXml(filename);// 調用 讀取配置文件 的方法
            this.instanceBeans();// 調用bean的實例化
            this.injectObject();// 注入對象
           }

           /**
            * 為bean對象的屬性注入值
            */
           private void injectObject() {
            for (BeanDefinition beanDefinition : beanDefines) {
             Object bean = sigletons.get(beanDefinition.getId());
             if (bean != null) {
              // 取得屬性描述 ,是一個數組
              try {
               PropertyDescriptor[] ps = Introspector.getBeanInfo(
                 bean.getClass()).getPropertyDescriptors();
               for (PropertyDefinition propertyDefinition : beanDefinition
                 .getPropertys()) {// 取所有屬性
                for (PropertyDescriptor properdesc : ps) {
                 if (propertyDefinition.getName().equals(
                   properdesc.getName())) {
                  Method setter = properdesc.getWriteMethod();// 獲取屬性的setter方法.
                  // private
                  if (setter != null) {
                   Object value=null;
                   if(propertyDefinition.getRef()!=null && !"".equals(propertyDefinition.getRef().trim())){
                    value = sigletons
                      .get(propertyDefinition
                        .getRef());
                    
                   }else{
                    //將配置文件里字符串類型轉換為屬性類型的值
                    value=ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
                    
                   }
                   setter.setAccessible(true);// 設置為可訪問
                   setter.invoke(bean, value);// 把引用對象注入到屬性
                   
                  }
                  break;
                 }
                }
               }
              } catch (Exception e) {
               e.printStackTrace();
              }

             }
            }

           }

           /**
            * 完成bean的實例化
            */
           private void instanceBeans() {
            // System.out.println("bean實例化方法被調用");
            // 利用反射機制把bean實例化
            for (BeanDefinition beanDefinition : beanDefines) {
             try {
              // 判斷BeanDefinition的實例獲得的類名不為null和空串
              if (beanDefinition.getClassName() != null
                && !"".equals(beanDefinition.getClassName().trim()))
               sigletons.put(beanDefinition.getId(), Class.forName(
                 beanDefinition.getClassName()).newInstance());
             } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }

            }

           }

           /**
            * 讀取配置文件信息
            *
            * @param filename
            */
           private void readXml(String filename) {
            // System.out.println("讀取xml文件的方法被調用了");

            SAXReader saxReader = new SAXReader();// 創建讀取器
            Document document = null;
            try {
             URL xmlpath = this.getClass().getClassLoader()
               .getResource(filename);//取得當前xml文件在本地的位置
             
             document = saxReader.read(xmlpath);// 讀取路徑
             Map<String, String> nsMap = new HashMap<String, String>();
             nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空間
             XPath xsub = document.createXPath("http://ns:beans/ns:bean");// 創建beans/bean查詢路徑
             xsub.setNamespaceURIs(nsMap);// 設置命名空間
             List<Element> beans = xsub.selectNodes(document);// 獲取文檔下所有bean節點
             for (Element element : beans) {
              String id = element.attributeValue("id");// 獲取id屬性值
              String clazz = element.attributeValue("class");// 獲取class屬性值
              BeanDefinition beanDefine = new BeanDefinition(id, clazz);
              XPath propertysub = element.createXPath("ns:property");// 船艦查詢路徑

              propertysub.setNamespaceURIs(nsMap);// 設置命名空間
              List<Element> propertys = propertysub.selectNodes(element);// 查找節點
              for (Element property : propertys) {
               String propertyName = property.attributeValue("name");// 取得property的name值
               String propertyref = property.attributeValue("ref");// 取得property的ref值
               String propertyValue = property.attributeValue("value");// 取得property的value值

               PropertyDefinition propertyDefinition = new PropertyDefinition(
                 propertyName, propertyref,propertyValue);
               beanDefine.getPropertys().add(propertyDefinition);// 將屬性對象加入到bean中
              }

              beanDefines.add(beanDefine);
             }
            } catch (Exception e) {
             e.printStackTrace();

            }

           }

           /**
            * 獲取bean 實例
            *
            * @param beanName
            * @return
            */
           public Object getBean(String beanName) {

            
            return this.sigletons.get(beanName);
           }

          }


            

          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            
            <property name="name" value="Itcast"></property>
            <property name="age" value="15"></property>
            </bean>
            <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>  
            


          public class SpringTest {

           @BeforeClass
           public static void setUpBeforeClass() throws Exception {

           }
           @Test
           public void instanceSpring() {
          //  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
          //    "beans.xml");
            ItcastClassPathXMLApplicationContext ctx=new ItcastClassPathXMLApplicationContext("beans.xml");
          //  
            IPersonService ipersonService = (IPersonService)ctx
              .getBean("personService");
            ipersonService.Save();
           // ctx.close();
            // ctx.registerShutdownHook();

           }
          }


          public class PropertyDefinition {
           private String name;
           private String ref;
           private String value;
           public PropertyDefinition(String name, String ref,String value) {
            
            this.name = name;
            this.ref = ref;
            this.value=value;
           }
           public String getName() {
            return name;
           }
           public void setName(String name) {
            this.name = name;
           }
           public String getRef() {
            return ref;
           }
           public void setRef(String ref) {
            this.ref = ref;
          }
          其他略。

          out:
          Itcast
          15
          這是personDaoBean的Add()方法

          posted @ 2009-08-27 15:03 笑口常開、財源滾滾來! 閱讀(238) | 評論 (0)編輯 收藏
           
                   今天花費了半天去寫自定義容器,結果發現還是沒發實現功能,無法輸出,結果不斷的調試、測試。最后終于搞定了。原來是寫代碼的時候把讀取配置文件里方法readxml,里面讀取子屬性里面查找節點,調用查找對象搞錯了。本為propertysub.selectNodes(element),但寫為了xsub.selectNodes(element)誤用為主element里面查找子節點。還有就是在//ns:beans/ns:bean里面把冒號寫成了頓號,真是太不仔細了。

          自定義容器

          /**
           * 實現的spring容器
           *
           * @author Administrator
           *
           */
          public class ItcastClassPathXMLApplicationContext {

           private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
           private Map<String, Object> sigletons = new HashMap<String, Object>();

           public ItcastClassPathXMLApplicationContext() {

           }

           public ItcastClassPathXMLApplicationContext(String filename) {
            // System.out.println("構造方法 ");
            this.readXml(filename);// 調用 讀取配置文件 的方法
            this.instanceBeans();// 調用bean的實例化
            this.injectObject();// 注入對象
           }

           /**
            * 為bean對象的屬性注入值
            */
           private void injectObject() {
            for (BeanDefinition beanDefinition : beanDefines) {
             Object bean = sigletons.get(beanDefinition.getId());
             if (bean != null) {
              // 取得屬性描述 ,是一個數組
              try {
               PropertyDescriptor[] ps = Introspector.getBeanInfo(
                 bean.getClass()).getPropertyDescriptors();
               for (PropertyDefinition propertyDefinition : beanDefinition
                 .getPropertys()) {// 取所有屬性
                for (PropertyDescriptor properdesc : ps) {
                 if (propertyDefinition.getName().equals(
                   properdesc.getName())) {
                  Method setter = properdesc.getWriteMethod();// 獲取屬性的setter方法.
                  // private
                  if (setter != null) {
                   Object value = sigletons
                     .get(propertyDefinition.getRef());
                   setter.setAccessible(true);// 設置為可訪問
                   setter.invoke(bean, value);// 把引用對象注入到屬性
                  }
                  break;
                 }
                }
               }
              } catch (Exception e) {
               e.printStackTrace();
              }

             }
            }

           }

           /**
            * 完成bean的實例化
            */
           private void instanceBeans() {
            // System.out.println("bean實例化方法被調用");
            // 利用反射機制把bean實例化
            for (BeanDefinition beanDefinition : beanDefines) {
             try {
              // 判斷BeanDefinition的實例獲得的類名不為null和空串
              if (beanDefinition.getClassName() != null
                && !"".equals(beanDefinition.getClassName().trim()))
               sigletons.put(beanDefinition.getId(), Class.forName(
                 beanDefinition.getClassName()).newInstance());
             } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }

            }

           }

           /**
            * 讀取配置文件信息
            *
            * @param filename
            */
           private void readXml(String filename) {
            // System.out.println("讀取xml文件的方法被調用了");

            SAXReader saxReader = new SAXReader();// 創建讀取器
            Document document = null;
            try {
             URL xmlpath = this.getClass().getClassLoader()
               .getResource(filename);//取得當前xml文件在本地的位置
             
             document = saxReader.read(xmlpath);// 讀取路徑
             System.out.println(document);
             Map<String, String> nsMap = new HashMap<String, String>();
             nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空間
             XPath xsub = document.createXPath("http://ns:beans/ns:bean");// 創建beans/bean查詢路徑
             xsub.setNamespaceURIs(nsMap);// 設置命名空間
             List<Element> beans = xsub.selectNodes(document);// 獲取文檔下所有bean節點
             System.out.println(beans.size());
             for (Element element : beans) {
              String id = element.attributeValue("id");// 獲取id屬性值
              String clazz = element.attributeValue("class");// 獲取class屬性值
              BeanDefinition beanDefine = new BeanDefinition(id, clazz);
              System.out.println("id=" + id);
              System.out.println("clazz=" + clazz);
              XPath propertysub = element.createXPath("ns:property");// 船艦查詢路徑

              propertysub.setNamespaceURIs(nsMap);// 設置命名空間
              List<Element> propertys = propertysub.selectNodes(element);// 查找節點
              for (Element property : propertys) {
               String propertyName = property.attributeValue("name");// 取得property的name值
               String propertyref = property.attributeValue("ref");// 取得property的ref值

               System.out.println(propertyName + "=  " + propertyref);

               PropertyDefinition propertyDefinition = new PropertyDefinition(
                 propertyName, propertyref);
               beanDefine.getPropertys().add(propertyDefinition);// 將屬性對象加入到bean中
              }

              beanDefines.add(beanDefine);
             }
            } catch (Exception e) {
             e.printStackTrace();

            }

           }

           /**
            * 獲取bean 實例
            *
            * @param beanName
            * @return
            */
           public Object getBean(String beanName) {

            
            return this.sigletons.get(beanName);
           }

          }

           bean.xml配置文件

          <?xml version="1.0" encoding="UTF-8"?>


          <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
            >
           <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            
            </bean>
            <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>  
          </beans>


          自定義屬性類 PropertyDefinition.java

          package junit.test;

          public class PropertyDefinition {
           private String name;
           private String ref;
           public PropertyDefinition(String name, String ref) {
            
            this.name = name;
            this.ref = ref;
           }
            getter&setter method

          }


          測試類:springTest


          package junit.test;

          import org.junit.BeforeClass;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.AbstractApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;
          import org.springframework.context.support.FileSystemXmlApplicationContext;

          import cn.itcast.service.IPersonService;
          import cn.itcast.service.impl.PersonServiceBean;

          public class SpringTest {

           @BeforeClass
           public static void setUpBeforeClass() throws Exception {

           }
           @Test
           public void instanceSpring() {
          //  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
          //    "beans.xml");
            ItcastClassPathXMLApplicationContext ctx=new ItcastClassPathXMLApplicationContext("beans.xml");
            
            IPersonService ipersonService = (IPersonService)ctx
              .getBean("personService");//調用自定義容器的getBean方法
            ipersonService.Save();
          //  ctx.close();
            // ctx.registerShutdownHook();

           }
          }

          自定義bean類:

          package junit.test;

          import java.util.ArrayList;
          import java.util.List;

          public class BeanDefinition {
           
           private String id;
           private String className;
           private List<PropertyDefinition> propertys=new ArrayList<PropertyDefinition>();
           生成getter,setter方法
           }



          package cn.itcast.dao.impl;

          import cn.itcast.dao.IPersonDao;

          public class PersonDaoBean implements IPersonDao {
           public void add(){
            System.out.println("這是personDaoBean的Add()方法");
           }
          }




          package cn.itcast.service;

          public interface IPersonService {

           public abstract void Save();

          }




          package cn.itcast.service.impl;


          import cn.itcast.dao.IPersonDao;
          import cn.itcast.service.IPersonService;
          /**
           * 業務bean
           * @author Administrator
           *
           */
          public class PersonServiceBean implements IPersonService {

           private IPersonDao iPersonDao;
           
           public IPersonDao getIPersonDao() {
            return iPersonDao;
           }

           public void setIPersonDao(IPersonDao personDao) {
            iPersonDao = personDao;
           }

           public void Save(){
            iPersonDao.add();
           }
           
           
          }



          運行測試類
          out:
           這是personDaoBean的Add()方法


          posted @ 2009-08-27 14:46 笑口常開、財源滾滾來! 閱讀(154) | 評論 (0)編輯 收藏
           

          public interface IPersonService {

           public abstract void Save();

          }



          public class PersonDaoBean implements IPersonDao {

           
           public void add(){
            System.out.println("這是personDaoBean的Add()方法");
           }
          }


          public class PersonServiceBean implements IPersonService {

           private IPersonDao iPersonDao;
           
           public IPersonDao getIPersonDao() {
            return iPersonDao;
           }

           public void setIPersonDao(IPersonDao personDao) {
            iPersonDao = personDao;
           }

           public void Save(){
            iPersonDao.add();
           }
           
           
          }




          <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>
           <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            </bean>
            

          public void instanceSpring() {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
              "beans.xml");
            IPersonService ipersonService = (IPersonService) ctx
              .getBean("personService");
            ipersonService.Save();
            ctx.close();
            // ctx.registerShutdownHook();

           }



          輸出:這是personDaoBean的Add()方法
          posted @ 2009-08-26 11:40 笑口常開、財源滾滾來! 閱讀(196) | 評論 (0)編輯 收藏
           

          public class PersonServiceBean implements IPersonService {

           public void init(){
            
            System.out.println("我是初始化函數");
           }
           
           public PersonServiceBean(){
            System.out.println("我是構造函數");
           }
           public void Save(){
            System.out.println("save方法");
           }
           
           public void cleanup(){
            System.out.println("cleanup方法");
           }
          }


          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean"
             init-method="init" destroy-method="cleanup"/>

          @Test public void instanceSpring(){
            ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            IPersonService ipersonService=(IPersonService)ctx.getBean("personService");
           ctx.close();

          posted @ 2009-08-26 10:32 笑口常開、財源滾滾來! 閱讀(185) | 評論 (0)編輯 收藏
           
          Bean的作用域

          .singleton


           在每個Spring IoC容器中一個bean定義只有一個對象實例。默認情況下會在容器啟動時初始化bean,但我們可以指定Bean節點的lazy-init=“true”來延遲初始化bean,這時候,只有第一次獲取bean會才初始化bean。如:
           <bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/>
          如果想對所有bean都應用延遲初始化,可以在根節點beans設置default-lazy-init=“true“,如下:
          <beans default-lazy-init="true“ ...>


          .prototype
           每次從容器獲取bean都是新的對象。
           
          .request
          .session
          .global session

           

          ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean");
            PersionSevice ps2=(PersionSevice)ctx.getBean("persionServiceBean");
            System.out.println(ps==ps2);

           輸出:true

          可見spring容器默認的bean的產生方式是單例

           

           <bean id="persionServiceBean" class="cn.com.xinli.service.impl.PersionServiceBean" scope="prototype"></bean> 

           

          這時候輸出:false ,顯然ps與ps2就不一樣。

          posted @ 2009-08-25 12:06 笑口常開、財源滾滾來! 閱讀(172) | 評論 (0)編輯 收藏
           

          三種實例化bean的方式

           

          1.使用類構造器實例化
          <bean id=“orderService" class="cn.itcast.OrderServiceBean"/>

           

           


          2.使用靜態工廠方法實例化
          <bean id="persionServiceBean2" class="cn.com.xinli.service.impl.PersionServiceBeanFactory" factory-method="createPersionServiceBean"/>

           

          public class PersionServiceBeanFactory
          {
           public static PersionServiceBean createPersionServiceBean()
           {
            return new PersionServiceBean();
           }
          }

           

          例子:

           

          (1).首先寫工廠類.他其中包含產生我們的業務bean的方法

          Java代碼 復制代碼
          1. package cn.com.xinli.service.impl;   
          2.   
          3.   
          4. public class PersionServiceBeanFactory   
          5. {   
          6.     public static PersionServiceBean createPersionServiceBean()   
          7.     {   
          8.         return new PersionServiceBean();   
          9.     }   
          10. }  

           

          (2).改寫beans.xml :包含工廠類類名和產生業務bean的方法名字

           

           <bean id="persionServiceBean2" class="cn.com.xinli.service.impl.PersionServiceBeanFactory" factory-method="createPersionServiceBean"/>

           

           (3) 測試

           

          Java代碼 復制代碼
          1. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");   
          2.         PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean2");   
          3.                                                         
          4.         ps.save();  

           (4) 結果

           

          2009-05-24 14:34:00,781  INFO (PersionServiceBean.java:12) - 我是save()方法!

           


          3.使用實例工廠方法實例化:

           

          <bean id="PersionServiceBeanFactory" class="cn.com.xinli.service.impl.PersionServiceBeanFactory"></bean>
              <bean id="persionServiceBean3" factory-bean="PersionServiceBeanFactory" factory-method="createPersionServiceBean2"></bean>

           

          public  PersionServiceBean createPersionServiceBean2()
           {
            return new PersionServiceBean();
           }

           

          例子:

           

          (1). 首先寫工廠類.他其中包含產生我們的業務bean的方法 ,在已有代碼的基礎上

          Java代碼 復制代碼
          1. package cn.com.xinli.service.impl;   
          2.   
          3.   
          4. public class PersionServiceBeanFactory   
          5. {   
          6.     public static PersionServiceBean createPersionServiceBean()   
          7.     {   
          8.         return new PersionServiceBean();   
          9.     }   
          10.        
          11.     <SPAN style="COLOR: #ff0000">public  PersionServiceBean createPersionServiceBean2()   
          12.     {   
          13.         return new PersionServiceBean();   
          14.     }</SPAN>   
          15.        
          16. }  

           

           

          (2).改寫beans.xml :寫兩個bean,一個是工廠bean,一個是利用工廠bean產生業務bean的bean.

           

          Xml代碼 復制代碼
          1. <bean id="PersionServiceBeanFactory" class="cn.com.xinli.service.impl.PersionServiceBeanFactory"></bean>  
          2.     <bean id="persionServiceBean3" factory-bean="PersionServiceBeanFactory" factory-method="createPersionServiceBean2"></bean>  

           

           (3) 測試

           

          Java代碼 復制代碼
          1. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");   
          2.         PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean3");   
          3.                                                         
          4.         ps.save();  

           (4) 結果

           

          2009-05-24 14:49:17,812  INFO (PersionServiceBean.java:12) - 我是save()方法!

           

           (5) 注意,其實方式2和方式3的區別就在 工廠類中是如何產生業務bean的,方式2是static方式,方式3不是

          posted @ 2009-08-25 11:59 笑口常開、財源滾滾來! 閱讀(264) | 評論 (0)編輯 收藏
           
           前幾天時間學習了Struts2.感覺還是有些新的認識。今天開始學習spring,認真閱讀了夏昕翻譯的文檔,雖然只看了前幾張,但總算有個入門,并且有個初步認識,并且看到了其他網友寫的如何學習spring,感覺還是很不錯。感謝對此提供的寶貴建議。

          下面是應用的一些話:

          SpringFramework是根據Rod Johnson著名的《Expert One-on-One J2EE Design and Development》而開發的J2EE應用程序框架。目前主要根據Rod Johnson和Juergen Hoeller而進行開發的。 Spring是J2EE應用程序框架,不過,更嚴格地講它是針對Bean的生命周期進行管理的輕量級容器(Lightweight container),可以單獨利用Spring構筑應用程序,也可以和Struts,Webwork,Tapestry等眾多Web應用程序框架組合使用,并且可以與Swing等桌面應用程序API組合。

           1、如何學習Spring?

          你可以通過下列途徑學習spring:

          (1) spring下載包中doc目錄下的MVC-step-by-step和sample目錄下的例子都是比較好的spring開發的例子。

          (2) AppFuse集成了目前最流行的幾個開源輕量級框架或者工具Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts 。

           你可以通過AppFuse源代碼來學習spring。
           AppFuse網站:http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse 

          (3)Spring 開發指南(夏昕)(http://www.xiaxin.net/Spring_Dev_Guide.rar) 

          一本spring的入門書籍,里面介紹了反轉控制和依賴注射的概念,以及spring的bean管理,spring的MVC,spring和hibernte,iBatis的結合。

           (4) spring學習的中文論壇
           SpringFramework中文論壇(http://spring.jactiongroup.net)
           Java視線論壇(http://forum.javaeye.com)的spring欄目

           2、利用Spring框架編程,console打印出log4j:WARN Please initialize the log4j system properly?
           說明你的log4j.properties沒有配置。請把log4j.properties放到工程的classpath中,eclipse的classpath為bin目錄,由于編譯后src目錄下的文件會拷貝到bin目錄下,所以你可以把log4j.properties放到src目錄下。
           這里給出一個log4j.properties的例子:

           log4j.rootLogger=DEBUG,stdout
           log4j.appender.stdout=org.apache.log4j.ConsoleAppender
           log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
           log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

           3、出現 java.lang.NoClassDefFoundError?

           一般情況下是由于你沒有把必要的jar包放到lib中。

           比如你要采用spring和hibernate(帶事務支持的話),你除了spring.jar外還需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的幾個jar包。

          http://www.springframework.org/down...,提供兩種zip包 
          建議你下載開發包。這個zip解壓縮后比后者多一個lib目錄,其中有hibernate、j2ee、dom4j、aopalliance、jakarta-commons等常用包。

          4、java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文件?原因一般有兩個:

           (1)該xml文件沒有在classpath中。
           (2)applicationContext-hibernate.xml中的xml名字沒有帶包名。比如:

           User.hbm.xml 錯,改為: com/yz/spring/domain/User.hbm.xml

           net.sf.hibernate.dialect.MySQLDialect true

           5、org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean class?
           出現異常的原因是在application-xxx.xml中property name的錯誤。 中name的名字是與bean的set方法相關的,而且要注意大小寫。比如

           public class PostManageImpl extends BaseManage implements PostManage
           {
           private PostDAO dao = null;
           public void setPostDAO(PostDAO postDAO)
          {
           this.dao = postDAO;
           }
           }
           那么xml的定義應該是:

           對 錯

           6、Spring中如何實現事務管理?
           首先,如果使用mysql,確定mysql為InnoDB類型。

           事務管理的控制應該放到商業邏輯層。你可以寫個處理商業邏輯的JavaBean,在該JavaBean中調用DAO,然后把該Bean的方法納入spring的事務管理。

           比如:xml文件定義如下:
           class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED

           com.yz.spring.service.implement.UserManageImpl就是我們的實現商業邏輯的JavaBean。我們通過parent元素聲明其事務支持。

           7、如何管理Spring框架下更多的JavaBean?

           JavaBean越多,spring配置文件就越大,這樣不易維護。為了使配置清晰,我們可以將JavaBean分類管理,放在不同的配置文件中。 應用啟動時將所有的xml同時加載。
           比如:

           DAO層的JavaBean放到applicationContext-hibernate.xml中,商業邏輯層的JavaBean放到applicationContext-service.xml中。然后啟動類中調用以下代碼載入所有的ApplicationContext。

           String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml", "com/yz/spring/service/applicationContext-service.xml"};
           ctx = new ClassPathXmlApplicationContext(paths);

           8、web應用中如何加載ApplicationContext?
           可以通過定義web.xml,由web容器自動加載。

           context
           org.springframework.web.context.ContextLoaderServlet
           1 contextConfigLocation /WEB-INF/applicationContext-hibernate.xml /WEB-INF/applicationContext-service.xml

           9、在spring中如何配置的log4j?
           在web.xml中加入以下代碼即可。
           log4jConfigLocation /WEB-INF/log4j.properties

           10、Spring框架入門的編程問題解決了,我該如何更深地領會Spring框架呢?

           這兩本書你該去看看。這兩本書是由Spring的作者Rod Johnson編寫的。
           Expert One on one J2EE Design and Development
           Expert One on one J2EE Development Without EJB
           你也該看看martinfowler的Inversion of Control Containers and the Dependency Injection pattern。
          http://www.martinfowler.com/articles/injection.html

          再好好研讀一下spring的文檔。
          http://www.jactiongroup.net/reference/html/  

          posted @ 2009-08-23 19:40 笑口常開、財源滾滾來! 閱讀(390) | 評論 (0)編輯 收藏
           
          主站蜘蛛池模板: 宜章县| 光山县| 集安市| 筠连县| 汝城县| 讷河市| 广河县| 南陵县| 隆林| 勃利县| 达尔| 罗源县| 防城港市| 青田县| 济阳县| 池州市| 灌南县| 锡林郭勒盟| 广饶县| 义乌市| 海林市| 河津市| 广灵县| 宜兰市| 珠海市| 长兴县| 河间市| 自贡市| 儋州市| 肇东市| 措勤县| 辽中县| 宽甸| 瓦房店市| 谢通门县| 阿城市| 弥渡县| 南宫市| 闽侯县| 嘉鱼县| 临湘市|