千山鸟飞绝 万径人踪灭
勤练内功,不断实践招数。争取早日成为武林高手

2009年8月26日

在实现程序的修改模块时,要在页面端检查用户是否修改过数据,以便提醒用户及时保存修改后的数据。
实现要求:
  判断用户是否修改了输入的内容,要能判断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 笑口常开、财源滚滚来! 阅读(546) | 评论 (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 笑口常开、财源滚滚来! 阅读(440) | 评论 (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 笑口常开、财源滚滚来! 阅读(812) | 评论 (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 笑口常开、财源滚滚来! 阅读(2023) | 评论 (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 笑口常开、财源滚滚来! 阅读(734) | 评论 (0)编辑 收藏
 
     摘要: JSTL 入门: 探讨 core JSTL 入门: 探讨 core 使用定制标记进行流控制和 URL 管理 ...  阅读全文
posted @ 2009-09-22 10:50 笑口常开、财源滚滚来! 阅读(392) | 评论 (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 笑口常开、财源滚滚来! 阅读(214) | 评论 (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 笑口常开、财源滚滚来! 阅读(11410) | 评论 (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 笑口常开、财源滚滚来! 阅读(780) | 评论 (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 笑口常开、财源滚滚来! 阅读(5827) | 评论 (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 笑口常开、财源滚滚来! 阅读(1300) | 评论 (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 笑口常开、财源滚滚来! 阅读(1619) | 评论 (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 笑口常开、财源滚滚来! 阅读(439) | 评论 (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 笑口常开、财源滚滚来! 阅读(238) | 评论 (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 笑口常开、财源滚滚来! 阅读(2177) | 评论 (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 笑口常开、财源滚滚来! 阅读(199) | 评论 (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 笑口常开、财源滚滚来! 阅读(683) | 评论 (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 笑口常开、财源滚滚来! 阅读(1600) | 评论 (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("//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 笑口常开、财源滚滚来! 阅读(234) | 评论 (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("//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 笑口常开、财源滚滚来! 阅读(152) | 评论 (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 笑口常开、财源滚滚来! 阅读(191) | 评论 (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 笑口常开、财源滚滚来! 阅读(181) | 评论 (0)编辑 收藏