ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99精品久久久水蜜桃,亚洲天堂2017,你懂的在线观看http://www.aygfsteel.com/sonnylys/ 熟能生åéyåQŒåéy夺天工! zh-cnThu, 03 Jul 2025 09:04:21 GMTThu, 03 Jul 2025 09:04:21 GMT60请高手解救小弟,万分感激åQä‹É用dom4j如何实现按Element的某个属性排序?åQŸï¼Ÿhttp://www.aygfsteel.com/sonnylys/archive/2009/05/15/270844.htmlSonny LiSonny LiFri, 15 May 2009 06:47:00 GMThttp://www.aygfsteel.com/sonnylys/archive/2009/05/15/270844.htmlhttp://www.aygfsteel.com/sonnylys/comments/270844.htmlhttp://www.aygfsteel.com/sonnylys/archive/2009/05/15/270844.html#Feedback5http://www.aygfsteel.com/sonnylys/comments/commentRss/270844.htmlhttp://www.aygfsteel.com/sonnylys/services/trackbacks/270844.html请高手解救小弟,万分感激åQä‹É用dom4j如何实现按Element的某个属性排序?åQŸï¼Ÿå¦‚下面xmlæ–‡äšg

<?xml version="1.0" encoding="GBK"?>
<books>
  <book name="请高手解救下ž®å¼Ÿ" price="30.00">
  <book name="万分感激" price="40.00">
  <book name="谢谢大家的回åº? price="50.00">
 </books>

我想获取books节点下的所有book子节点,òq¶æŒ‰price属性排序,如何实现åQ?br />
本äh阅读dom4j的文档,扑ֈ°org.dom4j.xpath.DefaultXPath.selectNodes(Object context, XPath sortXPath)æ–ÒŽ³•½W¬äºŒä¸ªå‚æ•?sortXPath"好像是用来排序的åQŒä½†ä¸çŸ¥å¦‚何写sortXPath参数ã€?br />
先谢˜q‡ï¼Œåœ¨çº¿½{‰ã€?br />

说明åQšæœ¬äºÞZ¸éœ€è¦xsl排序æ–ÒŽ¡ˆã€?br />



Sonny Li 2009-05-15 14:47 发表评论
]]>
自编 jtle(javascript template language engine) javascript模板语言引擎, è½ÀL¾å¤„理json数据!http://www.aygfsteel.com/sonnylys/archive/2008/05/25/202677.htmlSonny LiSonny LiSun, 25 May 2008 02:24:00 GMThttp://www.aygfsteel.com/sonnylys/archive/2008/05/25/202677.htmlhttp://www.aygfsteel.com/sonnylys/comments/202677.htmlhttp://www.aygfsteel.com/sonnylys/archive/2008/05/25/202677.html#Feedback4http://www.aygfsteel.com/sonnylys/comments/commentRss/202677.htmlhttp://www.aygfsteel.com/sonnylys/services/trackbacks/202677.html  é˜…读全文

