美麗涵涵童裝店--說我博客名字,給你們打折!
          隨筆 - 82  文章 - 266  trackbacks - 0
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678


          點(diǎn)擊這里給楊愛友發(fā)消息
          美麗涵涵童裝店
          說我博客名字,給你們打折!

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章檔案

          好友的BLOG

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          vim
          1. 刪除行命令
          dd: 刪除游標(biāo)所在的一整行(常用)
          ndd: n為數(shù)字。刪除光標(biāo)所在的向下n行,例如20dd則是刪除光標(biāo)所在的向下20行
          d1G: 刪除光標(biāo)所在到第一行的所有數(shù)據(jù)
          dG: 刪除光標(biāo)所在到最后一行的所有數(shù)據(jù)
          d$: 刪除光標(biāo)所在處,到該行的最后一個(gè)字符
          d0: 那個(gè)是數(shù)字0,刪除光標(biāo)所在到該行的最前面的一個(gè)字符
          x,X: x向后刪除一個(gè)字符(相當(dāng)于[del]按鍵),X向前刪除一個(gè)字符(相當(dāng)于[backspace]即退格鍵) 
          2. 插入命令
          I 在當(dāng)前行首插入
          A 在當(dāng)前行尾插入
          o 在當(dāng)前行之后插入一行
          O 在當(dāng)前行之前插入一行
          3. 移動(dòng)命令
          w 向前移動(dòng)一個(gè)單詞(光標(biāo)停在單詞首部),如果已到行尾,則轉(zhuǎn)至下一行行首。此命令快,可以代替l命令。

          b 向后移動(dòng)一個(gè)單詞 2b 向后移動(dòng)2個(gè)單詞
          到指定行,冒號+行號,回車,比如跳到240行就是 :240回車
          Ctrl + e 向下滾動(dòng)一行
          Ctrl + y 向上滾動(dòng)一行
          Ctrl + f 向下滾動(dòng)一屏
          Ctrl + b 向上滾動(dòng)一屏    
          4. 拷貝和粘貼
          yy 拷貝當(dāng)前行
          nyy 拷貝當(dāng)前后開始的n行,比如2yy拷貝當(dāng)前行及其下一行。
          p  在當(dāng)前光標(biāo)后粘貼,如果之前使用了yy命令來復(fù)制一行,那么就在當(dāng)前行的下一行粘貼。
          shift+p 在當(dāng)前行前粘貼
          ...
          posted @ 2019-01-29 13:59 楊愛友 閱讀(194) | 評論 (0)編輯 收藏
          參考文章:
          http://wenku.baidu.com/link?url=kq8VcGwEedCn5hHdSDbPsQrJCapBZje0DRRzyvEOkpqVOEP5XV--dtSL3RNC9a5Mf9K3mSJOGVwYt8VHjpUoBVTQ0L5z3WOSV-dTpSgs-My

          用一張空的U盤,利用支持軟件和ISO鏡像文件制作安裝盤,然后將USB3.0驅(qū)動(dòng)程序放進(jìn)U盤

          在格式化步驟,格式化完之后要加載USB3的驅(qū)動(dòng)程序,否則安裝WIN7后無法使用鼠標(biāo)和鍵盤
          參考文章:http://bbs.feng.com/read-htm-tid-8203477.html

          啟動(dòng)WIN7后,可能出現(xiàn)黑屏“無法驗(yàn)證簽名文件”,把windows\system32\drivers 里面那個(gè)AppleSSD.sys干掉
          參考文章:
          http://bbs.feng.com/read-htm-tid-9791867.html

          最后進(jìn)入WIN7系統(tǒng),此時(shí)之后一個(gè)盤符,需要再進(jìn)行分盤,按照網(wǎng)上介紹,“壓縮卷--新建簡單分區(qū)“進(jìn)行,發(fā)現(xiàn)竟然把原有MAC系統(tǒng)干掉了,這里千萬注意!

          然后就是到bootcamp/drivers下面找一些網(wǎng)絡(luò)、顯卡等的驅(qū)動(dòng)進(jìn)行點(diǎn)擊安裝。
          posted @ 2015-09-25 16:48 楊愛友 閱讀(289) | 評論 (0)編輯 收藏
               摘要: 先在客戶端注冊一個(gè)callback, 然后把callback的名字傳給服務(wù)器。

          此時(shí),服務(wù)器先生成 json 數(shù)據(jù)。
          然后以 javascript 語法的方式,生成一個(gè)function , function 名字就是傳遞上來的參數(shù) jsonp.

          最后將 json 數(shù)據(jù)直接以入?yún)⒌姆绞剑胖玫?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

          客戶端瀏覽器,解析script標(biāo)簽,并執(zhí)行返回的 javascript 文檔,此時(shí)數(shù)據(jù)作為參數(shù),傳入到了客戶端預(yù)先定義好的 callback 函數(shù)里.(動(dòng)態(tài)執(zhí)行回調(diào)函數(shù))
          美麗涵涵童裝店
            閱讀全文
          posted @ 2014-10-29 14:57 楊愛友 閱讀(9378) | 評論 (5)編輯 收藏
               摘要: Spring源代碼解析(一):IOC容器:http://www.javaeye.com/topic/86339
          Spring源代碼解析(二):IoC容器在Web容器中的啟動(dòng):http://www.javaeye.com/topic/86594
          Spring源代碼解析(三):Spring JDBC:http://www.javaeye.com/topic/87034
          Spring源代碼解析(四):Spring MVC:http://www.javaeye.com/topic/87692
          Spring源代碼解析(五):Spring AOP獲取Proxy:http://www.javaeye.com/topic/88187
          美麗涵涵童裝店
            閱讀全文
          posted @ 2014-10-29 14:54 楊愛友 閱讀(2718) | 評論 (0)編輯 收藏
               摘要: 提高淘寶店鋪訪問量辦法  閱讀全文
          posted @ 2014-10-29 14:34 楊愛友 閱讀(4708) | 評論 (0)編輯 收藏
               摘要: Spring源碼學(xué)習(xí)-bean加載
          一個(gè)applicationContext.xml配置文件,這個(gè)不可少
          一個(gè)bean,這里我沒用接口,直接用一個(gè)普通的類做為Spring的bean
          一個(gè)Junit測試類  閱讀全文
          posted @ 2014-08-29 10:47 楊愛友 閱讀(10865) | 評論 (3)編輯 收藏

          學(xué)習(xí)源碼是一件非常耗時(shí)費(fèi)力的事情,需要有足夠的時(shí)間和持久的耐心,下面是我閱讀郝佳老師的《Spring源碼深度解析》所做的記錄,書中以Spring3.2講解,使用jdk1.7。

          準(zhǔn)備工作

          1. 安裝github:現(xiàn)在spring源代碼都在github管理,所以首先需要下載githup,下載地址http://windows.github.com;

          2. 安裝gradle構(gòu)建工具:下載地址http://www.gradle.org/downloads,下載完后進(jìn)行解壓到任意盤符,然后增加環(huán)境變量GRADLE_HOME,并在環(huán)境變量bin中增加%GRADLE_HOME%/bin,打開DOS窗口,運(yùn)行g(shù)radle -v,出現(xiàn)版本號等信息,表示安裝成功;

          3. 下載Spring源碼:首先打開git shell,切換到你的工作目錄,然后輸入以下命令:git clone git://github.com/SpringSource/Spring-framework.git,后面一串是源碼下載地址。大概半小時(shí)的樣子,就可以下載完成,這時(shí)候在你的工作目錄中就會(huì)出現(xiàn)Spring-framework的目錄,里面有Spring各組件的源碼包;

          4. 構(gòu)建導(dǎo)入:下載下來的代碼不能直接導(dǎo)入Eclipse,要先轉(zhuǎn)換成Eclipse能讀取的形式。因?yàn)樗薪M件都會(huì)依賴spring-core,所有我們首先要轉(zhuǎn)換Spring-core工程,在命令窗口切換到Spring-core工程,運(yùn)行g(shù)radle cleanidea eclipse命令,我們會(huì)看到開始下載工程所依賴的jar包,幾分鐘后執(zhí)行完畢,再來看Spring-core文件夾,多了.classpath、.project等文件,這是Eclipse工程所必須的,然后可以把他導(dǎo)入到eclipse。因?yàn)榇蟛糠諷pring組件都會(huì)用到 spring-beans、spring-context、spring-aop,而他們又依賴spring-expression、spring-instrument,所以我們干脆先把這些工程都進(jìn)行轉(zhuǎn)換并導(dǎo)入eclipse。

          我初次導(dǎo)入過程并不順利,拿spring-core為例,其中以來的一個(gè)jar包是Spring-framework/spring-core/build/libs/spring-asm-repack-4.0.jar,但我工程里面并沒有他,只好在網(wǎng)上下載了一個(gè),并加入構(gòu)建路徑,其次我還發(fā)現(xiàn)少commons-pool-1.5.3.jar、spring-cglib-repack-3.0.jar,都一一下載,最后還是報(bào)錯(cuò)沒有java.util.concurrent.ForkJoinPool類,發(fā)現(xiàn)這個(gè)版本必須使用jdk1.7以上,1.6沒有這個(gè)包。折騰半天,終于幾個(gè)工程沒變異錯(cuò)誤了,向前邁進(jìn)了一步。




          posted @ 2014-08-21 16:04 楊愛友 閱讀(5950) | 評論 (2)編輯 收藏

          場景1:aService里面有個(gè)savePerson方法,里面將調(diào)用bService中的保存方法進(jìn)行保存;

              aService代碼:
          @Transactional(propagation=Propagation.REQUIRED)
          public void savePerson() {
          Person p1 = new Person();
          p1.setName("yangay");
          Person p2 = new Person();
          p2.setName("lisan");
          messageBean.saveTwo(p1, p2);
          messageBean.savePerson(null);
          }
               bService代碼:
                @Transactional(propagation=Propagation.REQUIRED)
          public void saveOne(Person p){
          this.dao.save(p);
          }
          @Transactional(propagation=Propagation.REQUIRES_NEW)
          public void saveTwo(Person p1,Person p2){
          this.dao.save(p1);
          this.dao.save(p2);
          }
              因?yàn)閟aveTwo的傳播特性設(shè)置為requires_new,saveTwo方法單獨(dú)起一個(gè)事務(wù),所以當(dāng)調(diào)用saveOne拋出異常之后,不會(huì)影響saveTwo事務(wù)提交,事實(shí)上,在saveTwo返回之前已經(jīng)將事務(wù)提交,所以p1、p2對象能保存入庫;
              如果將saveTwo方法的傳播特性設(shè)置為required,這時(shí)候三個(gè)方法公用一個(gè)事務(wù),當(dāng)saveOne拋出異常后,整個(gè)事務(wù)回滾,數(shù)據(jù)不能入庫;

          場景2:
           aService代碼:
          @Transactional(propagation=Propagation.REQUIRED)
          public void savePerson() {
          try{
          Person p1 = new Person();
          p1.setName("yangay");
          Person p2 = new Person();
          p2.setName("lisan");
          messageBean.saveTwo(p1, null);
          }catch(Exception ex){
          ex.printStackTrace();
          }
          }
           bService代碼:
                  @Transactional(propagation=Propagation.REQUIRED)
          public void saveTwo(Person p1,Person p2){
          this.dao.save(p1);
          this.dao.save(p2);
          }
               因?yàn)楫惓1籧atch了,所以事務(wù)不回滾,p1正常入庫;
          場景3:
           aService代碼:
          @Transactional(propagation=Propagation.REQUIRED)
          public void savePerson() {
          try{
          Person p1 = new Person();
          p1.setName("yangay");
          Person p2 = new Person();
          p2.setName("lisan");
          messageBean.saveOne(p1);
          messageBean.saveTwo(p2, null);
          }catch(Exception ex){
          ex.printStackTrace();
          }
          }
           bService代碼:
                  @Transactional(propagation=Propagation.REQUIRED)
          public void saveOne(Person p){
          this.dao.save(p);
          }
          @Transactional(propagation=Propagation.REQUIRED)
          public void saveTwo(Person p1,Person p2){
          this.dao.save(p1);
          this.dao.save(p2);
          }
                  開始以為有了try catch,p1能保存進(jìn)去,但經(jīng)過測試,發(fā)現(xiàn)會(huì)報(bào)錯(cuò)。因?yàn)閟aveTwo時(shí)拋出異常,首先被spring框架個(gè)catch住,將事務(wù)標(biāo)記為rollbackonly,然再往出拋異常,最后被savePerson方法catch住,所以事務(wù)能夠提交,但當(dāng)提交的時(shí)候,發(fā)現(xiàn)標(biāo)志位已經(jīng)被設(shè)置了,不應(yīng)該去提交了,然后吭哧吭哧的回滾調(diào),再提示你已經(jīng)被設(shè)置成rollback-only了。
                  但如果saveTwo的傳播特性改為require_new,因?yàn)樗麊纹鹨粋€(gè)事務(wù),不會(huì)影響父事務(wù)的提交,所以p1能保存,p2失??;

          場景4:
          事務(wù)在多個(gè)對象之間才有傳播特性
          @Override
          public void savePerson() {
          Person p1 = new Person();
          p1.setName("yangay");

          Person p2 = new Person();
          p2.setName("lisan");

          saveTwo(p1,null);
          }

          @Transactional(propagation=Propagation.REQUIRED)
          public void saveTwo(Person p1,Person p2){
          messageBean.saveOne(p1);
          messageBean.saveOne(p2);
          }
              兩個(gè)方法在一個(gè)類里面,saveTwo并沒有事務(wù),p1能提交;但如果把saveTwo放到另外一個(gè)類,則saveTwo就會(huì)有事務(wù),p1不能提交;
              如果要同一個(gè)類里面的saveTwo執(zhí)行事務(wù),可在配置文件增加<aop:aspectj-autoproxy expose-proxy="true"/>,然后((Iservice)AopContext.currentProxy()).saveTwo(),這樣執(zhí)行的就是代理的方法,就會(huì)有事務(wù)(Iservice必須是你定義的接口)
          posted @ 2014-08-08 15:43 楊愛友 閱讀(2744) | 評論 (0)編輯 收藏
          當(dāng)我把jboss/client下的所有jar和ejb工程jar方到web工程下,編寫main函數(shù)可以調(diào)用到EJB的bean,而將web工程發(fā)布出去后,就調(diào)用不到了,報(bào)錯(cuò)“javax.naming.NameNotFoundException: xxx not bound”,折騰了五六個(gè)小時(shí),網(wǎng)上說了各種各樣的原因,都沒能解決,最后看這位兄弟的文章,問題才得以解決。
          http://blog.163.com/zzk331@126/blog/static/142674599200957111441126/
          如果你的問題解決了,請回復(fù)我!
          posted @ 2014-05-28 16:56 楊愛友 閱讀(6291) | 評論 (0)編輯 收藏
               摘要: 來到互聯(lián)網(wǎng)公司,需要開發(fā)EJB程序,用兩天的時(shí)間先學(xué)習(xí)了EJB的開發(fā)流程,我用的開發(fā)環(huán)境是myeclipse、jboss4.2、ejb3.0、struts1.3.8、jkd6、oracle、JPA,頁面展現(xiàn)用到velocity。其實(shí)這不是一個(gè)春對ejb的學(xué)習(xí)文章,因?yàn)槔锩嫔婕傲烁鷈jb無關(guān)的struts、velocity,如果單純學(xué)習(xí)寫ejb的helloword,數(shù)據(jù)庫都不用連接,下面我描述下helloword程序的實(shí)現(xiàn)過程。
          雖然技術(shù)含量不高,但寫的很辛苦,需要占用首頁一個(gè)位置。  閱讀全文
          posted @ 2014-05-28 15:28 楊愛友 閱讀(5789) | 評論 (4)編輯 收藏
          <!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 charset="utf-8">
          <style>

          </style>
          </head>

          <body>
              <div>
                  <div id="chartdiv1" style="width: 300px; height: 300px;float:left;border: 1px solid red;"></div>
                  <div id="chartdiv2" style="width: 300px; height: 300px;float:right;border: 1px solid red;"></div>
                  <div style="clear:left;"></div>

                  <div id="chartdiv3" style="width: 300px; height: 300px;float:left;border: 1px solid blue;"></div>
                  <div id="chartdiv4" style="width: 300px; height: 300px;float:right;border: 1px solid blue;"></div>
              </div>


          </body>

          </html>
          posted @ 2013-10-09 16:25 楊愛友 閱讀(1366) | 評論 (0)編輯 收藏
               摘要: 地心坐標(biāo)系(geocentric cs、GEOCCS):以地球中心為原點(diǎn),直接用X、Y、Z來進(jìn)行位置的描述,無需模擬地球球面,常用在GPS中。
          地理坐標(biāo)系(geographic cs、GEOGCS):帶Datum的橢球面坐標(biāo)系,單位經(jīng)度、緯度,高程用作第三維。參數(shù):橢球體、基準(zhǔn)面。
          投影坐標(biāo)系(projected cs、PROJCS):平面坐標(biāo)系,單位米、英尺等,它用X(Easting)、Y(Northing)來描述地球上某個(gè)點(diǎn)的位置。它對應(yīng)于某個(gè)地理坐標(biāo)系,在UML中表示屬于1對多的關(guān)系,1個(gè)地理坐標(biāo)系經(jīng)過不同的投影方式可產(chǎn)生多個(gè)投影坐標(biāo)系。參數(shù):地理坐標(biāo)系、投影方式。  閱讀全文
          posted @ 2013-06-26 16:10 楊愛友 閱讀(1367) | 評論 (0)編輯 收藏
          1. 說出常用的GIS平臺(tái),arcgis的產(chǎn)品線?
          2. 地理坐標(biāo)系、投影坐標(biāo)系和地心坐標(biāo)系的概念?
          3. 描述一下矢量數(shù)據(jù)和柵格數(shù)據(jù),以及各自應(yīng)用的領(lǐng)域?
          posted @ 2013-06-26 15:53 楊愛友 閱讀(207) | 評論 (0)編輯 收藏
          【轉(zhuǎn)自:http://www.aygfsteel.com/Alpha/archive/2009/06/27/284373.html
          Flex中As調(diào)用Js的方法是:

               1、導(dǎo)入包 (import flash.external.ExternalInterface;)
               2、使用ExternalInterface.call("Js函數(shù)名稱",參數(shù))進(jìn)行調(diào)用,其返回的值就是Js函數(shù)所返回的值
           
          Js調(diào)用As的方法是:
               1、導(dǎo)入包 (import flash.external.ExternalInterface;)
               2、在initApp中使用ExternalInterface.addCallback("用于Js調(diào)用的函數(shù)名",As中的函數(shù)名)進(jìn)行注冊下
               3、js中 就可以用document.getElementById("Flas在Html中的ID").注冊時(shí)設(shè)置的函數(shù)名(參數(shù))進(jìn)行調(diào)用
          posted @ 2013-06-26 15:44 楊愛友 閱讀(218) | 評論 (0)編輯 收藏
          關(guān)于js中target與currentTarget的區(qū)別的關(guān)鍵在于他們所處在的事件流的階段是不一樣的,target處于事件流的目標(biāo)階段,currentTarget處理事件流的捕獲、目標(biāo)階段和冒泡階段。只有當(dāng)他們同事處于目標(biāo)階段的時(shí)候他們的指向才是一樣的,請看以下代碼:
          <!DOCTYPE HTML>
          <html>
          <head>
          <meta charset="utf-8" />
          <title>js性能優(yōu)化</title>
          </head>
          <body> 
              <div id="outer">
                  outer
                  <p>
                      inner
                  </p>
              </div>
          </body>
          <script type="text/javascript">
          (
          function(){
              
          var a=document.getElementById('outer');
                  a.addEventListener('click',
          function(e){
                  alert(e.target.innerHTML);
                  alert(e.currentTarget.innerHTML);
                  alert(e.currentTarget 
          === e.target);
              },
          false);
          })();
          </script>
          </html>
          posted @ 2013-06-26 15:34 楊愛友 閱讀(336) | 評論 (0)編輯 收藏

          【轉(zhuǎn)載自http://apps.hi.baidu.com/share/detail/33880627

            地質(zhì)學(xué)范疇,是指平均海平面通過大陸延伸勾畫出的一個(gè)封閉連續(xù)的封閉曲面。

            大地水準(zhǔn)面是由靜止海水面并向大陸延伸所形成的不規(guī)則的封閉曲面。它是重力等位面,即物體沿該面運(yùn)動(dòng)時(shí),重力不做功(如水在這個(gè)面上是不會(huì)流動(dòng)的)。大地水準(zhǔn)面是描述地球形狀的一個(gè)重要物理參考面,也是海拔高程系統(tǒng)的起算面。大地水準(zhǔn)面的確定是通過確定它與參考橢球面的間距--大地水準(zhǔn)面差距(對于似大地水準(zhǔn)面而言,則稱為高程異常)來實(shí)現(xiàn)的。大地水準(zhǔn)面和海拔高程等參數(shù)和概念在客觀世界中無處不在,在國民經(jīng)濟(jì)建設(shè)中起著重要的作用。

              其實(shí),大地水準(zhǔn)面也是一個(gè)很不規(guī)則的曲面,

            大地水準(zhǔn)面包圍的球體稱為大地球體。大地球體的長半軸為6378.245公里,短半軸為6356.863公里。從大地水準(zhǔn)面起算的陸地高度,稱為絕對高度或海拔。

              用于盡可能與大地水準(zhǔn)面密合的一個(gè)橢球曲面,是人為確定的。橢球體與大地基準(zhǔn)面之間的關(guān)系是一對多的關(guān)系,也就是基準(zhǔn)面是在橢球體基礎(chǔ)上建立的,但橢球體不能代表基準(zhǔn)面,同樣的橢球體能定義不同的基準(zhǔn)面,如前蘇聯(lián)的Pulkovo 1942、非洲索馬里的Afgooye基準(zhǔn)面都采用了Krassovsky橢球體,但它們的大地基準(zhǔn)面顯然是不同的。

              理解:橢球面和地球肯定不是完全貼合的,因而,即使用同一個(gè)橢球面,不同的地區(qū)由于關(guān)心的位置不同,需要最大限度的貼合自己的那一部分,因而大地基準(zhǔn)面就會(huì)不同。

              地圖坐標(biāo)系由大地基準(zhǔn)面和地圖投影確定,大地基準(zhǔn)面是利用特定橢球體對特定地區(qū)地球表面的逼近,因此每個(gè)國家或地區(qū)均有各自的大地基準(zhǔn)面,我們通常稱謂的北京54坐標(biāo)系、西安80坐標(biāo)系實(shí)際上指的是我國的兩個(gè)大地基準(zhǔn)面。我國參照前蘇聯(lián)從1953年起采用克拉索夫斯基(Krassovsky)橢球體建立了我國的北京54坐標(biāo)系,1978年采用國際大地測量協(xié)會(huì)推薦的IAG 75地球橢球體建立了我國新的大地坐標(biāo)系--西安80坐標(biāo)系, 目前GPS定位所得出的結(jié)果都屬于WGS84坐標(biāo)系統(tǒng),WGS84基準(zhǔn)面采用WGS84橢球體,它是一地心坐標(biāo)系,即以地心作為橢球體中心的坐標(biāo)系。因此相對同一地理位置,不同的大地基準(zhǔn)面,它們的經(jīng)緯度坐標(biāo)是有差異的。 

              一般我們所說的WGS84就是指那個(gè)基準(zhǔn)面。

           

          posted @ 2011-09-05 14:50 楊愛友 閱讀(1453) | 評論 (0)編輯 收藏
               摘要: 新加行:這個(gè)帖子發(fā)帖8年來,已經(jīng)為太多的朋友解決了問題,不用感謝我,請?jiān)试S我在這里打個(gè)廣告:美麗涵涵童裝店,說我博客名字,給你們打折。
          restlet入門、示例,賦有源碼,下載可直接運(yùn)行  閱讀全文
          posted @ 2011-07-22 16:39 楊愛友 閱讀(8684) | 評論 (2)編輯 收藏
               摘要: JAVA體系結(jié)構(gòu)包括四個(gè)獨(dú)立但相關(guān)的部分:
          java程序設(shè)計(jì)語言、Java class文件格式、Java應(yīng)用編程接口API、Java虛擬機(jī)  閱讀全文
          posted @ 2011-06-01 22:57 楊愛友 閱讀(361) | 評論 (0)編輯 收藏
               摘要: 今年10.18號,有幸參北京國際馬拉松,這一興奮的日子,終生難忘。
          過程很累人,意義很重大,回憶很美好。明年我一定會(huì)再去。
            閱讀全文
          posted @ 2009-10-30 00:38 楊愛友 閱讀(272) | 評論 (0)編輯 收藏
          不知道各位用過ScriptX控件做過打印功能沒有。我現(xiàn)在的情況是:
          前段時(shí)間所有客戶機(jī)打印都正常,最近幾天,有部分客戶陸續(xù)不能使用打印功能了,報(bào)腳本錯(cuò)誤。
          我這里現(xiàn)在是正常的,那么導(dǎo)致那些客戶機(jī)不能打印的原因大概是什么呢?我機(jī)子是正常的。
          posted @ 2009-08-14 15:11 楊愛友 閱讀(2339) | 評論 (1)編輯 收藏
          目前我的項(xiàng)目中系統(tǒng)生成了訂單(JSP頁面),這個(gè)訂單要通過郵件發(fā)送給供應(yīng)商,總不能粘一段html文字發(fā)給供應(yīng)商吧。
          于是考慮導(dǎo)出成excel,將excel文件發(fā)送出去,但客戶覺得excel文件太容易更改,要求生成PDF或圖片等不太容易改的文檔。
          現(xiàn)在的問題是:我如何生成這個(gè)PDF文檔?
          考慮過用iText,通過java創(chuàng)建PDF文檔,但發(fā)現(xiàn)太繁瑣了,在一天的時(shí)間內(nèi)很難做出個(gè)像樣的報(bào)表。
          那么請問大俠們,我應(yīng)該通過什么方式生成這個(gè)“不太容易改”的文檔呢?
          能否給點(diǎn)itext的一些資料或你們寫過的代碼。
          posted @ 2009-06-19 01:40 楊愛友 閱讀(2078) | 評論 (19)編輯 收藏
               摘要: 使用itext生成pdf  閱讀全文
          posted @ 2009-06-18 12:04 楊愛友 閱讀(2794) | 評論 (0)編輯 收藏
               摘要: 使用itext生成pdf  閱讀全文
          posted @ 2009-06-15 23:34 楊愛友 閱讀(1739) | 評論 (0)編輯 收藏
               摘要: struts1,webwork,struts2簡介  閱讀全文
          posted @ 2009-06-09 17:15 楊愛友 閱讀(326) | 評論 (0)編輯 收藏

          開發(fā)模式為struts、hibernate、jstl等。
          在一個(gè)項(xiàng)目中,涉及到很多字典型數(shù)據(jù),如水庫規(guī)模(大、中、小)、土壤類型(酸性、堿性、粘性)、工程類型(橋梁、水閘、公路)等。
          那么在數(shù)據(jù)庫中如何來存儲(chǔ)這些字典型數(shù)據(jù)呢?若水庫規(guī)模、土壤類型、工程類型等各建一張表,太繁瑣了吧!若將他們都存到一張“字典”表中,那水庫、土壤、工程表將不能設(shè)置外鍵,規(guī)模字段只能存儲(chǔ)一個(gè)規(guī)模ID標(biāo)志,在查詢出水庫列表后,在頁面中只能獲得各水庫的規(guī)模ID,卻無法獲取規(guī)模的名稱。
          posted @ 2009-04-10 15:37 楊愛友 閱讀(1472) | 評論 (2)編輯 收藏
          開發(fā)模式為struts、hibernate、jstl等。
          在一個(gè)項(xiàng)目中,涉及到很多字典型數(shù)據(jù),如水庫規(guī)模(大、中、小)、土壤類型(酸性、堿性、粘性)、工程類型(橋梁、水閘、公路)等。
          那么在數(shù)據(jù)庫中如何來存儲(chǔ)這些字典型數(shù)據(jù)呢?若水庫規(guī)模、土壤類型、工程類型等各建一張表,太繁瑣了吧!若將他們都存到一張“字典”表中,那水庫、土壤、工程表將不能設(shè)置外鍵,規(guī)模字段只能存儲(chǔ)一個(gè)規(guī)模ID標(biāo)志,在查詢出水庫列表后,在頁面中只能獲得各水庫的規(guī)模ID,卻無法獲取規(guī)模的名稱。
          posted @ 2009-04-10 15:34 楊愛友 閱讀(432) | 評論 (0)編輯 收藏


          一、spring
          1.ContextLoaderListener
             它作用就是啟動(dòng)Web容器時(shí),自動(dòng)裝配ApplicationContext的配置信息。因?yàn)樗鼘?shí)現(xiàn)了ServletContextListener這個(gè)接口,在web.xml配置這個(gè)監(jiān)聽器,啟動(dòng)容器時(shí),就會(huì)默認(rèn)執(zhí)行它實(shí)現(xiàn)的方法。在ContextLoaderListener中關(guān)聯(lián)了ContextLoader這個(gè)類,所以整個(gè)加載配置過程由ContextLoader來完成。ContextLoader創(chuàng)建的是 XmlWebApplicationContext這樣一個(gè)類,它實(shí)現(xiàn)的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->BeanFactory這樣一來spring中的所有bean都由這個(gè)類來創(chuàng)建。如果在web.xml中不寫任何參數(shù)配置信息,默認(rèn)的路徑是"/WEB-INF/applicationContext.xml,在WEB-INF目錄下創(chuàng)建的xml文件的名稱必須是applicationContext.xml。如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個(gè)context參數(shù):
           <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring/*.xml</param-value>
           </context-param>
          2.default-autowire
                在spring容器內(nèi)拼湊bean叫作裝配。裝配bean的時(shí)候,你是在告訴容器,需要哪些bean,以及容器如何使用依賴注入將它們配合在一起。而default-autowire設(shè)置了bean的默認(rèn)裝配方式。
          我們常常使用<ref>標(biāo)簽為JavaBean注入它依賴的對象。但是對于一個(gè)大型的系統(tǒng),這個(gè)操作將會(huì)耗費(fèi)我們大量的資源,我們不得不花費(fèi)大量的時(shí)間和精力用于創(chuàng)建和維護(hù)系統(tǒng)中的<ref>標(biāo)簽。我們可以通過指定autowire來讓容器為受管JavaBean自動(dòng)注入依賴對象。
          byName:通過屬性的名字的方式查找JavaBean依賴的對象并為其注入。比如說類UserAction有個(gè)屬性userService,Spring IoC容器會(huì)在配置文件中查找id/name屬性為userService的bean,然后使用Seter方法為其注入。
          注意:在配置bean時(shí),<bean>標(biāo)簽中Autowire屬性的優(yōu)先級比其上級標(biāo)簽<beans/>高,即是說,如果在上級標(biāo)簽中定義default-autowire屬性為byName,而在<bean>中定義為byType時(shí),Spring IoC容器會(huì)優(yōu)先使用<bean>標(biāo)簽的配置。
          3.default-lazy-init
            加載spring bean時(shí),默認(rèn)采用的延遲策略。
          二、Hibernate
          1.load和get
            a.如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出一個(gè)  ObjectNotFoundException。
            b.Load方法可返回實(shí)體的代理類實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
            c.load方法可以充分利用內(nèi)部緩存和二級緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如沒有發(fā)現(xiàn)對應(yīng)數(shù)據(jù),將越過二級緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。
          2.對象的三種狀態(tài)
          Hibernate的對象有3種狀態(tài),分別為:瞬時(shí)態(tài)(Transient)、 持久態(tài)(Persistent)、脫管態(tài)(Detached)。
            瞬時(shí)態(tài):
          由new命令開辟內(nèi)存空間的java對象,
              如:Person person = new Person("xxx", "xx");
          瞬時(shí)對象在內(nèi)存孤立存在,不和數(shù)據(jù)庫的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系,在Hibernate中,可通過session的save()或saveOrUpdate()方法將瞬時(shí)對象與數(shù)據(jù)庫相關(guān)聯(lián),并將數(shù)據(jù)對應(yīng)的插入數(shù)據(jù)庫中,此時(shí)該瞬時(shí)對象轉(zhuǎn)變成持久化對象。

          持久態(tài):
               處于該狀態(tài)的對象在數(shù)據(jù)庫中具有對應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識。如果是用hibernate的delete()方法,對應(yīng)的持久對象就變成瞬時(shí)對象。

                 當(dāng)一個(gè)session執(zhí)行close()或clear()、evict(po)之后,持久對象變成脫管對象,此時(shí)持久對象會(huì)變成脫管對象,此時(shí)該對象雖然具有數(shù)據(jù)庫識別值,但它已不在HIbernate持久層的管理之下。

                 持久對象具有如下特點(diǎn):

                 1. 和session實(shí)例關(guān)聯(lián);

                 2. 在數(shù)據(jù)庫中有與之關(guān)聯(lián)的記錄。

          脫管態(tài):
             當(dāng)與某持久對象關(guān)聯(lián)的session被關(guān)閉后,該持久對象轉(zhuǎn)變?yōu)槊摴軐ο蟆?br />        1. 本質(zhì)上與瞬時(shí)對象相同,在沒有任何變量引用它時(shí),JVM會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⑺厥眨?/p>

                 2. 比瞬時(shí)對象多了一個(gè)數(shù)據(jù)庫記錄標(biāo)識值。
          2.名詞解釋
           a.persist把一個(gè)瞬態(tài)的實(shí)例持久化,但是并"不保證"標(biāo)識符(identifier主鍵對應(yīng)的屬性)被立刻填入到持久化實(shí)例中,標(biāo)識符的填入可能被推遲到flush的時(shí)候。
           b.clear完整的清除session緩存
           c.evcit(obj)把某個(gè)持久化對象從session的緩存中清空。
           d.persist只能持久化一個(gè)瞬時(shí)態(tài)的對象,
          三、java
          1.格式化日期
            SimpleDateFormat format = new SimpleDateFormat("yyyy年M月d日");
            format.format(date);
            用一個(gè)M、d則到月份日期為10一下時(shí),只顯示一位,避免出現(xiàn)01月02日的情況。
            年可以用四位也可以用二位。
          2.JDBC操作
            a.連接數(shù)據(jù)庫:
              Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
              Connection conn = DriverManager.getConnection(url, userName, password);
              Statement stmt = conn .getStatement();
              ResultSet rs = stmt.executeQuery(sql);
              while(rs.next()){
           System.out.println(rs.getInt("userId"));
           System.out.println(rs.getString("userName"));
              }

           


           

          posted @ 2009-04-03 13:14 楊愛友 閱讀(271) | 評論 (0)編輯 收藏
               摘要: 2008年就這樣的走了, 時(shí)間過得太快了,太快了!  閱讀全文
          posted @ 2009-01-14 16:49 楊愛友 閱讀(261) | 評論 (0)編輯 收藏
               摘要: 我向來寬宏大量,對人對社會(huì)一副很積極的心態(tài),沒有埋怨過誰,在同事中,你是第一個(gè)。
          今天的事情,讓我很郁悶,我不想以此來改變我對人、對事、對社會(huì)的態(tài)度,但這件事,我不會(huì)忘記,會(huì)作為一個(gè)警鐘,時(shí)刻敲醒我昏沉沉的頭腦。  閱讀全文
          posted @ 2009-01-08 00:09 楊愛友 閱讀(298) | 評論 (0)編輯 收藏
               摘要: 新加行:這個(gè)帖子發(fā)帖8年來,已經(jīng)為太多的朋友解決了問題,不用感謝我,請?jiān)试S我在這里打個(gè)廣告:美麗涵涵童裝店,說我博客名字,給你們打折。
          Spring,hibernate,struts的面試筆試題(含答案)  閱讀全文
          posted @ 2008-12-16 07:57 楊愛友 閱讀(4144) | 評論 (0)編輯 收藏
               摘要: supermap QQ群:4578330,歡迎加入!   閱讀全文
          posted @ 2008-12-16 06:59 楊愛友 閱讀(1565) | 評論 (2)編輯 收藏
               摘要: Java編程經(jīng)驗(yàn)匯總

          絕對好文,轉(zhuǎn)載的!

          一個(gè)計(jì)算機(jī)專業(yè)學(xué)生幾年的編程經(jīng)驗(yàn)匯總

          絕對好文,該系列一共11篇,斑竹可以考慮置頂,各位壇友看完之后,java基礎(chǔ)絕對有不小的提升!
            閱讀全文
          posted @ 2008-12-12 11:47 楊愛友 閱讀(3712) | 評論 (4)編輯 收藏
               摘要: 根據(jù)剛剛學(xué)習(xí)的心理體會(huì)總結(jié)出的配置流程,里面介紹了Flex工程的建立,遠(yuǎn)程方法調(diào)用的配置等相關(guān)知識,附有的demo源文件,可以自行下載。其他要用到的一些包、開發(fā)工具,如果有需要,可QQ我。  閱讀全文
          posted @ 2008-12-02 07:23 楊愛友 閱讀(3536) | 評論 (4)編輯 收藏
               摘要: 使用對象:初次接觸Arcgis,沒有安裝配置過Arcgis、servlet的初學(xué)者。  閱讀全文
          posted @ 2008-11-28 11:30 楊愛友 閱讀(2440) | 評論 (0)編輯 收藏
               摘要: 關(guān)于類加載的問題。為什么打印結(jié)果是1和0呢?  閱讀全文
          posted @ 2008-10-28 15:26 楊愛友 閱讀(1385) | 評論 (9)編輯 收藏
               摘要: 最近項(xiàng)目要開發(fā)大量報(bào)表,要找一個(gè)合適的報(bào)表工具。要使用戶能夠在客戶端,根據(jù)需要定制待打印報(bào)表的樣式和要顯示的字段內(nèi)容。求各位朋友推薦一款免費(fèi)的報(bào)表定制工具。  閱讀全文
          posted @ 2008-10-28 09:50 楊愛友 閱讀(294) | 評論 (1)編輯 收藏
               摘要: 要娶媳婦兒啦  閱讀全文
          posted @ 2008-10-26 00:22 楊愛友 閱讀(512) | 評論 (5)編輯 收藏
               摘要: 轉(zhuǎn)載于【http://www.aygfsteel.com/JAVA-HE/archive/2008/10/17/235066.html】  閱讀全文
          posted @ 2008-10-22 11:58 楊愛友 閱讀(263) | 評論 (0)編輯 收藏
               摘要: 怎么判斷用戶對當(dāng)前頁面只有查詢權(quán)限,而不能做“修改、刪除”等操作。  閱讀全文
          posted @ 2008-10-22 11:44 楊愛友 閱讀(2093) | 評論 (12)編輯 收藏
               摘要: 轉(zhuǎn)載于【http://java.chinaitlab.com/line/373702.html】
          一個(gè)進(jìn)程就是一個(gè)執(zhí)行中的程序,而每一個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一組系統(tǒng)資源.在進(jìn)程概念中,每一個(gè)進(jìn)程的內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的。線程與進(jìn)程相似,是一段完成某個(gè)特定功能的代碼,是程序中單個(gè)順序的流控制;但與進(jìn)程不同的是,同類的多個(gè)線程是共享一塊內(nèi)存空間和一組系統(tǒng)資源。  閱讀全文
          posted @ 2008-10-21 00:35 楊愛友 閱讀(1593) | 評論 (0)編輯 收藏
               摘要: Spring提供了一個(gè)發(fā)送電子郵件的高級抽象層,它向用戶屏蔽了底層郵件系統(tǒng)的一些細(xì)節(jié),同時(shí)負(fù)責(zé)低層次的代表客戶端的資源處理。Spring郵件抽象層的主要包為org.springframework.mail。它包括了發(fā)送電子郵件的主要接口MailSender和 封裝了簡單郵件的屬性如from, to,cc, subject, text的值對象叫做SimpleMailMessage。
          首先:我們定義一個(gè)發(fā)送郵件的接口:IMailManager.java。
            閱讀全文
          posted @ 2008-10-20 00:12 楊愛友 閱讀(1355) | 評論 (1)編輯 收藏
               摘要: 各種企業(yè)應(yīng)用幾乎都會(huì)碰到任務(wù)調(diào)度的需求,就拿論壇來說:每隔半個(gè)小時(shí)生成精華文章的RSS文件,每天凌晨統(tǒng)計(jì)論壇用戶的積分排名,每隔30分鐘執(zhí)行鎖定用戶解鎖任務(wù)。對于一個(gè)典型的MIS系統(tǒng)來說,在每月1號凌晨統(tǒng)計(jì)上個(gè)月各部門的業(yè)務(wù)數(shù)據(jù)生成月報(bào)表,每半個(gè)小時(shí)查詢用戶是否已經(jīng)有快到期的待處理業(yè)務(wù)……,這樣的例子俯拾皆是,不勝枚舉。
          Quartz 在開源任務(wù)調(diào)度框架中的翹首,它提供了強(qiáng)大任務(wù)調(diào)度機(jī)制,難能可貴的是它同時(shí)保持了使用的簡單性。Spring進(jìn)一步降低了使用Quartz的難度,能以更具Spring風(fēng)格的方式使用Quartz。  閱讀全文
          posted @ 2008-10-18 22:58 楊愛友 閱讀(25225) | 評論 (9)編輯 收藏
               摘要:
          1.public、protected、private以及默認(rèn)類型變量作用域考查;
          2.String類型對象創(chuàng)建及內(nèi)存分配知識;
          3.set與list唯一性考查;
          4.構(gòu)造函數(shù)的調(diào)用順序;
          5.java參數(shù)傳遞;  閱讀全文
          posted @ 2008-10-17 23:24 楊愛友 閱讀(407) | 評論 (0)編輯 收藏
               摘要:
          1. this指針是一個(gè)動(dòng)態(tài)變化的變量,它表明了當(dāng)前運(yùn)行該函數(shù)的對象;
          2. 一個(gè)方法(集合元素)由誰調(diào)用,this指針就指向誰;
          3. 對象名可以起到一個(gè)命名空間的作用。

            閱讀全文
          posted @ 2008-08-06 22:33 楊愛友 閱讀(737) | 評論 (0)編輯 收藏

          一種配置情況是:

          <convert converter="bean" match="com.hengyu.bean.project.*" />

          大家都知道,當(dāng)hibernate里面配置上lazy="true"時(shí),查詢對象A時(shí),不會(huì)去查詢于A相關(guān)聯(lián)的B、C、D等對象,只要取B、C、D中屬性值時(shí),才會(huì)去查詢。但是hibernate配合DWR時(shí),這個(gè)lazy屬性好象不起作用,只要一查詢,就會(huì)把于之相關(guān)聯(lián)的屬性全部加載,執(zhí)行一個(gè)方法,竟然有上百條HQL語句,使效率極其低下。
          另一種配置是:

          <convert converter="hibernate3" match="com.hengyu.bean.project.*" />
          這樣的話效率很快,但是當(dāng)我去于A相關(guān)聯(lián)的B、C等表里的屬性時(shí),卻取不到。配置了opensessioninview,其他表中的屬性仍然取不到。郁悶了半月了,請高手指教。
          posted @ 2007-12-10 22:20 楊愛友 閱讀(1335) | 評論 (2)編輯 收藏
               摘要: 如果一個(gè)人愛你  閱讀全文
          posted @ 2007-11-26 21:32 楊愛友 閱讀(502) | 評論 (4)編輯 收藏
               摘要: 思想不積極,發(fā)布一天就關(guān)了。  閱讀全文
          posted @ 2007-10-16 16:29 楊愛友 閱讀(379) | 評論 (9)編輯 收藏
               摘要: 這兩周沒做啥事情,卻很累,心很累,不是沒事情做,有,卻不知道怎么做,頭很痛,心很累,書不看了,博客也不寫了。  閱讀全文
          posted @ 2007-09-26 00:12 楊愛友 閱讀(444) | 評論 (12)編輯 收藏
               摘要: 由前端控制器負(fù)責(zé)判斷用戶的請求要分派給哪一個(gè)控制對象,借此達(dá)到控制用戶請求資源的目的。  閱讀全文
          posted @ 2007-09-09 23:17 楊愛友 閱讀(561) | 評論 (1)編輯 收藏
               摘要: 小小一篇總結(jié)、計(jì)劃  閱讀全文
          posted @ 2007-09-09 05:32 楊愛友 閱讀(342) | 評論 (3)編輯 收藏
               摘要: Spring AOP中的一些概念及Before Advice實(shí)例解析  閱讀全文
          posted @ 2007-09-06 00:06 楊愛友 閱讀(1486) | 評論 (4)編輯 收藏
               摘要: 代理模式:為其他對象提供一種代理以控制對這個(gè)對象的訪問。這種功能只有在編譯無法確定要實(shí)現(xiàn)哪個(gè)接口時(shí)才有必要使用。  閱讀全文
          posted @ 2007-09-04 01:15 楊愛友 閱讀(787) | 評論 (0)編輯 收藏
               摘要: 有關(guān)spring 幾個(gè)重要的概念理解和兩個(gè)IoC實(shí)例解析  閱讀全文
          posted @ 2007-09-04 00:22 楊愛友 閱讀(1393) | 評論 (6)編輯 收藏
               摘要: 系型數(shù)據(jù)庫之所以強(qiáng)大,其中一個(gè)原因就是可以統(tǒng)一使用表來管理同類數(shù)據(jù)信息,并且可以在相關(guān)數(shù)據(jù)之間建立關(guān)系。作為支持關(guān)系型數(shù)據(jù)庫的SQL語句來說,自然要對全面發(fā)揮這種強(qiáng)大功能提供支持,這個(gè)支持就是連接查詢。同樣作為一種關(guān)系型數(shù)據(jù)庫的持久層框架,  閱讀全文
          posted @ 2007-08-31 21:46 楊愛友 閱讀(619) | 評論 (0)編輯 收藏
          簡介:

            我看到很多項(xiàng)目中,開發(fā)者實(shí)現(xiàn)了自己的MVC框架,并不是因?yàn)樗麄兿胱鐾琒truts根本不同的東西,而是因?yàn)樗麄儾]有意識到如何擴(kuò)展Struts。開發(fā)自己的MVC框架可以獲得全部的控制權(quán),但是這也意味著需要很多資源來實(shí)現(xiàn)它(人力物力),在緊張的日程安排下,有時(shí)候這是不可能的。

            Struts不僅僅是一個(gè)強(qiáng)大的框架,同時(shí)它也是可擴(kuò)展的。你可以以三種方式來擴(kuò)展Struts。

            1、PlugIn:如果你想在application startup或shutdown的時(shí)候做一些業(yè)務(wù)邏輯的話,那就創(chuàng)建你自己的PlugIn類。

            2、RequestProcessor:如果你想在請求被處理的過程中某個(gè)時(shí)刻做一些業(yè)務(wù)邏輯的話,那么創(chuàng)建你自己的RequestProcessor類。比如說,在每次請求執(zhí)行之前,你可以擴(kuò)展RequestProcessor來檢查用戶是否登陸了以及他是否有權(quán)限去執(zhí)行某個(gè)特定的action。

            3、ActionServlet:如果你想在application startup和shutdown的時(shí)候以及請求被處理的時(shí)候做某些業(yè)務(wù)邏輯,你也可以擴(kuò)張ActionServlet類。不過你應(yīng)當(dāng)在PlugIn和RequestProcessor都不能解決你的需求的時(shí)候來使用ActionServlet。

            在這篇文章中,我們將使用一個(gè)Struts應(yīng)用的示例來示范如何使用這三種方式來擴(kuò)展Struts。示例程序的代碼可以從http://www.onjava.com/onjava/2004/11/10/examples/sample1.zip下載。兩個(gè)擴(kuò)展Struts成功的范例是Struts自身的Validation和Tiles框架。

            我們假設(shè)你已經(jīng)比較熟悉Struts框架并且知道如何使用它創(chuàng)建一個(gè)簡單的應(yīng)用。如果你想知道更多關(guān)于Struts的內(nèi)容,請參考官方主頁。

            PlugIn
            
            PlugIn是一個(gè)接口,你可以創(chuàng)建一個(gè)實(shí)現(xiàn)該接口的類,當(dāng)application startup或shutdown的時(shí)候做些事情。

            比方說,我創(chuàng)建了一個(gè)使用Hibernate作為持久層的web應(yīng)用,我想當(dāng)應(yīng)用啟動(dòng)的時(shí)候就初始化Hibernate,這樣子當(dāng)我的web應(yīng)用受到第一個(gè)請求的時(shí)候,Hibernate就已經(jīng)是配置好的并且可用的。同時(shí)我們想當(dāng)application關(guān)閉的時(shí)候關(guān)閉Hibernate。我們可以用一個(gè)Hibernate PlugIn來實(shí)現(xiàn)這個(gè)需求,通過如下的兩步:

            1、創(chuàng)建一個(gè)類實(shí)現(xiàn)了PlugIn接口

            public class HibernatePlugIn implements PlugIn{
            private String configFile;
            // This method will be called at application shutdown time
            public void destroy() {
            System.out.println("Entering HibernatePlugIn.destroy()");
            //Put hibernate cleanup code here
            System.out.println("Exiting HibernatePlugIn.destroy()");
            }
            //This method will be called at application startup time
            public void init(ActionServlet actionServlet, ModuleConfig config)
            throws ServletException {
             System.out.println("Entering HibernatePlugIn.init()");
             System.out.println("value of init parameter " +
             getConfigFile());
             System.out.println("Exiting HibernatePlugIn.init()");
            }
            public String getConfigFile() {
            return name;
            }
            public void setConfigFile(String string) {
            configFile = string;
            }
            }

            實(shí)現(xiàn)PlugIn接口的類必須完成兩個(gè)方法:init()和destroy()。當(dāng)application startup的時(shí)候init()方法被調(diào)用,當(dāng)shutdown的時(shí)候destroy()方法被調(diào)用。Struts還允許給你的PlugIn類傳遞初始化參數(shù)。為了傳遞參數(shù),你必須在PlugIn類中為每一個(gè)參數(shù)創(chuàng)建JavaBean式的setter方法。在我們的HibernatePlugIn類中,我會(huì)把configFile的name作為參數(shù)傳進(jìn)去,而不是硬編碼到程序中。

            2、在struts-config.xml中添加如下的代碼來通告Struts有新的PlugIn:

           ?。約truts-config>
            ...
           ?。?-- Message Resources -->
            <message-resources parameter= "sample1.resources.ApplicationResources"/>

           ?。?-- Declare your plugins -->
           ?。紁lug-in className="com.sample.util.HibernatePlugIn">
           ?。約et-property property="configFile" value="/hibernate.cfg.xml"/>
            </plug-in>
           ?。?struts-config>

            屬性className是實(shí)現(xiàn)了PlugIn接口的類的全限定名。對于每一個(gè)初始化參數(shù),可以使用<set-property>元素傳遞參數(shù)。在我們的例子中,我要把config文件的名字傳進(jìn)去,所以使用了一個(gè)帶有配置文件路徑的<set-property>。

            Struts的Tiles和Validator框架都使用PlugIn來讀取配置文件進(jìn)行初始化。另外兩件PlugIn可以幫你做到的事情是:

            ·如果你的application依賴于某些配置文件,那么你可以在PlugIn類中檢查它們是否可用,如果不可用的話拋出一個(gè)ServletException,這樣就可以使ActionServlet變?yōu)椴豢捎谩?

            ·PlugIn接口的init()方法是你可以改變ModuleConfig的最后機(jī)會(huì),ModuleConfig是一組靜態(tài)配置信息的集合,用來描述基于Struts模塊。Struts將會(huì)在所有PlugIn處理完后釋放ModuleConfig。
             Request是如何被處理的

            ActionServlet是Struts框架中唯一的Servlet,它負(fù)責(zé)處理所有request。無論何時(shí)接收到一個(gè)request,它都會(huì)先嘗試為當(dāng)前的request尋找一個(gè)sub-application。一旦一個(gè)sub-application被找到,ActionServlet就會(huì)為那個(gè)sub-application創(chuàng)建一個(gè)RequestProcessor對象,調(diào)用這個(gè)對象的process()方法并把HttpServletRequest和HttpServletResponse對象傳入。

            RequestProcessor.process()就是大部分request被處理的地方。process()方法使用了Template Method模式實(shí)現(xiàn),其中有很多獨(dú)立的方法來執(zhí)行請求處理的每一步驟,這些方法將會(huì)在process方法中依次被調(diào)用。比如,將會(huì)有一個(gè)獨(dú)立的方法用來尋找當(dāng)前request對應(yīng)的ActionForm類,一個(gè)方法來檢查當(dāng)前用戶是否有執(zhí)行action mapping所必須的權(quán)限。這些給與我們極大的靈活性。在發(fā)布的Struts包中有一個(gè)RequestProcessor類提供了請求處理每一步驟的默認(rèn)實(shí)現(xiàn)。這就意味著你可以僅僅重寫你感興趣的方法,其它的使用默認(rèn)的實(shí)現(xiàn)。舉例來說,默認(rèn)地Struts調(diào)用request.isUserInRole()來檢查用戶是否有權(quán)限執(zhí)行當(dāng)前的ActionMapping;這時(shí)如果你想通過查詢數(shù)據(jù)庫來實(shí)現(xiàn),你所要做的就是重寫processRoles()方法,通過查詢出的用戶是否擁有必須的權(quán)限來返回true或false。

            首先我們將會(huì)看到缺省情況下,process()方法是如何實(shí)現(xiàn)的,然后我將會(huì)詳細(xì)解釋默認(rèn)的RequestProcessor類中的每一個(gè)方法,這樣你就可以決定哪一部分是你想要改變的。

            public void process(HttpServletRequest request,HttpServletResponse response)
            throws IOException, ServletException {
            // Wrap multipart requests with a special wrapper
            request = processMultipart(request);
            // Identify the path component we will
            // use to select a mapping
            String path = processPath(request, response);
            if (path == null) {
            return;
            }
            if (log.isDebugEnabled()) {
            log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
            }
            // Select a Locale for the current user if requested
            processLocale(request, response);
            // Set the content type and no-caching headers
            // if requested
            processContent(request, response);
            processNoCache(request, response);
            // General purpose preprocessing hook
            if (!processPreprocess(request, response)) {
            return;
            }
            // Identify the mapping for this request
            ActionMapping mapping =
            processMapping(request, response, path);
            if (mapping == null) {
            return;
            }
            // Check for any role required to perform this action
            if (!processRoles(request, response, mapping)) {
            return;
            }
            // Process any ActionForm bean related to this request
            ActionForm form = processActionForm(request, response, mapping);
            processPopulate(request, response, form, mapping);
            if (!processValidate(request, response, form, mapping)) {
            return;
            }
            // Process a forward or include specified by this mapping
            if (!processForward(request, response, mapping)) {
            return;
            }
            if (!processInclude(request, response, mapping)) {
            return;
            }
            // Create or acquire the Action instance to
            // process this request
            Action action =
            processActionCreate(request, response, mapping);
            if (action == null) {
            return;
            }
            // Call the Action instance itself
            ActionForward forward = processActionPerform(request, response,action, form, mapping);
            // Process the returned ActionForward instance
            processForwardConfig(request, response, forward);
            }

            1、processMutipart():在這個(gè)方法中,Struts將會(huì)讀取request來檢查request的contentType是否是multipart/form-data。如果是的話,將會(huì)解析request并且將之包裝到HttpServletRequest中。當(dāng)你創(chuàng)建了一個(gè)HTML FORM用來提交數(shù)據(jù),那么request的contentType默認(rèn)就是application/x-www-form-urlencoded。但是如果你的form使用了file類型的input控件允許用戶上傳文件的話,你就必須將contentType改為multipart/form-data。如果是這樣的情況,你就不能再通過getParameter()來獲取用戶提交的數(shù)據(jù);你必須將request作為一個(gè)InputStream來讀取,并且自己解析它來獲得參數(shù)值。

            2、processPath():在這個(gè)方法中,Struts將會(huì)讀取request的URI,來確定路徑元素,這個(gè)元素是用來獲取ActionMappint元素。
            3、processLocale():在這個(gè)方法中,Struts將會(huì)為當(dāng)前request取得Locale,如果配置過的話,還可以將這個(gè)對象作為HttpSession中org.apache.struts.action.LOCALE屬性的值而保存。作為這個(gè)方法的副作用,HttpSession將會(huì)被創(chuàng)建,如果你不想創(chuàng)建的話,你可以在ControllerConfig中將locale屬性設(shè)為false,在struts-config.xml中象如下這樣:

            <controller>
           ?。約et-property property="locale" value="false"/>
            </controller>

            4、processContent():通過調(diào)用response.setContentType()來為response設(shè)置contentType。這個(gè)方法首先會(huì)嘗試從struts-config.xml配置中得到contentType。缺省情況下使用text/html。如果想覆蓋它,可以象如下這樣:

            <controller>
            <set-property property="contentType" value="text/plain"/>
           ?。?controller>

            5、processNoCache():如果配置是no-cache,Struts將會(huì)為每個(gè)response設(shè)置下面三個(gè)headers:

            requested in struts config.xml
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 1);

            如果你想設(shè)置no-cache header,在struts-config.xml中加入下面信息:

           ?。糲ontroller>
           ?。約et-property property="noCache" value="true"/>
           ?。?controller>

            6、processPreprocess():這個(gè)方法為預(yù)處理提供一個(gè)hook,可以在子類中覆蓋它。它的缺省實(shí)現(xiàn)沒有作任何事情,總是返回true。返回false的話將會(huì)終止當(dāng)前請求的處理。

            7、processMapping():這個(gè)方法將會(huì)用路徑信息得到一個(gè)ActionMapping對象。也就是struts-config.xml文件中的<action>元素:

           ?。糰ction path="/newcontact" type="com.sample.NewContactAction" name="newContactForm" scope="request">
           ?。糵orward name="sucess" path="/sucessPage.do"/>
            <forward name="failure" path="/failurePage.do"/>
           ?。?action>

            ActionMapping元素包含了Action類的名稱和處理請求使用的ActionForm等等信息。它還包含當(dāng)前ActionMapping配置的ActionForwards信息。

            8、processRoles():Struts web應(yīng)用提供了一個(gè)授權(quán)方案。也就是說,一旦一個(gè)用戶登入了容器,struts的processRoles()方法將會(huì)通過調(diào)用request.isUserInRole(),來檢查他是否有必須的角色來運(yùn)行一個(gè)給定的ActionMapping。

            <action path="/addUser" roles="administrator"/>

            假設(shè)你有一個(gè)AddUserAction并且你只想讓administrator能夠增加新的user。你所要做的就是給你的AddUserAction元素增加一個(gè)role屬性,這個(gè)屬性的值為administrator。這樣,在運(yùn)行AddUserAction之前,這個(gè)方法會(huì)確保用戶擁有administraotr的角色。

            9、processActionForm():每一個(gè)ActionMapping都一個(gè)相應(yīng)的ActionForm類。當(dāng)Struts處理一個(gè)ActionMapping的時(shí)候,它將會(huì)從<action>元素的name屬性中找出對應(yīng)的ActionForm類的名稱。

           ?。糵orm-bean name="newContactForm" type="org.apache.struts.action.DynaActionForm">
           ?。糵orm-property name="firstName" type="java.lang.String"/>
            <form-property name="lastName" type="java.lang.String"/>
           ?。?form-bean>

            在我們的例子中,它會(huì)先在request scope中檢查是否有一個(gè)org.apache.struts.action.DynaActionForm類的對象存在。如果有它將會(huì)使用這個(gè)對象,如果沒有它將會(huì)創(chuàng)建一個(gè)新的對象并把它設(shè)置在request scope。

            10、processPopulate():在這個(gè)方法中,Struts將會(huì)用相匹配的request參數(shù)裝配ActionForm的實(shí)例變量。

            11、processValidate():Struts將會(huì)調(diào)用你的ActionForm類的validate方法。如果你從validate()返回ActionErrors,它將會(huì)將user重定向到<action>元素的input屬性指定的頁面。

            12、processForward()和processInclude():在這些方法中,Struts將會(huì)檢查<action>元素的forward或include屬性,如果找到了,將會(huì)把forward或include請求放置到配置的頁面中。

           ?。糰ction forward="/Login.jsp" path="/loginInput"/>
            <action include="/Login.jsp" path="/loginInput"/>

            你可以從這些方法的名字上猜測它們的不同:processForward()最終調(diào)用RequestDispatcher.forward(),而processInclude()調(diào)用RequestDispatcher.include()。如果你同時(shí)配置了forward和include屬性,它將會(huì)總是調(diào)用forward,因?yàn)閒orward先被處理。

            13、processActionCreate():這個(gè)方法從<action>元素的type屬性中獲取獲得Action類的名字并且創(chuàng)建返回它的實(shí)例。在我們的例子中,它將會(huì)創(chuàng)建一個(gè)com.sample.NewContactAction類的實(shí)例。

            14、processActionPerform():這個(gè)方法調(diào)用你的Action類的excute()方法,你的業(yè)務(wù)邏輯也就是在excute方法中。

            15、processForwardConfig():你的Action類的excute()方法將會(huì)返回一個(gè)ActionForward對象,這個(gè)對象將指出哪個(gè)頁面是顯示給用戶的頁面。因此,Struts將會(huì)為那個(gè)頁面創(chuàng)建一個(gè)RequestDispatcher,并且調(diào)用RequestDispatcher.forward()。

            上面的列表說明了默認(rèn)的RequestProcessor實(shí)現(xiàn)在處理請求時(shí)每一步作的工作,以及執(zhí)行的順序。正如你所看到的,RequestProcessor是非常靈活的,允許你通過設(shè)置<controller>元素的屬性來配置它。舉例來說,如果你的應(yīng)用準(zhǔn)備生成XML內(nèi)容來代替HTML,你就可以通過設(shè)置controller元素的屬性來通知Struts這些情況。
            
            創(chuàng)建你自己的RequestProcessor

            通過上面,我們了解到了RequestProcessor的默認(rèn)實(shí)現(xiàn)是如何工作的。現(xiàn)在我們要演示一個(gè)例子來說明如何定制你自己的RequestProcessor。為了展示創(chuàng)建用戶定制的RequestProcessor,我們將會(huì)讓我們的示例實(shí)現(xiàn)下面兩個(gè)業(yè)務(wù)需求:

            ·我們想創(chuàng)建一個(gè)ContactImageAction類,它將生成圖片而不是平常的HTML頁面。

            ·在每個(gè)請求處理之前,我們都想通過檢查session中的userName屬性來確定用戶是否已經(jīng)登陸。如果那個(gè)屬性沒有找到,我們會(huì)把用戶重定向到登陸頁面。

            我們將分兩步實(shí)現(xiàn)這些業(yè)務(wù)需求。

            1、創(chuàng)建你的CustomRequestProcessor類,它將繼承自RequestProcessor類,如下:

            public class CustomRequestProcessor
            extends RequestProcessor {
            protected boolean processPreprocess (
            HttpServletRequest request,HttpServletResponse response) {
             HttpSession session = request.getSession(false);
             //If user is trying to access login page
             // then don't check
             if( request.getServletPath().equals("/loginInput.do")
            || request.getServletPath().equals("/login.do") )
              return true;
             //Check if userName attribute is there is session.
             //If so, it means user has allready logged in
             if( session != null && session.getAttribute("userName") != null)
              return true;
             else{
              try{
               //If no redirect user to login Page
               request.getRequestDispatcher("/Login.jsp").forward(request,response);
              }catch(Exception ex){
              }
             }
             return false;
            }

            protected void processContent(HttpServletRequest request,
            HttpServletResponse response) {
            //Check if user is requesting ContactImageAction
            // if yes then set image/gif as content type
            if( request.getServletPath().equals("/contactimage.do")){
             response.setContentType("image/gif");
             return;
            }
             super.processContent(request, response);
            } 
            }

            在CustomRequestProcessor類的processPreprocess方法中,我們檢查session的userName屬性,如果沒有找到,就將用戶重定向到登陸頁面。

            對于生成圖片作為輸出的需求,我們必須覆蓋processContent方法,首先檢查請求是否是/contactimage路徑。如果是的話,我們就會(huì)將contentType設(shè)置為image/gif;否則設(shè)置為text/html。

            2、在你的struts-config.xml文件的<action-mappint>元素之后加入下面的文字,告訴Struts CustomRequestProcessor應(yīng)當(dāng)被用作RequestProcessor類:

            <controller>
            <set-property property="processorClass"value="com.sample.util.CustomRequestProcessor"/>
           ?。?controller>

            請注意,當(dāng)你只有很少的action類需要生成非text/html類型的輸出時(shí),你覆寫processContent()方法是OK的。如果不是這樣子的話,你應(yīng)該創(chuàng)建一個(gè)Struts的子應(yīng)用來處理請求生成圖片的Action,并為它們將contentType設(shè)置為image/gif。

            Struts的Tiles框架就是使用它自己的RequestProcessor來裝飾Struts的輸出。

            ActionServlet

            如果你查看你的Struts web應(yīng)用的web.xml,你會(huì)看到這樣的文字:

           ?。紈eb-app >
           ?。約ervlet>
           ?。約ervlet-name>action=</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
           ?。?-- All your init-params go here-->
           ?。?servlet>
           ?。約ervlet-mapping>
           ?。約ervlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
           ?。?servlet-mapping>
           ?。?web-app >

            這意味著ActionServlet負(fù)責(zé)處理你所有Struts的請求。你可以創(chuàng)建一個(gè)ActionServlet的子類,當(dāng)應(yīng)用啟動(dòng),關(guān)閉,每個(gè)請求的時(shí)候做一些特定的事情。但是在繼承ActionServlet類之前,你應(yīng)該盡量創(chuàng)建一個(gè)PlugIn或RequestProcessor去解決你的問題。在Servlet1.1之前,Tiles框架是基于ActionServlet來修飾生成的響應(yīng)。但是從1.1之后,它開始使用TilesRequestProcessor類。

            總結(jié)

            決定開發(fā)你自己的MVC框架是一個(gè)非常大的決定,你必須要考慮開發(fā)和維護(hù)框架代碼所花費(fèi)的時(shí)間和資源。Struts是一個(gè)非常強(qiáng)大和穩(wěn)定的框架,你可以修改它來滿足你絕大多數(shù)的業(yè)務(wù)需求。

            但另一方面,也不要草率地做出擴(kuò)展Struts的決定。如果你在RequestProcessor中寫了一些性能比較低的代碼,它將會(huì)在每次請求時(shí)執(zhí)行,因而降低你整個(gè)應(yīng)用的效率。而且還是有一些情況,開發(fā)自己的MVC框架要比擴(kuò)展Struts好。
          posted @ 2007-08-31 12:42 楊愛友 閱讀(1684) | 評論 (0)編輯 收藏
               摘要: 公司接到一個(gè)小項(xiàng)目,項(xiàng)目經(jīng)理要我一起做,也好,也好,一個(gè)很好的學(xué)習(xí)機(jī)會(huì)。畢竟是微軟支持的,我相信以后會(huì)有用場的。  閱讀全文
          posted @ 2007-08-30 17:16 楊愛友 閱讀(308) | 評論 (0)編輯 收藏
               摘要: 一個(gè)完整的servlet 過濾器實(shí)例  閱讀全文
          posted @ 2007-08-29 12:40 楊愛友 閱讀(19911) | 評論 (3)編輯 收藏
               摘要: batch fetch inverse cascade outer-join lazy x-to-x load() get() find() 類級別 關(guān)聯(lián)級別
          都是些啥啊,看了好多網(wǎng)站都不能透徹的理清思路。 或許去看書才能理得清頭緒。   閱讀全文
          posted @ 2007-08-28 09:39 楊愛友 閱讀(280) | 評論 (1)編輯 收藏
               摘要: 心情日記,與技術(shù)無關(guān)  閱讀全文
          posted @ 2007-08-28 00:29 楊愛友 閱讀(455) | 評論 (6)編輯 收藏
          美麗涵涵童裝店
          親,說我博客名字,給你們打折!
          主站蜘蛛池模板: 常山县| 上虞市| 玛多县| 安顺市| 芦山县| 大石桥市| 毕节市| 小金县| 张家口市| 新安县| 碌曲县| 三河市| 寻乌县| 南澳县| 武陟县| 彭州市| 吴川市| 清丰县| 原阳县| 泰顺县| 繁峙县| 靖远县| 湘阴县| 光泽县| 沧州市| 天柱县| 松阳县| 微博| 茌平县| 满城县| 资源县| 沁源县| 柯坪县| 南康市| 古浪县| 顺平县| 无为县| 柘城县| 枣阳市| 永川市| 乐至县|