Sonny Li 2008-05-25 10:24 发表评论
]]>
Prototype学习å¿?ä¹?bindæ–ÒŽ³•çš„â€œè°œâ€è¿·äºø™‰²å½©ï¼http://www.aygfsteel.com/sonnylys/archive/2008/05/08/199080.htmlSonny LiSonny LiThu, 08 May 2008 14:37:00 GMThttp://www.aygfsteel.com/sonnylys/archive/2008/05/08/199080.htmlhttp://www.aygfsteel.com/sonnylys/comments/199080.htmlhttp://www.aygfsteel.com/sonnylys/archive/2008/05/08/199080.html#Feedback6http://www.aygfsteel.com/sonnylys/comments/commentRss/199080.htmlhttp://www.aygfsteel.com/sonnylys/services/trackbacks/199080.html     Prototypeçš„bindæ–ÒŽ³•常常把许多学习它的äh弄得¾pŠç³Šæ¶‚æ¶‚åQŒgoogleå’Œbaidu一番后˜q˜æ˜¯ä¸€å¡Œèƒ¡æ¶‚!本äh也如此;本äh觉得它是个从“è°œäh”åˆ?#8220;˜q·äh”的方法。此文将发表个ähå¯ÒŽ­¤æ–ÒŽ³•的理解,希望能帮助大家成功渡“è°?#8221;åQŒåˆ°è¾?#8220;˜q·äh”的彼岸!
<html>
<head>
 <script src="prototype.js"></script> //@7
 <script type="text/javascript">
   /**********************************
    *
    *  实现渲染一个带æœ?上一™å?å’?下一™å?的组ä»?点击"上一™å?,当前™åµå‡1,点击"下一™å?当前™åµåŠ 1
    *
    */
   function PagesSystem(container){
     this.currentPage = 10; //当前™å?br />      this.pageSysDiv = document.getElementById(container); //容器
    
     this.init = function() { //ž®†ç»„件画出来
       this.createPrePage();
       this.createNextPage();
     };
    
     this.changePage = function(evtObj) { //æ ÒŽ®ç‚¹å‡»åŽä¼ ˜q‡æ¥çš„参数决定是åŠ?或是å‡?
        if(evtObj == "next") {
          this.currentPage += 1;
          alert("你已执行ž®†å½“前页åŠ?åQŒçŽ°åœ¨å½“å‰é¡µæ˜¯ï¼š" + this.currentPage);
        }else if(evtObj == "pre"){
          //此处不作if(this.currentPage ==1) return;限制ä¸ÞZº†ä½“现当传入的参数ä¸?pre"æ—Óž¼Œä¸‹é¢çš„alert()一定会执行
          this.currentPage -= 1;
          alert("你已执行ž®†å½“前页å‡?åQŒçŽ°åœ¨å½“å‰é¡µæ˜¯ï¼š" + this.currentPage);
        }
      
     };
    
     this.createPrePage = function() {//创徏上一™å늻„ä»?br />        var _span = document.createElement("SPAN");
       _span.style.cssText = "margin-left:16px";
       var _a = document.createElement("A");
       _a.href = "#";
       _a.onclick = this.changePage; //@1 当点å‡ÀL­¤åQ?上一™å?åQ‰é“µé’®æ—¶æ‰§è¡Œ
       _a.innerText = "上一™å?;
       _span.appendChild(_a);
       this.pageSysDiv.appendChild(_span);
     };
    
     this.createNextPage = function() {//创徏下一™å늻„ä»?br />        var _span = document.createElement("SPAN");
       _span.style.cssText = "margin-left:16px";
       var _a = document.createElement("A");
       _a.href = "#";
       _a.onclick = this.changePage; //@2 当点å‡ÀL­¤åQ?下一™å?åQ‰é“µé’®æ—¶æ‰§è¡Œ
       _a.innerText = "下一™å?;
       _span.appendChild(_a);
       this.pageSysDiv.appendChild(_span);
     };
   
     this.init(); //执行初始åŒ?br />    }
   function testUse(msg){//@3在提出问题环节用åˆ?br />      alert(msg);
   }
   window.onload = function() {
     var ps = new PagesSystem("pageDiv");
   }
 </script>
</head>
<body>
  <div id="pageDiv"></div>
</body>
</html>

二、分析代码,提出问题åQŒè§£å†³é—®é¢?br /> 1、无法传递参数问题ã€?br />    你细看@1å’Œ@2å¤?当前的代码实现是无法æŠ?pre"å’?next"参数传递过去,于是åQŒå½“你运行例子,点击上一™å‰|ˆ–下一™åµï¼Œéƒ½æ˜¯æ²¡ä¿¡æ¯alert出来的!
   ˜q™ç§æƒ…况åQŒæ˜¯å¾ˆå¸¸è§çš„。那么,如何实现ž®†å‚æ•îC¼ ˜q‡åŽ»ã€?br />    ž®†@1处代码修改如下:
                    _a.onclick = function(){ //@1 当点å‡ÀL­¤åQ?上一™å?åQ‰é“µé’®æ—¶æ‰§è¡Œ
                         testUse("pre"); //参看@3
                         this.changePage("pre");
                    }
   ˜q™æ ·åˆ›å¾ä¸€ä¸ªåŒ¿åå‡½æ•°èµ‹äºˆ_a.onclick,也就是当_a对象的onclick事äšg触发后将执行此匿名函敎ͼŒè€ŒåŒ¿åå‡½æ•°å°†å¸®å¿™è°ƒç”¨testUse("pre")å’Œthis.changePage("pre")两个æ–ÒŽ³•åQ?br />    从而达成传递参数ã€?br />    修改代码åQŒè¿è¡Œä¾‹å­åŽç‚¹å‡»ä¸Šä¸€™åµåŽä¼šæ˜¾½Cºå¦‚下两个信息,一个是testUse中输出的信息åQŒè¯æ˜Žäº†å®žçŽ°å‚æ•°ä¼ é€’ï¼Œå¦ä¸€ä¸ªå´æ˜¯è¿è¡Œé”™è¯¯æ½Cºã€?br />    

   ˜q™æ˜¯æ‰§è¡Œthis.changePage("pre")æ–ÒŽ³•抛出来的。它òq¶æ²¡åƒæˆ‘们预期想的运行ã€?br />    从提½Cø™Ž·åˆ°çš„信息是,对象不支持此属性或æ–ÒŽ³•åQˆå¦‚果浏览器报的是中文提½Cºå°±å¯ä»¥çœ‹åˆ°“对象不支持此æ–ÒŽ³•或属æ€?#8221;的提½Cºï¼‰
   回头看this.changePage("pre")æ–ÒŽ³•åQŒå¾ˆæ˜Žæ˜¾this是错误提½CÞZ¸­æ‰€æŒ‡çš„对象åQŒåœ¨æœ¬åº”用中指PagesSystem对象指针的引用,在应用中¼‹®å®žæ˜¯å£°æ˜Žäº†this.changePage("pre")æ–ÒŽ³•åQŒä½†ä¸ÞZ»€ä¹ˆè¯´æ²¡æ­¤æ–ÒŽ³•呢?åQŸï¼ŸåQ?br /> 2、在问题1中,我们已成功解决传递参敎ͼŒä½†PagesSystem对象的changePageæ–ÒŽ³•被谁偷了åQŸï¼ŸåQ?br />    再将刚才的代码修改如:
                     _a.onclick = function(){ //@1 当点å‡ÀL­¤åQ?上一™å?åQ‰é“µé’®æ—¶æ‰§è¡Œ
                       testUse("pre"); //参看@3
                       alert(this.tagName);
                       this.changePage("pre");
                    }
   再运行例子,你会发现输出this.tagNameçš„å€égØ“ A, 它就是_a对象。噢åQŒæˆ‘çš„å¤©å•Šã€‚æ€Žä¹ˆä¼šè¿™æ øP¼ŸåQŸï¼Ÿ
   哈哈..._a对象ž®±æ˜¯<a href=""/></a>˜q™ä¸ªhtml 元素对象åQŒè¿™é‡Œæ˜¯“上一™å?#8221;铵钮对象åQŒåŽŸåž‹ä¸­å“ªæ¥changePageæ–ÒŽ³•啊,所以报错!åQï¼
   你可以这æ ïL†è§£ï¼Œçœ‹å¦‚下代ç ?
     function PagesSystem(container){//此应用中的PagesSystem对象åQŒchangePageæ–ÒŽ³•的上下文对象,也可以称为归属者ã€?br />        //...省略其它代码
       this.changePage = function(evtObj) { //æ ÒŽ®ç‚¹å‡»åŽä¼ ˜q‡æ¥çš„参数决定是åŠ?或是å‡?
         if(evtObj == "next") {
           this.currentPage += 1;
           alert("你已执行ž®†å½“前页åŠ?åQŒçŽ°åœ¨å½“å‰é¡µæ˜¯ï¼š" + this.currentPage);
         }else if(evtObj == "pre"){
           //此处不作if(this.currentPage ==1) return;限制ä¸ÞZº†ä½“现当传入的参数ä¸?pre"æ—Óž¼Œä¸‹é¢çš„alert()一定会执行
           this.currentPage -= 1;
           alert("你已执行ž®†å½“前页å‡?åQŒçŽ°åœ¨å½“å‰é¡µæ˜¯ï¼š" + this.currentPage);
         }
       };
       //...省略其它代码
     }
    
     ˜q™æ ·çš„代码,你很å®ÒŽ˜“看出this是指PagesSystem, 那么我们¾l§ç®‹å¾€ä¸‹çœ‹
     假设 A对象的原型如ä¸?
     function A() {//@4
       //...
        this.onclick;
       
        this.doClick = function() { //点击
          this.onclick();//执行
        }
      
       //...
     }
    
     当你在PagesSystemæ–ÒŽ³•ä¸?br />                    _a.onclick = function(){ //@1 当点å‡ÀL­¤åQ?上一™å?åQ‰é“µé’®æ—¶æ‰§è¡Œ
                       testUse("pre"); //参看@3
                       alert(this.tagName);
                       this.changePage("pre");
                    }
    写上˜q™æ ·çš„代码后,你可以离è°Þp®¤ä¸º@4的代码的模样是如下:
    function A() {//@4
       //...
        this.onclick = function(){ //@1 当点å‡ÀL­¤åQ?上一™å?åQ‰é“µé’®æ—¶æ‰§è¡Œ
             testUse("pre"); //参看@3
             alert(this.tagName); //@5
             this.changePage("pre"); //@6
          };
       
        this.doClick = function() { //点击
          this.onclick();//执行
        }
       //...
     }
     呵呵。。如果这æ ïLœ‹çš„话åQŒ@5,@6中的this当然是指a对象åQŒæ²¡å¼‚义。那当然是没changePageæ–ÒŽ³•ã€?br />     
3、那么如何解册™¿™é—®é¢˜å‘¢ï¼ŸåQ?br />    很幸˜qï¼Œprototype.js中的bindæ–ÒŽ³•ž®±å¯ä»¥è§£å†Œ™¿™æ ïLš„问题åQŒå®ƒ˜q˜è§£å†Ïxˆ‘们上面提的传参数问题ã€?br />    看bind大侠帅样:
  
   bind: function() {
    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
  }
  bindæ–ÒŽ³•中的thisž®±æ˜¯bindæ–ÒŽ³•的所属者(上下文)å¦? f.bind(),f是一个声明了的方æ³?那么bind æ–ÒŽ³•里的thisž®±æ˜¯f
  再细看,bindæ–ÒŽ³•其实做的工作是返回一个匿名函æ•?此匿名函数帮忙执行this所指的æ–ÒŽ³•åQˆbindæ–ÒŽ³•的所属者)åQŒå¦‚果你有如下代ç ?br />   function f(msg) {
    this.functionName = "f method";
    alert(msg);
    alert(this.functionName);
  }
 
  button.onclick = f.bind(this, msg); //˜q™é‡Œçš„this指f, 在bindæ–ÒŽ³•中用object = args.shift()获得åQŒè¿™æ ïLš„话,当点击button后执行fæ–ÒŽ³•, fæ–ÒŽ³•中的thisž®×ƒ¸ä¼šæ— æ•…被 button代替。^_^不然åQŒä¼šæŠ¥é”™çš„啊åQŒbutton哪来functionNameåQŒå‘µå‘?..
  它既解决ž®†msg参数传过去,同时ž®†f¾l‘定到button环境下,bindæ–ÒŽ³•得名可能ž®±æ˜¯˜q™æ„ä¹‰å§ã€‚至于如何实现将f¾l‘定åQŒé çš„就是applyæ–ÒŽ³•ã€?br />   applyè°œäh色彩ž®Þq”±ä½ ä»¬è‡ªè¡ŒåŽÀL­å¼€å•¦ï¼
  介绍了bind大侠¾l™å¤§å®Óž¼Œæˆ‘的例子ž®±éº»çƒ¦ä½ ä»¬è‡ªå·Þp°ƒé€šå®ƒå•¦ã€‚谢了。ã€?br />   
  ‹Æ¢è¿Žäº¤æµæŒ‡æ­£ã€?br />
 å¤‡æ³¨åQ?nbsp;如需转蝲本文åQŒè¯·æ³¨æ˜Žå‡ºå¤„
    



Sonny Li 2008-05-08 22:37 发表评论
]]>
用javascriptå®žçŽ°è¾ƒäØ“é€šç”¨çš„å®¢æˆïL«¯åˆ†é¡µ¾l„äšghttp://www.aygfsteel.com/sonnylys/archive/2008/05/04/198279.htmlSonny LiSonny LiSun, 04 May 2008 14:54:00 GMThttp://www.aygfsteel.com/sonnylys/archive/2008/05/04/198279.htmlhttp://www.aygfsteel.com/sonnylys/comments/198279.htmlhttp://www.aygfsteel.com/sonnylys/archive/2008/05/04/198279.html#Feedback23http://www.aygfsteel.com/sonnylys/comments/commentRss/198279.htmlhttp://www.aygfsteel.com/sonnylys/services/trackbacks/198279.html <html>
<head>
 <script src="pageSystem.js"></script>
 <script>
   var psys;
   window.onload = function() {
    psys = new PageSystem(1120, "pageDiv", 10, showMsg); //总记录数, 分页¾pȝ»Ÿå®¹å™¨åQŒæ¯¾l?0™å?回调
    psys.init();
  }
 
  function showMsg(currentPage, pageSize) {
    //回调æ–ÒŽ³•自定义,两个参数åQŒç¬¬ä¸€ä¸ªäؓ当前™åµï¼Œ½W¬äºŒä¸ªäؓ每页记录æ•?br />     /****************ž®†currentPageå’ŒpageSizeè¯äh±‚数据更新列表,最好ä‹É用ajax技æœ?*****************/
    alert("è¯äh±‚数据要的相应参数>> currentPage: "+ currentPage + " pageSize: " + pageSize);
  }
  
   /*****如果要更新分™å늳»¾lŸè¯·å¦‚下操作******/
    //psys.update(count); //@count 䏸™®°å½•æ€ÀL•°
    function updatePageSys() {
    
     psys.update(150); //@count 䏸™®°å½•æ€ÀL•°
   }
  </script>
  <style>
    #pageDiv{
      font-size:13px;
    }
  </style>
</head>
<body>
  <div id="pageDiv">
  </div>
  <br/><br/>
  <a href="#" onclick="updatePageSys();"/>更新分页¾pȝ»Ÿ</a>
</body>
</html>

2、pageSystem.js
function PageSystem(count, divID, grountCount, callBack) {
     this.totolCount = count; //总记录数
     this.initMaxPage = grountCount? grountCount: 5;  //昄¡¤º™å‰|•°åQŒå¦‚ 1 2 3 4 5
     this.pageSize = 10;  //每页记录æ•?br />      this.currentMax = 0; //当前昄¡¤ºçš„æœ€å¤§é¡µç ? å¦?1 2 3 4 5; 5为最大页ç ?br />      this.currentMin = 0; //当前昄¡¤ºçš„æœ€ž®é¡µç ? å¦?11 12 13 14 15; 11为最ž®é¡µç ?br />      this.homePage = 0; //首页
     this.endPage = 0; //未页
     this.currentPage = 0; //当前™å?br />      this.currentActiveSpan; //当前‹zÕdЍa容器
     this.pageDivObj = document.getElementById(divID); //分页¾pȝ»Ÿå®¹å™¨
     this.pages = 0; //总页敎ͼŒè®¡ç®—得到
     //this._url = _url; //提交URL
     this.callBack = callBack; //回调
     var that = this; //指针的引ç”?br />     
   
     this.init = function() {
        this.pages = parseInt(this.totolCount / this.pageSize); //获得æ€Õd…±æœ‰å‡ ™å?br />         this.pages = this.totolCount % this.pageSize == 0? this.pages: this.pages+1;
        this.createHomePage();
        this.createPrePage();
        var n = 1;
        while(n <= this.pages) {
          if(n > this.initMaxPage){
             break; //到达最大显½Cºæ•°
          }
          var _span = document.createElement("SPAN");
          _span.style.cssText = "margin-left:10px";
          if(n == 1) { //初始化时½W¬ä¸€™åµäØ“‹zÕdЍ™å?br />             _span.innerText = n;
            this.currentActiveSpan = _span;
          }else{
             var _a = document.createElement("A");
             _a.href = "#";
            _a.onclick = this.reView;
            _a.innerText = n;
            _span.appendChild(_a);
          }
          this.pageDivObj.appendChild(_span);
          n++;
        }
        if(this.pages != 0) {
          this.currentMax = n - 1; //当前¾l„最大页ç ?1 2 3 4 5å€égØ“5
          this.currentMin = 1; //当前最ž®é¡µç ?1 2 3 4 5 å€égØ“1
          this.homePage = 1; //首页
          this.endPage = this.pages; //未页
          this.currentPage = 1; //当前™å?br />         }
        //alert(this.currentMax);
        //alert(this.currentMin);
        this.createNextPage();
        this.createEndPage();
      
      
      
    };
    this.query = function() {
      var curPage = that.currentPage; //当前™å?br />       var pageSize = that.pageSize;
      if(that.callBack) that.callBack(curPage, pageSize);
         
    };
    this.reView = function() {
     //重新渲染UI
       that.reViewActivePage();
       that.query();
    };
    this.reViewActivePage = function() {
      //重新渲染当前™åµè§†å›?br />       var actA = event.srcElement; //当前被点å‡Èš„ a对象
      var ap = actA.parentNode; //获得当前a容器span对象
      //˜q˜åŽŸå½“å‰™åµè§†å›?br />        var _a = document.createElement("A");
        _a.href = "#";
        _a.onclick = this.reView;
        _a.innerText = that.currentActiveSpan.innerText;
        that.currentActiveSpan.innerText = "";
        that.currentActiveSpan.appendChild(_a);
       //渲染新的当前™åµè§†å›?br />        that.currentActiveSpan = ap; //切换当前‹zÕdЍ™åµå®¹å™?br />        var curPage = parseInt(actA.innerText);
       that.currentActiveSpan.removeChild(actA);
       that.currentActiveSpan.innerText = curPage;
       this.currentPage = curPage; //更改当前™å늠
       if(!that.toNextGroup()) that.toPreGroup();
    };
    this.toNextGroup = function() {
       //重新渲染昄¡¤º™åµä¸‹ä¸€¾l?1 2 3 4 5 --> 5 6 7 8 9
       if(that.currentPage == that.currentMax) {//ç‚¹å‡»çš„é¡µç äØ“å½“å‰¾l„最大页码,当go 下一¾l?br />          if(that.currentPage != that.endPage) { //如果点了未页当然不会再有下一¾l„啦åQ?br />             that.pageDivObj.innerHTML = ""; //@1
            var pageCode = parseInt(that.currentPage) + 1; //昄¡¤º™å늠
            var n = 2; //当前‹zÕdЍ™åµä¸é‡åˆ›
            this.createHomePage();
            this.createPrePage();
            that.currentActiveSpan.innerText = that.currentPage;
            that.pageDivObj.appendChild(that.currentActiveSpan); //ž®†å½“前活动页回放,è¯ïLœ‹@1
            while(pageCode <= that.pages) {
            if(n > that.initMaxPage){
               break; //到达最大显½Cºæ•°
            }
            var _span = document.createElement("SPAN");
            _span.style.cssText = "margin-left:10px";
            var _a = document.createElement("A");
             _a.href = "#";
            _a.onclick = that.reView;
            _a.innerText = pageCode;
            _span.appendChild(_a);
            that.pageDivObj.appendChild(_span);
            pageCode++;
            n++;
          }
          that.currentMax = pageCode - 1;
          that.currentMin = that.currentPage;
         // alert("currentMax: " + that.currentMax);
         // alert("currentMin: " + that.currentMin);
          this.createNextPage();
          that.createEndPage();
          return true;
         }//end if
       }//end if
       return false;
    };
    this.toPreGroup = function() { //
      //重新渲染昄¡¤º™åµä¸Šä¸€¾l?5 6 7 8 9 -->1 2 3 4 5
      if(that.currentPage == that.currentMin) { //点了¾l„中最ž®é¡µç ?br />         if(that.currentPage != 1) {
           that.pageDivObj.innerHTML = ""; //@2
            var pageCode = parseInt(that.currentPage) - (that.initMaxPage -1); //昄¡¤º™å늠
            var n = 2; //当前‹zÕdЍ™åµä¸é‡åˆ›
            this.createHomePage();
            this.createPrePage();
            while(true) {
            if(n > that.initMaxPage){
               break; //到达最大显½Cºæ•°
            }
            var _span = document.createElement("SPAN");
            _span.style.cssText = "margin-left:10px";
            var _a = document.createElement("A");
             _a.href = "#";
            _a.onclick = that.reView;
            _a.innerText = pageCode++;
            _span.appendChild(_a);
            that.pageDivObj.appendChild(_span);
            n++;
          }
          that.currentMax = that.currentPage;
          that.currentMin = pageCode - (that.initMaxPage -1);
          //alert("currentMax: " + that.currentMax);
         // alert("currentMin" + that.currentMin);
          that.currentActiveSpan.innerText = that.currentPage;
            that.pageDivObj.appendChild(that.currentActiveSpan); //ž®†å½“前活动页回放,è¯ïLœ‹@2
            that.createNextPage();
            that.createEndPage();
        }//end if
      }//end if
    };
     this.toHomePage = function(){
       //åŽÕdˆ°é¦–页
       if(that.pages == 0) return;
       if(that.currentPage != 1) {//切组
         that.pageDivObj.innerHTML = "";
         that.init();
       }//end if
       that.currentPage = 1;
       that.currentMin = 1;
       that.currentMax = that.initMaxPage;
       that.query();
     };
     this.toEndPage = function() {
       //åŽÕdˆ°æœªé¡µ
        if(that.pages == 0 ||that.currentPage == that.pages) return;
        if(true) {//切组条äšg修改åQŒæ­¤æ¡äšg作废,ä¸´æ—¶è®¾äØ“true
        that.pageDivObj.innerHTML = "";
        that.createHomePage();
        that.createPrePage();
        var pageCode = 1;
     var n = 1;
      while(pageCode <= that.pages) {
        if(n > that.initMaxPage-1){
          n = 1;
        }
        n++;
        pageCode++;
      }
     
      pageCode = that.pages - (n-2);
      for(var j = 1; j < n; j++) {
         var _span = document.createElement("SPAN");
       _span.style.cssText = "margin-left:10px";
       if(pageCode == that.pages) { //初始化时½W¬ä¸€™åµäØ“‹zÕdЍ™å?br />         _span.innerText = pageCode;
        that.currentActiveSpan = _span;
       }else{
         var _a = document.createElement("A");
         _a.href = "#";
         _a.onclick = that.reView;
         _a.innerText = pageCode;
         _span.appendChild(_a);
         pageCode++;
       }
       that.pageDivObj.appendChild(_span);
      }
      
         that.createNextPage();
          that.createEndPage();
       }//end if
       that.currentPage = that.pages;
       that.currentMin = that.pages - (n-2);
       that.currentMax = that.pages;
      // alert("currentMin: " + that.currentMin);
       //alert("currentMax: " + that.currentMax);
      // alert("pages: " + that.pages);
       that.query();
     };
    
     this.next = function() {
       //下一™å?br />      };
     this.pre = function() {
       //上一™å?br />      };
     this.update = function(count) {
       //更新分页¾pȝ»Ÿ
       this.totolCount = count;
       that.pageDivObj.innerHTML = "";
       this.init();
     };
     this.createPrePage = function() {
       return;
       var _span = document.createElement("SPAN");
       _span.style.cssText = "margin-left:16px";
       var _a = document.createElement("A");
       _a.href = "#";
       _a.onclick = this.pre;
       _a.innerText = "上一™å?;
       _span.appendChild(_a);
       this.pageDivObj.appendChild(_span);
     };
     this.createNextPage = function() {
       return;
       var _span = document.createElement("SPAN");
       _span.style.cssText = "margin-left:16px";
       var _a = document.createElement("A");
       _a.href = "#";
       _a.onclick = this.next;
       _a.innerText = "下一™å?;
       _span.appendChild(_a);
       this.pageDivObj.appendChild(_span);
     };
     this.createHomePage = function() {
       var homeSpan = document.createElement("SPAN");
       var _a = document.createElement("A");
       _a.href = "#";
       _a.onclick = this.toHomePage;
       _a.innerText = "首页";
       homeSpan.appendChild(_a);
       this.pageDivObj.appendChild(homeSpan);
     };
     this.createEndPage = function() {
       var _span = document.createElement("SPAN");
       _span.style.cssText = "margin-left:16px";
       var _a = document.createElement("A");
       _a.href = "#";
       _a.onclick = this.toEndPage;
       _a.innerText = "未页(" + this.pages +")";
       _span.appendChild(_a);
       this.pageDivObj.appendChild(_span);
     }
   }

3、效果图
 
如需转蝲åQŒè¯·æ³¨æ˜ŽåŽŸæ–‡å‡ºå¤„åQè°¢è°¢åˆä½œã€?/span>

]]>
ç”?window.showModalDialog()"实现DIV模式弹出½H—口http://www.aygfsteel.com/sonnylys/archive/2008/05/01/197683.htmlSonny LiSonny LiThu, 01 May 2008 13:33:00 GMThttp://www.aygfsteel.com/sonnylys/archive/2008/05/01/197683.htmlhttp://www.aygfsteel.com/sonnylys/comments/197683.htmlhttp://www.aygfsteel.com/sonnylys/archive/2008/05/01/197683.html#Feedback15http://www.aygfsteel.com/sonnylys/comments/commentRss/197683.htmlhttp://www.aygfsteel.com/sonnylys/services/trackbacks/197683.html 1、test.html  ‹¹‹è¯•™å?/strong>
 <html>
 <head>
   <title>‹¹‹è¯•™åµé¢</title>
   <style>
     .list {
       border-top:1 solid #8A2BE2;
       border-left:1 solid #8A2BE2;
       border-right:1 solid #8A2BE2;
     }
     .list td {
       border-bottom: 1 solid #8A2BE2;
     }
   </style>
   <script>
      function $(el) {
        return document.getElementById(el);
      }
      function showWin(param) {
        window.showModalDialog("dailog.htm", param, "dialogWidth:" +param.width +"px;dialogHeight:"+param.height+"px;center:yes;help:no;scroll:no;status:no;resizable:no");
      }
     
      function TB(tbid) {
        this.tb = typeof(tbid) == "string"? $(tbid): tbid;
        this.getValue = function(rowIndex, cellIndex){
          var trs = this.tb.rows[rowIndex];
          var _td = trs.cells[cellIndex];
          return _td.innerText;
        }
        this.setValue = function(rowIndex, cellIndex, value) {
          var _tr = this.tb.rows[rowIndex];
          var _td = _tr.cells[cellIndex];
          _td.innerText = value;
        }
       
        /********获取行烦å¼?*******/
        this.findRowIndex = function(eventSrc) {
          var _tr = eventSrc; //eventSrc事äšgæº?必须在TD里获事äšg源是TD或TR本èín
          while(_tr.tagName != "TR") {
            _tr =  _tr.parentNode;
          }
          var trs = this.tb.rows;
          for(var i = 0; i < trs.length; i++){
            if(_tr == trs[i]) return i;
          }
        }
      }
          
      function edit() {
        var tb = new TB("data");
        rIndex = tb.findRowIndex(event.srcElement);
        $("updateRowIndex").value = rIndex;
        $("userName").value = tb.getValue(rIndex, 1); //获得姓名
        $("sex").value = tb.getValue(rIndex, 2); //获得性别
        $("age").value = tb.getValue(rIndex, 3); //获得òq´é¾„
         showWin({title:"修改用户信息", width:390, height:230, _div:"openWin",parent:window});
      }
     
      function saveAndUpdateView(){
        var updateRowIndex = $("updateRowIndex").value;
        var tb = new TB($f("data")); //$f()在dailog.html定义,获到的table是父½H—口中的table
        tb.setValue(updateRowIndex, 1, $("userName").value);
        tb.setValue(updateRowIndex, 2, $("sex").value);
        tb.setValue(updateRowIndex, 3, $("age").value);
        close();
      }
   </script>
  
 </head>
 <body>
  <p style="margin-top:60px">
   <center>
     <table id="data" class="list" width="460px">
       <tr>
         <td>¾~–号</td>
         <td>用户å?lt;/td>
         <td>性别</td>
         <td>òq´é¾„</td>
         <td>操作</td>
       </tr>
       <tr>
         <td>1</td>
         <td>李永èƒ?lt;/td>
         <td>ç”?lt;/td>
         <td>27</td>
         <td><span style="background:#FAEBD7;cursor:hand" onclick="edit();">&nbsp;修改&nbsp;</span></td>
       </tr>
        <tr>
         <td>2</td>
         <td>æž—å…„</td>
         <td>ç”?lt;/td>
         <td>27</td>
         <td><span style="background:#FAEBD7;cursor:hand" onclick="edit();">&nbsp;修改&nbsp;</span></td>
       </tr>
        <tr>
         <td>3</td>
         <td>叶兄</td>
         <td>ç”?lt;/td>
         <td>23</td>
         <td><span style="background:#FAEBD7;cursor:hand" onclick="edit();">&nbsp;修改&nbsp;</span></td>
       </tr>
     </table>
   </center>
  </p>
 
  <!---弹出½H—口昄¡¤ºçš„内å®?--->
  <div id="openWin" style="display:none;">
    <form>
      <fieldSet>
        <legend>修改用户</legend>
        <table>
          <tr>
            <td>用户å?lt;/td><td><input type="text" id="userName"/></td>
          </tr>
          <tr>
            <td>性别</td><td><input type="text" id="sex"/></td>
          </tr>
          <tr>
            <td>òq´é¾„</td><td><input type="text" id="age"/></td>
          </tr>
        </table>
      </fieldSet>
      <input type="hidden" id="updateRowIndex"/>
    </form>
    <span style="background:#FAEBD7;cursor:hand" onclick="saveAndUpdateView();">&nbsp;修改&nbsp;</span>
  </div>
 </body>
</html>

2、dailog.html ½H—口原型

<html>
 <head>
   <script>
     var param = window.dialogArguments; //传过来的模式对话框窗口参æ•?br />      document.title = param.title; //½H—口标题,必须在窗口创建前实现s
    
   /********ž®†çˆ¶½H—口的js加蝲˜q›æ¥********/
     var scripts = param.parent.document.scripts;
     var _head = document.getElementsByTagName("head")[0];
     for(var n = 0; n < scripts.length; n++) {
       if(scripts[n].src) {
         var _script = newEl("script");
         _script.src = scripts[n].src;
         bind(_head, _script);
       }else{//加蝲直接在html文档中写的script
         var _script = newEl("script");
         _script.text = scripts[n].text;
          bind(_head, _script);
       }
     }
    
     /*******æ ÒŽ®ID获得父窗口的元素*********/
     function $f(el) {
       return param.parent.document.getElementById(el);
     }
   
    /***********创徏一个HTML元素*******/
     function newEl(tagName) {
       return document.createElement(tagName);
     }
     /***********˜q½åŠ å…ƒç´ ***************/
     function bind(ower, child) {
       ower.appendChild(child);
     }
     /*******在浏览器完成对象的装载后立即触发*********/
     window.onload = function() {
       var winDiv;
       if(typeof(param._div) == "string") {
         winDiv = param.parent.document.getElementById(param._div); //父窗口window对象,因䨓param._div对象在父½H—口
       }else{//直接传对象过æ?br />          winDiv = param._div;
       }
       $("mainDiv").innerHTML = winDiv.innerHTML; //ž®†DIV内容在弹出窗口中渲染
    }
   </script>
 </head>
 <body>
 <center>
  <div id="mainDiv" style="margin-top:20px;width:90%"></div>
 </center>
 </body>
</html>

如需转蝲åQŒè¯·æ³¨æ˜ŽåŽŸæ–‡å‡ºå¤„åQè°¢è°¢åˆä½œã€?/span>


]]>
用模式对话框实现“消息提½Cºæ¡†â€å’Œâ€œæ“ä½œæ½Cºæ¡†â€?/title><link>http://www.aygfsteel.com/sonnylys/archive/2008/05/01/197655.html</link><dc:creator>Sonny Li</dc:creator><author>Sonny Li</author><pubDate>Thu, 01 May 2008 07:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/sonnylys/archive/2008/05/01/197655.html</guid><wfw:comment>http://www.aygfsteel.com/sonnylys/comments/197655.html</wfw:comment><comments>http://www.aygfsteel.com/sonnylys/archive/2008/05/01/197655.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sonnylys/comments/commentRss/197655.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sonnylys/services/trackbacks/197655.html</trackback:ping><description><![CDATA[<br />   ç”׃ºŽæœ¬ähè®¤äØ“ç”?alert()å’Œconfirm()的消息框和操作确认对话框åQŒç•Œé¢ä¸å¤ªå‹å¥½ï¼Œä¸‹é¢ä»‹ç»ç”¨æ¨¡å¼å¯¹è¯æ¡†å®žçް“消息提示  æ¡?#8221;å’?#8220;操作提示æ¡?#8221;åQ›ç”¨æ¨¡å¼å¯¹è¯æ¡†ä¹Ÿå¯ä»¥å®žçŽ°å¼¹å‡º½H—口(抱括Iframe模式及DIV模式åQ‰ï¼ŒDIV模式较麻烦些åQŒä¸˜q‡ï¼Œ˜q˜æŒºå®žç”¨åQŒè¿™é‡Œä¸ä½œä»‹¾lã€? <p><span style="color: red"><strong>1、test.html ‹¹‹è¯•™å?/strong></span><br /> <html><br />  <head><br />    <title>‹¹‹è¯•™åµé¢</title><br />    <script><br />      /**** 打开消息æ¡?***<br />    * @param 为Object¾cÕdž‹,原型ä¸?{msg:"val1", time:val2},val1䏸™¦æç¤ºçš„æ¶ˆæ¯ï¼Œval2为窗口出来后延迟关闭的时é—?<br />    *<br />    */<br />    function showMsg(param) {<br />      window.showModalDialog("msg.html", param, "dialogWidth:280px;dialogHeight:180px;center:yes;help:no;scroll:no;status:no;resizable:no");<br />    }</p> <p>  /****操作¼‹®è®¤½H—口*****<br />    * @param 为string¾cÕdž‹,提示信息<br />    * @return true为选取äº?#8220;¼‹®å®š”铵钮åQŒfalse为选取äº?#8220;取消”铵钮<br />    */<br />    function confirm(msg) {<br />     return window.showModalDialog("confirm.html", msg, "dialogWidth:280px;dialogHeight:180px;center:yes;help:no;scroll:no;status:no;resizable:no");<br />   }<br />    <br />    <br />      function confirmDel() {<br />        var rval = confirm("¼‹®å®šåˆ é™¤æ­¤ç”¨æˆ·å—åQ?);<br />        if(rval) {<br />          showMsg({msg:"你点å‡ÖMº†¼‹®å®šé“µé’®", time:1200});<br />        }else{<br />          showMsg({msg:"你点å‡ÖMº†å–消铵钮", time:1200});<br />        }<br />      }<br />    </script><br />  </head><br />  <body><br />    <center><br />      <a href="#" onclick="showMsg({msg:'1¿U’钟后会自动关闭的提½CÞZ¿¡æ¯æ¡†', time:1000})">会自动关闭的提示信息æ¡?lt;/a><br />      <br/><br />      <a href="#" onclick="confirmDel();">操作¼‹®è®¤å¯¹è¯æ¡?lt;/a><br />    </center><br />  </body><br /> </html><br /> </p> <span style="color: red"><strong>2、msg.html 消息框通用模板</strong></span><br /> <html><br />  <head><br />    <title>提示对话æ¡?lt;/title><br />    <script><br />       var obj = window.dialogArguments; //传过来的模式对话框窗口参æ•?br />       /****在obj.time¿U’后关闭½H?***/<br />       window.setTimeout(function() {<br />        window.close();<br />       }, obj.time);<br />    </script><br />  </head><br />  <body><br />   <p style="margin-top:36px"><br />    <center><br />      <script><br />         document.write(obj.msg);  //打印信息<br />      </script><br />    </center><br />   </p><br />  </body><br /> </html><br /> <br /> <span style="color: red"><strong>3、confirm.html</strong></span><br /> <html><br />  <head><br />    <title>操作¼‹®è®¤å¯¹è¯æ¡?lt;/title><br />    <script><br />      function setState() {<br />        returnValue = event.srcElement.id == "ok"? true: false;<br />        window.close();<br />      }<br />    </script><br />  </head><br />  <body><br />   <p style="margin-top:26px"><br />    <center><br />      <script><br />        var msg = window.dialogArguments? window.dialogArguments: "";<br />        document.write(msg);<br />      </script><br />      <br/><br />      <div style="margin-top:20px"><br />       <a href="#" id="ok" onclick="setState()">¼‹®å®š</a><br />       <a href="#" id="cal" onclick="setState()">取消</a><br />      </div><br />    </center><br />   </p><br />  </body><br /> </html><br /> <br /> ˜qè¡Œtest.html例子可以看到相应的效æž?br /> <img height="332" alt="" src="http://www.aygfsteel.com/images/blogjava_net/sonnylys/confirm.jpg" width="418" border="0" /><br /> <br /> <br /> <img height="367" alt="" src="http://www.aygfsteel.com/images/blogjava_net/sonnylys/msg.jpg" width="338" border="0" /> <img src ="http://www.aygfsteel.com/sonnylys/aggbug/197655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sonnylys/" target="_blank">Sonny Li</a> 2008-05-01 15:54 <a href="http://www.aygfsteel.com/sonnylys/archive/2008/05/01/197655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>½Ž€å•çš„javascript入门知识http://www.aygfsteel.com/sonnylys/archive/2008/04/27/196669.htmlSonny LiSonny LiSun, 27 Apr 2008 14:53:00 GMThttp://www.aygfsteel.com/sonnylys/archive/2008/04/27/196669.htmlhttp://www.aygfsteel.com/sonnylys/comments/196669.htmlhttp://www.aygfsteel.com/sonnylys/archive/2008/04/27/196669.html#Feedback2http://www.aygfsteel.com/sonnylys/comments/commentRss/196669.htmlhttp://www.aygfsteel.com/sonnylys/services/trackbacks/196669.html     一ä¸?JavaScript ½E‹åºå…¶å®žæ˜¯ä¸€ä¸ªæ–‡æ¡£ï¼Œä¸€ä¸ªæ–‡æœ¬æ–‡ä»Óž¼Œå®ƒåµŒå…¥åˆ° HTML 文档中执行。所以,一般的本文¾~–辑器就可以实现¾~–写javascript代码ã€?br />    1、将javascript嵌入到HTML文档中,一般有两种实现æ–ÒŽ³•。一¿Uæ˜¯ç›´æŽ¥åœ¨HTML文档中的ä»ÖM½•地方加入<script>
  <!--ä½ çš„js代码-->
</script>
值得注意的是åQŒjs代码必须åœ?lt;frameset>之前插入才有效ã€?br /> 另一¿Uæ˜¯ž®†js代码写在一个以 .js为后¾~€çš„jsæ–‡äšg里,用以下方法引入到HMTL档供使用
 <script src="你要引入çš?jsæ–‡äšgçš„èµ\å¾? type="text/javascript"></script>
˜q™ä¸¤¿Uå®žçŽ°çš„ä¾‹å­å¦‚ä¸‹åQ?br /> <html>
 <head>
   <title>js exmaple</title>
 <!--直接在HMTL文档中写js代码--> 
  <script> 
      function  sayHello() {
          alert("hello");
     }
   </script>
 <!--ä»?jsæ–‡äšg中加è½?->
  <script src="myjs/util.js"></script>
  </head>
 <body>
</body>
</html>
2、变量声æ˜?br />   javascript中用 var关键字声明一个变量,如:var userName;ç”׃ºŽjavascript使用的是å¼Þq±»åž‹ï¼Œæ‰€ä»¥å£°æ˜Žæ—¶ä¸éœ€è¦æŒ‡å®šå…·ä½“类型,在运行时会根据所赋的值检查其数据¾cÕdž‹ã€‚比如声æ˜?var v; åœ¨è¿è¡Œä¸­å¦‚果出现v = 123;那么变量v指数值类型,如果˜qè¡Œä¸­å‡ºçŽ°çš„æ˜¯v = "123"åQŒv 为字½W¦ä¸²¾cÕdž‹ã€?br /> 3、函数声明,介绍两种型式
  一、function sayHello(who) { //who为参æ•?br />               alert("say hello to: " + who);
         }
  äºŒã€var sayHello = function(who) {
               alert("say hello to: " + who);
         }
  è¯´æ˜ŽåQšç¬¬äºŒç§å£°æ˜Žæ–¹å¼æ˜¯å°†å‡½æ•°çš„æŒ‡é’ˆèµ‹¾l™ä¸€ä¸ªå˜é‡ï¼Œè°ƒç”¨å¦‚下åQšsayHello("whoOne");和第一¿Uå£°æ˜Žæ–¹å¼è°ƒç”¨ä¸€æ —÷€‚ä‹D个第二种声明方式有用的应用,如,在js代码中,¾l™ä¸€ä¸ªé“µé’®çš„onclick事äšg注册一个方法可以如下声明:    var btn = document.createElement("button"); 
              btn.onclick= function() {
                //æ·ÕdŠ å½“ç‚¹å‡ÀL­¤é“µé’®æ—¶æƒ³æ‰§è¡Œçš„js代码
              }
4、事件响åº?br />    声明了的函数可以在js代码里被调用åQŒä¹Ÿå¯ä»¥ç”¨äºŽå“åº”事äšg。如åQ?br />  <html>
 <head>
   <title>js exmaple</title>
 <!--直接在HMTL文档中写js代码--> 
  <script> 
      function  sayHello() {
          alert("hello");
     }
   </script>
  </head>
  <body>
   <!--响应button中的onclick事äšgåQˆå•å‡ÖMº‹ä»Óž¼‰,调用sayHello()æ–ÒŽ³•-->
   <button onclick="sayHello()">点击ž®†è°ƒç”¨sayHello()æ–ÒŽ³•来响åº?lt;/button>
 </body>
</html>
˜qè¡Œä¾‹å­åQŒç‚¹å‡»é“µé’®åŽ˜qè¡Œ¾l“果如下åQ?br />  


备注åQšè¿™æ˜¯ä¸€½‹‡å¾ˆ½Ž€å•çš„javascript相关知识文章åQŒé€‚合对javascript完全没概å¿ëŠš„初学者参考, 有误之处åQŒè¯·æŒ‡æ­£è®¨è®ºã€?br />
  
     
 

  

]]>
Spring与Struts集成开å?/title><link>http://www.aygfsteel.com/sonnylys/archive/2008/03/01/183112.html</link><dc:creator>Sonny Li</dc:creator><author>Sonny Li</author><pubDate>Sat, 01 Mar 2008 03:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/sonnylys/archive/2008/03/01/183112.html</guid><wfw:comment>http://www.aygfsteel.com/sonnylys/comments/183112.html</wfw:comment><comments>http://www.aygfsteel.com/sonnylys/archive/2008/03/01/183112.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sonnylys/comments/commentRss/183112.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sonnylys/services/trackbacks/183112.html</trackback:ping><description><![CDATA[<p><br /> Spring与Struts集成开å?br /> <br /> 最˜q‘å–œ‹Æ¢å°†æ‰€å­¦çš„东西理顺一下,且发现写blog可以达成˜q™ç›®çš„ã€?br /> 那就来整理一下我对Spring与Struts集成开发的一些想法ã€?br /> <br /> 首先¼‹®è®¤¾pȝ»Ÿçš„ç»“æž„äØ“ä¸‰å±‚çš„B/S模式¾l“æž„åQŒå¦‚下图åQ?br /> <img style="width: 514px; height: 339px" height="339" alt="" src="http://www.aygfsteel.com/images/blogjava_net/sonnylys/three.jpg" width="514" border="0" /><br /> 在图中看出,Springå’ŒStruts集成开发中åQŒSpring在业务逻辑层被使用åQˆé›†æˆï¼‰ã€‚因为Spring框架的依赖注入,AOP及可声明的事务管理方面的技术优势,使得用Spring来管理业务实体,实体之间的依赖关¾p»ï¼Œä¸šåŠ¡é€»è¾‘æœåŠ¡æŽ¥å£å˜å¾—½Ž€å•且可配¾|®ã€‚至此我们要清楚åQ?span style="color: red">Springå’ŒStruts集成开发中åQŒSpring在业务逻辑层被使用åQˆé›†æˆï¼‰ã€?/span><br /> <br /> 清楚Strutså’ŒSpring在系¾lŸç»“构中分别充当的角色后åQŒæŽ¥ä¸‹æ¥è¦è®¨è®ºï¼š<span style="color: #000000"><span style="color: #ff0000">如何实现集成</span>åQ?br /> <strong style="color: #0000ff">1、ä‹É用Springçš„ActionSurpert¾c»é›†æˆStrutsã€?/strong><br /> org.springframework.web.struts.ActionSurpert是一个ç‘ô承org.apache.struts.action.Action的类åQŒç®€è¦ä»£ç å¦‚下:<br /> public abstract class ActionSurpert extends Action {<br />      private WebApplicationContext webApplicationContext;<br />      public void setServlet(ActionServlet actionServlet) {//<span style="color: red">当容器实例化此Action时被容器调用<br /> </span>           surper.setServlet(actionServlet);<br />            if(actionServlet != null) {<br />               this.webApplicationContext = initWebApplicationContext(actionServlet);//<span style="color: red">获取webApplicationContext<br /> </span>               //........<br />            }else{<br />              //.......<br />            }           <br />      } <br />      <br />      //通过getXXX()æ–ÒŽ³•获取   webApplicationContext 对象<br />      protected final WebApplictionContext getWebApplicationContext() {<br />             return this.webApplicationContext;<br />     }<br /> }<br /> 通过上述代码可以看出åQŒæ‰€æœ‰ç‘ô承了ActionSupport¾cȝš„Actionž®†å¯ä»¥é€šè¿‡WebApplicationContext对象的getBean(beanKey)æ–ÒŽ³•获得Spring配置文äšg中定义的各种Beanã€?br /> WebApplicationContext要由Web Server来加载,有两¿Uæ–¹æ³•:<br /> åQ‘、通过org.springframework.web.struts.ContextLoaderPlugIn加蝲åQŒContextLoaderPlugIn是个插äšgåQŒéœ€è¦åœ¨Struts配置文äšg中配¾|®ã€?br /> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"><br />    <set-property property = "contextConfigLocation" value="/WEB-INF/applicationContext.xml"></set-property><br /> </plug-in><br /> 2、在web.xmlæ–‡äšg中加è½?br /> <context-param><br />   <param-name>contextConfigLocation</param-name><br />  <param-value>/WEB-INF/applicationContext.xml</param-value><br /> </context-param><br /> <servlet><br />  <servlet-name>context</servlet-name><br /> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-name><br /> <load-on-startup>1</load-on-startup><br /> </servlet><br /> 举个½Ž€å•的例子说明一下相关配¾|®ä¿¡æ¯ï¼š<br /> 假定有ExampleActionåQŒExampleBeanåQŒExampleService˜q™å‡ ä¸ªç±»åQŒå®ƒä»¬å·¥ä½œæµ½E‹æ˜¯åQ?br /> 用户è¯äh±‚ExampleActionåQŒExampleAction调用ExampleService的接口方法对ExampleBean˜q›è¡Œç›¸å…³çš„æ“ä½œã€?br /> 1、applicationContext.xml中配¾|®ç›¸å…³çš„bean信息<br /> <beans><br /> <bean id="<span style="color: red">dataSource</span>" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><br />   <property name="driverClassName"><br />    <value>com.mysql.jdbc.Driver</value><br />   </property><br />   <property name="url"><br />    <value>jdbc:mysql://localhost:3306/ssh?useUnicode=true&amp;characterEncoding=UTF-8</value><br />   </property><br />   <property name="username"><br />    <value>root</value><br />   </property><br />   <property name="password"><br />    <value>root</value><br />   </property><br />  </bean><br /> <bean id="<span style="color: red">exampleBean</span>" class="org.mypackge.beans.ExampleBean"/><br /> <bean id="<span style="color: red">exampleBeanService</span>" class="org.mypackge.services.ExampleService"/>@<br /> </beans><br /> 通过˜q™æ ·é…ç½®åŽï¼Œåœ¨ExampleAction中可以用getWebApplicationContext() 获得webApplicationContext对象åQŒç„¶åŽé€šè¿‡<br /> webApplicationContextçš„getBean(<span style="color: red">beanKey</span>)æ–ÒŽ³•获得相应的bean˜q›è¡Œä¸šåŠ¡å¤„ç†ã€‚æ ‡äº†çº¢è‰²çš„"beanKey"ž®±æ˜¯applicationContext.xmlä¸?lt;bean>元素定义的bean idåQŒå¦‚:webApplicationContext.getBean("<span style="color: red">exampleBeanService</span>")。@<br /> <br /> 当然åQŒExampleAction˜q˜è¦åœ¨stuts-config.xml配置文äšg中配¾|®ï¼Œ˜q™é‡Œä¸ä½œä»‹ç»ã€?br /> <strong style="color: #0000ff">2、ä‹É用Springçš„Action代理集成Struts</strong><br /> ˜q™ç§é›†æˆæ–¹å¼çš„æ ¸å¿ƒæ€æƒ³æ˜¯ï¼Œž®†Struts的配¾|®æ–‡ä»¶ä¸­çš„æ‰€æœ‰Actionçš„type属性设为org.springframwork.web.struts.DelegationActionProxy。当用户è¯äh±‚Actionæ—Óž¼Œž®±æ‰§è¡Œè¿™ä»£ç†åQŒä»£ç†ä¼šåœ¨Spring应用上下文中扑ֈ°çœŸæ­£çš„ActionåQŒç„¶åŽäº¤¾l™å®ƒå¤„理用户的请求。而真正用于处理用戯‚¯·æ±‚çš„Action的配¾|®æ”¾åœ¨äº†Spring的配¾|®æ–‡ä»¶ä¸­ã€‚è¿™æ øP¼ŒStruts中的Action以及其依赖关¾pÕd°±å¯ä»¥ç”¨Spring容器来管理,比如ž®†ä¸šåŠ¡é€»è¾‘å¯¹è±¡æ³¨å…¥åˆ°Action中,供其使用。简单片ŒD?lt;bean<span style="color: #ff99cc"> name="/exampleAction" </span>class="org.myproj.struts.actions.ExampleAction"><br /> ....<br /> </bean><br /> 说明åQšç”¨name属性而不是用id来标识这个Bean,Spring不允许ID中出çŽ?/"åQŒè€Œname可以åQ?name"å±žæ€§å€ÆD¦å’Œstruts-config.xmlæ–‡äšg中相åº?lt;action>元素中的path属性值相å?span style="color: #ff99cc">(<action path="/exampleAction"</span>)åQŒè¿™æ ·Action代理才能扑ֈ°ç›¸åº”çš„Action来处理请求ã€?br /> <br /> ‹Æ¢è¿Žè®¨è®ºåQŒæå‡ºå®è´‰|„è§ã€?br /> <br /> <br /> </p> </span> <img src ="http://www.aygfsteel.com/sonnylys/aggbug/183112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sonnylys/" target="_blank">Sonny Li</a> 2008-03-01 11:08 <a href="http://www.aygfsteel.com/sonnylys/archive/2008/03/01/183112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts与hibernate集成开å?/title><link>http://www.aygfsteel.com/sonnylys/archive/2008/02/29/183017.html</link><dc:creator>Sonny Li</dc:creator><author>Sonny Li</author><pubDate>Fri, 29 Feb 2008 10:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/sonnylys/archive/2008/02/29/183017.html</guid><wfw:comment>http://www.aygfsteel.com/sonnylys/comments/183017.html</wfw:comment><comments>http://www.aygfsteel.com/sonnylys/archive/2008/02/29/183017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sonnylys/comments/commentRss/183017.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sonnylys/services/trackbacks/183017.html</trackback:ping><description><![CDATA[struts与hibernate集成开å?br /> 最˜q‘学习struts与hibernate相关知识åQŒä¸‹é¢æ˜¯ä¸ªäh对struts与hibernate集成开发的一些见解,写出来跟大家共同讨论、学习,‹Æ¢è¿ŽæŒ‡æ•™ã€?br />  è¦é›†æˆstruts与hibernate˜q›è¡Œå¼€å‘,首先应该了解一下strutså’Œhibernate框架各自的工作原理和模式般的开发流½E‹ã€?br /> 首先介绍struts的大概工作流½E‹ï¼Œä¸‹é¢é€šè¿‡ä¸€å¼ struts工作的时序图来说明其工作‹¹ç¨‹åQ?br /> <img height="527" alt="" src="http://www.aygfsteel.com/images/blogjava_net/sonnylys/active.jpg" width="555" border="0" /><br /> Struts工作‹¹ç¨‹åˆ†æžåQ?br /> 1åQ‰Web服务器启动,初始化ActionServlet,è¯Õd–struts-config.xmlæ–‡äšg配置信息åQŒæŠŠ˜q™äº›ä¿¡æ¯åˆ†å‘到相应的对象中ã€?br /> 2åQ‰ç”¨æˆ·å‘凸™¯·æ±‚后åQŒActionServlet接收到请求,查找与请求匹配的Action映射对象åQˆActionMapping)对象是否存在åQŒæ˜¯åQšå°†è¯äh±‚以及Actionform对象传递给相应的Action对象ã€?br /> <span style="color: red"><strong>3åQ‰Action调用业务逻辑服务接口åQŒç»“合ActionFormåQŒå¯¹ç”¨æˆ·çš„请求做出处理ã€?/strong><br /> </span>4åQ‰Action处理完毕˜q”回ActionForward对象¾l™ActionServlet。ActionForward对象包含了è{发目标对象,可以是jsp或Actionã€?br /> 5)ActionServletæ ÒŽ®ActionForward对象的指向ç‘ô¾l­è{发请求,重复从第2步进行处理ã€?br /> è‡Ïx­¤åQŒæˆ‘们对struts 的基本工作流½E‹æœ‰ä¸ªæ•´ä½“的认识åQŒä½†˜q˜æ²¡æhibernate相关的ä“Q何知识,业务逻辑层也只是在第3)点微提一下ã€?br /> <br /> 接下来,我们来看下hibernate是怎样工作的?(注:在这不是讨论åQ¯ï¼²åQ­çš„实现åQŒåªè®¨è®ºæ€Žè®©hibernate˜q™ORM中间件工作)<br /> Hibernate是个独立的框æžÓž¼Œå®ƒä¸ä¾èµ–ä»ÖM½•çš„Web Server或Application ServeråQŒå°±æ˜¯è¯´ä¸éœ€è¦è¿™äº›æ”¯æŒã€?br /> Hibernate有五个核心接口,分别为Configuratoin, SessionFactory, Session,Query及Criteria。通过˜q™äº›æŽ¥å£ž®±å¯ä»¥å®Œæˆhibernate的初始化åQŒå¯¹æŒä¹…化对象进行存取,更新½{‰æ“ä½œã€?br /> 下面½Ž€è¦ä»‹å§‹ä¸€ä¸‹è¿™äº›æŽ¥å£ã€?br /> 1、Configuration接口 是Hibernate应用的入口,在开始ä‹É用Hibernate的各¿UåŠŸèƒ½ä¹‹å‰éœ€è¦å…ˆåˆ›å¾Configuration对象。它负责加蝲Hibernate 应用配置文äšgåQŒå¦‚Configuration cf = new Configuration.configure("com/myproj/hibernate/configs/hibernate.cfg.xml");<br /> 2、SessionFactory接口 ¾~“存了Configuration对象所包含的配¾|®ä¿¡æ¯ï¼Œèƒ½æ ¹æ®æ˜ ž®„信息自动生成SQL语句åQŒåƈ提供生成Session对象的方法ã€?br /> 3、Session接口提供一¾pÕdˆ—持久化的操作ã€?br /> 到此åQŒå¯ä»¥å†™ä¸€ž®æ®µä»£ç æ¥åŠ çœ‹ä¸‹å¦‚ä½•ä½¿ç”¨hibernate<br /> Configuration cf = new Configuration.configure("com/myproj/hibernate/configs/hibernate.cfg.xml");//配置文äšg不在此作介绍<br /> SessionFactory sessionFactory = cf.buildSessionFactory();<br /> Session session = sessionFactory.openSession();<br /> session.update();<br /> session.save();½{‰ç­‰æŒä¹…化操作ã€?br /> è‡Ïx­¤åQŒç®€å•介¾läº†hibernate 是怎样工作的,其实我只惌™®©ä½ æ¸…楚:“<span style="color: red">Hibernate是个独立的框æžÓž¼Œå®ƒä¸ä¾èµ–ä»ÖM½•çš„Web Server或Application ServeråQŒå°±æ˜¯è¯´ä¸éœ€è¦è¿™äº›æ”¯æŒã€?#8221;<br /> </span><br /> 那么åQŒæˆ‘们要回到主题来:如何集成struts与hibernate开发?½{”案很简单:hibernateå’Œstruts本质上是没什么联¾pȝš„åQŒåªè¦ä½ è®îC½åQ?span style="color: red">Hibernate是个独立的框æžÓž¼Œå®ƒä¸ä¾èµ–ä»ÖM½•çš„Web Server或Application Serverã€?/span>用DAO模式把hibernate持久化的操作ž®è£…好,供业务逻辑服务¾c»è°ƒç”¨å°±å¯ä»¥ã€‚回˜q‡å¤´æ¥çœ‹struts工作‹¹æ—¶åºå›¾çš„解释的½W¬ä¸‰ç‚¹ï¼š“<span style="color: red"><strong>3åQ‰Action调用业务逻辑服务接口åQŒç»“合ActionFormåQŒå¯¹ç”¨æˆ·çš„请求做出处理ã€?/strong></span>”åQŒä¸éš‘Ö¾—出:<br /> 用户è¯äh±‚后,struts负责扑ֈ°ç›¸åº”çš„Action对象åQŒAction调用业务逻辑服务接口åQŒä¸šåŠ¡é€»è¾‘æœåŠ¡æŽ¥å£è°ƒç”¨DAO接口(˜q™é‡Œé»˜è®¤çš„实现就用hibernate,当然, ˜q˜å¯ä»¥æœ‰å¤šç§å¯ÒŽ•°æ®åº“操作的实玎ͼ‰<br /> hibernate充当下面˜q™å¼ å›¾ä¸­çš?持久层(DAOåQ?<br /> <img height="468" alt="" src="http://www.aygfsteel.com/images/blogjava_net/sonnylys/bs.jpg" width="535" border="0" /><br /> <br /> ç”׃ºŽæœ¬äh对struts及hibernate认识不深åQŒå†™˜q™ç¯‡æ–‡ç« åªæ˜¯æŠ›ç –引玉åQŒå¸Œæœ›é«˜æ‰‹ä»¬å‘表意见指正错误åQŒå¤šæŒ‡æ•™ã€?br /> <br /> <br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/sonnylys/aggbug/183017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sonnylys/" target="_blank">Sonny Li</a> 2008-02-29 18:44 <a href="http://www.aygfsteel.com/sonnylys/archive/2008/02/29/183017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ͨº£ÏØ</a>| <a href="http://" target="_blank">¶¼°²</a>| <a href="http://" target="_blank">ÎÚÀ¼ÏØ</a>| <a href="http://" target="_blank">ÄÏÕÙÏØ</a>| <a href="http://" target="_blank">ͨº£ÏØ</a>| <a href="http://" target="_blank">³ÉÎäÏØ</a>| <a href="http://" target="_blank">»ªÄþÏØ</a>| <a href="http://" target="_blank">½¹×÷ÊÐ</a>| <a href="http://" target="_blank">ÑâÉ½ÏØ</a>| <a href="http://" target="_blank">ÖζàÏØ</a>| <a href="http://" target="_blank">°²´ïÊÐ</a>| <a href="http://" target="_blank">°×ɽÊÐ</a>| <a href="http://" target="_blank">Ðû»¯ÏØ</a>| <a href="http://" target="_blank">ÆÜϼÊÐ</a>| <a href="http://" target="_blank">²ªÀûÏØ</a>| <a href="http://" target="_blank">²×ÖÝÊÐ</a>| <a href="http://" target="_blank">¿µÂíÏØ</a>| <a href="http://" target="_blank">³Ç¿ÚÏØ</a>| <a href="http://" target="_blank">»³¼¯ÏØ</a>| <a href="http://" target="_blank">ÁÖÖÜÏØ</a>| <a href="http://" target="_blank">²ýÀÖÏØ</a>| <a href="http://" target="_blank">ÃϽòÏØ</a>| <a href="http://" target="_blank">¿â¶ûÀÕÊÐ</a>| <a href="http://" target="_blank">²©°×ÏØ</a>| <a href="http://" target="_blank">³¤É³ÏØ</a>| <a href="http://" target="_blank">ÖñÏªÏØ</a>| <a href="http://" target="_blank">ÆÁ±ß</a>| <a href="http://" target="_blank">ºâÄÏÏØ</a>| <a href="http://" target="_blank">Ñúå¨</a>| <a href="http://" target="_blank">²©°®ÏØ</a>| <a href="http://" target="_blank">ͨÖÝÇø</a>| <a href="http://" target="_blank">Ï¿½­ÏØ</a>| <a href="http://" target="_blank">ÑôÇúÏØ</a>| <a href="http://" target="_blank">Á鱦ÊÐ</a>| <a href="http://" target="_blank">ÑØºÓ</a>| <a href="http://" target="_blank">ǨÎ÷ÏØ</a>| <a href="http://" target="_blank">»ôÁÖ¹ùÀÕÊÐ</a>| <a href="http://" target="_blank">Âí±ß</a>| <a href="http://" target="_blank">ɽ¶«</a>| <a href="http://" target="_blank">°²¹úÊÐ</a>| <a href="http://" target="_blank">½­Ô´ÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>