隨筆-124  評論-49  文章-56  trackbacks-0
           
               摘要: 在我已往的Struts 1.x項目經(jīng)驗中,有個問題不時的出現(xiàn)——在創(chuàng)建FormBean時,對于某個屬性到底應(yīng)該用String還是其它類型? 開發(fā)Web應(yīng)用程序與開發(fā)傳統(tǒng)桌面應(yīng)用程序不同,Web應(yīng)用程序?qū)嶋H上是分布個不同的主機(當然也可以同一個主機,不過比較少見)上的兩個進程之間互交。這種互交建立在HTTP之上,它們互相傳遞是都是字符串。換句話說, 服務(wù)器可以的接收到的來自用...  閱讀全文

          Max 2006-11-07 14:26 發(fā)表評論

          文章來源:http://www.aygfsteel.com/max/archive/2006/11/07/79602.html
          posted @ 2009-10-29 19:00 junly 閱讀(177) | 評論 (0)編輯 收藏
               摘要: Struts 2.0系列之四
          國際化是商業(yè)系統(tǒng)中不可或缺的一部分,所以無論您學習的是什么Web框架,它都是必須掌握的技能。  閱讀全文

          Max 2006-11-01 19:06 發(fā)表評論

          文章來源:http://www.aygfsteel.com/max/archive/2006/11/01/78536.html
          posted @ 2009-10-29 19:00 junly 閱讀(81) | 評論 (0)編輯 收藏
               摘要: 有Struts 1.x經(jīng)驗的朋友都知道Action是Struts的核心內(nèi)容,當然Struts 2.0也不例外。不過,Struts 1.x與Struts 2.0的Action模型很大的區(qū)別。   Struts 1.x Stuts 2.0 ...  閱讀全文

          Max 2006-10-25 12:10 發(fā)表評論

          文章來源:http://www.aygfsteel.com/max/archive/2006/10/25/77157.html
          posted @ 2009-10-29 19:00 junly 閱讀(108) | 評論 (0)編輯 收藏
               摘要: 在上一篇文章《為Struts 2.0做好準備》中,我過于詳細地介紹了Struts 2.0開發(fā)環(huán)境和運行環(huán)境的配置,所以,本文很少涉及的以上兩方面的細節(jié)。如果,您看完《為Struts 2.0做好準備》后,還有什么不明白,或者沒法運行文中例子,請聯(lián)系我。我的E-MAIL:Max.M.Yuan@gmail.com。 在介紹常用標志前,我想先從總體上,對Struts 1.x與Struts 2.0的標...  閱讀全文

          Max 2006-10-18 12:02 發(fā)表評論

          文章來源:http://www.aygfsteel.com/max/archive/2006/10/18/75857.html
          posted @ 2009-10-29 19:00 junly 閱讀(82) | 評論 (0)編輯 收藏
               摘要: Struts 2.0系列之一
          Struts 2.0的簡單易用、方便測試相信也會給大家留下不錯的印象吧。我相信,Struts 2.0作為一個全新的Web架構(gòu),將會再次掀起Web開發(fā)的熱潮。  閱讀全文

          Max 2006-10-10 18:35 發(fā)表評論

          文章來源:http://www.aygfsteel.com/max/archive/2006/10/10/74353.html
          posted @ 2009-10-29 19:00 junly 閱讀(83) | 評論 (0)編輯 收藏

          明明已經(jīng)將某個web應(yīng)用從tomcat下的webapps下移除了,為什么還會拋這樣的異常呢?

           

          java.lang.IllegalArgumentException: Document base *** does not exist or is not a readable

          directory
          at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:141)
          at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:3957)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4126)
          at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
          ********

          .................

          其實這個問題很簡單,tomcat的一個應(yīng)用不只是那個文件夾而已...

           

           

          詳細操作應(yīng)該是這樣的:

          1.該項目的War文件從***\apache-tomcat-6.0.16\webapps 移出;

          2.該項目的某些配置從 ***apache-tomcat-6.0.16\work\Catalina\localhost 移除;

          3.該項目的配置文件,目錄: ***\apache-tomcat-6.0.16\conf\Catalina\localhost移除。

          4.該項目的配置文件,目錄: ***\apache-tomcat-6.0.16\conf\server.xml中改修或添加的配置是否正確。

           

           

          posted @ 2009-10-29 17:10 junly 閱讀(4748) | 評論 (0)編輯 收藏

           /*
           由于javascript是一種無類型語言,所以一個數(shù)組的元素可以具有任意的數(shù)據(jù)類型,同一個數(shù)組的不同元素
           可以具有不同的類型,數(shù)組的元素設(shè)置可以包含其他數(shù)組,這樣就可以創(chuàng)建一個復(fù)雜的數(shù)組了.
           并且在這點上說javascript作為一種腳本語言不同于那種嚴格的面向?qū)ο蟮腸++.c#,java了.具有更高的靈活性.
           */

           /*
           *在javascript1.1和其后的版本中,數(shù)組是用構(gòu)造函數(shù)Array()和運算符new來創(chuàng)建,
           可用以下的三種方式來創(chuàng)建javascript 中的數(shù)組.
           */
           var a=new Array();
           var b=new Array(5,4,3,"first","test,string");
           var c=new Array(20);

           a[1.23]="test";
           document.write("a[1.23]="+a[1.23]);
           //相信每位從強類型的編程語言學習javascript時,絕對會以為上面這種操作感到驚訝,
           //float數(shù)據(jù)也作數(shù)組的下標了,事實上                       并非如您所想       
           //javascript在您是用負數(shù),浮點數(shù),(或布爾型,對象,其他值時),javascript會將它轉(zhuǎn)換為一個字符串
           //用生成的字符串作為對象的屬性名字,而不是定義了一個新的數(shù)組元素
           //上面的實例事實就是為a 創(chuàng)建了一個名為:"1.23"的屬性.
           document.write("a.length="+a.length);
           document.write("b.length="+b.length);
           document.write("c.length="+c.length);

           a[3]="Test";
           document.write("<br />a[3]="+a[3]);
           document.write("<br/>a.length="+a.length);
           //以上測試也很明確我們用整數(shù)作為數(shù)組的下標是才會真正為數(shù)組添加一個元素,
           //這里用數(shù)組的長度來體現(xiàn)了javascript的數(shù)組中的奧妙。


           //通過設(shè)置數(shù)組的length屬性能過截斷數(shù)組的長度。
           a.length=3;
           if (a[3]==undefined)
           {
            document.write("<br />在a.length="+a.length+"后,a[3]="+a[3]);
           }
           else
           {
              document.write("<br />在a.length="+a.length+"后,a[3]="+a[3]);
           }

           //這里測試我們的多維數(shù)組元素
           /*
           *javascript中實際上是不支持多維數(shù)組
           *但是我們將一個一維數(shù)組的元素再賦給其一個一維數(shù)組,這樣就看起來就實現(xiàn)了多維數(shù)組了,但
           實際上他還是個一維數(shù)組,這和我們理解c語言的數(shù)組時的那種想法一樣,但他們的實現(xiàn)機制是不一樣的。
           */
           var g=new Array(3);
           g[3]=a;
           g[3][2]="Test"
           document.write("<br />g[3][2]="+g[3][2]);
           
            //數(shù)組join()方法
            for (var i=0;i<20 ;i++ )
            {
           c[i]=i;
           document.write("<br />c[i]="+c[i]);
            }
            document.write("<br/>c的元素join()方法后是:"+c.join());
            //數(shù)組的reverse()方法
            c.reverse();
            document.write("<br />c的元素在reverse()方法再join()后的結(jié)果是:"+c.join("|"));

            //concat()方法的測試
            var h=new Array(1,2,3);
            h= h.concat([4,5]);
            //但是concat函數(shù)不會遞歸地展開一個元素為數(shù)組的數(shù)組。
            h=h.concat(6,7,[9,[10,20]]);
            document.write("<br />h.length="+h.length+"<br />"+h);
            document.write("h[8]="+h[8]);


            //slice()方法
            document.write("<br>h.slice(4,5)="+h.slice(4,5));
          document.write("h.slice(5,9)="+h.slice(5,9))
          //slice()方法:返回的數(shù)組包含有第一個參數(shù)指定的元素和那個元素開始到第二個參數(shù)指定的
          //元素為止的元素但不包含第二個參數(shù)所指定的元素。


          //splice()方法
          //splice()方法是插入或刪除數(shù)組元素通用的方法。
          /*
          splice函數(shù)第一個參數(shù)指定了要插入或刪除的元素在數(shù)組中的位置。
          第二個參數(shù)指定了要從數(shù)組中刪除的元個數(shù)
          在第二參數(shù)之后可以有任意多個參數(shù),它們指定的是從第一個參數(shù)指定的位置處插入的元素。
          第一個元素及后續(xù)元素,做出相應(yīng)的移動。
          */

          document.write("<br />h.splice(8,1)后的h為::"+h.splice(8,1));
          //document.write("<br />h.splice(8,0,'a','b','Test')后的h為::"+h.splice(8,0,'a','b','Test'));
          h.splice(7,0,'a','b','Test');
          document.write("<br />h.splice(7,0,'a','b','Test')后的h為:"+h);


          //javascript中的數(shù)組作為堆棧時和php類似
          //這點有趣更有用。
          //以下是作為堆棧是使用的小實例
          /*
          push方法是將一個或多個新元素附加到數(shù)組的尾部,然后返回數(shù)組的新長度。
          pop將刪除數(shù)組的最后一個元素,堅守數(shù)組的長度,返回他刪除的值。
          */
          var stack=new Array();
          stack.push(1,2);
          document.write("<br>stack的元素是:"+stack);
          document.write("<br />stack.length="+stack.length);
          document.write("<br>stack.pop()返回的結(jié)果是:"+stack.pop());
          document.write("<br />stack.length="+stack.length);

          //以下是作為隊列使用的小實例
          /*
          unshift方法將一個或多個元素添加到數(shù)組元素的頭部,然后把已有的元素移動到下標最大的位置已騰出空間
          ,它返回的是主族的新長度。
          方法shift是刪除并返回數(shù)組的第一個元素,然后將后面的所有元素都向前移動以填補第一個元素留下的空白。
          */
          var list=[];
          list.unshift(6,2);
          document.write("<br >list的內(nèi)容為:"+list);
          document.write("<br>list的shift方法是:"+list.shift());

          //此外就剩下,我們在java中熟悉的toString()方法 了
          //It's a piece of cake!
          document.write(c.toString());
          //說白了,其實數(shù)組的toString()方法和無參數(shù)的join()的效果是完全相同
          //OK,this's chapter for Array,that's all!

          </script>

          posted @ 2009-10-29 13:27 junly 閱讀(154) | 評論 (0)編輯 收藏
          <#if post.title?length lt 25 >  
          ${post.title}
          <#else>
               ${post.title[0..21]}...
          </#if>
          注:${post.title[0..21]}取得標題的前22個字符,后面加上省略號...(自定義的)
          posted @ 2009-10-29 13:24 junly 閱讀(328) | 評論 (0)編輯 收藏

          FreeMarker的指令的文件就稱為模板(Template)。

          模板設(shè)計者不關(guān)心數(shù)據(jù)從那兒來,只知道使用已經(jīng)建立的數(shù)據(jù)模型。

          數(shù)據(jù)模型由程序員編程來創(chuàng)建,向模板提供變化的信息,這些信息來自于數(shù)據(jù)庫、文件,甚至于在程序中直接生成。

          數(shù)據(jù)類型:

          一、基本:

          1、scalars:存儲單值

          字符串:簡單文本由單或雙引號括起來。

          數(shù)字:直接使用數(shù)值。

          日期:通常從數(shù)據(jù)模型獲得

          布爾值:true或false,通常在<#if …>標記中使用

          2、hashes:充當其它對象的容器,每個都關(guān)聯(lián)一個唯一的查詢名字

          具有一個唯一的查詢名字和他包含的每個變量相關(guān)聯(lián)。

          3、sequences:充當其它對象的容器,按次序訪問

          使用數(shù)字和他包含的每個變量相關(guān)聯(lián)。索引值從0開始。

          4、集合變量:

          除了無法訪問它的大小和不能使用索引來獲得它的子變量:集合可以看作只能由<#list...>指令使用的受限sequences。

          5、方法:通過傳遞的參數(shù)進行計算,以新對象返回結(jié)果

          方法變量通常是基于給出的參數(shù)計算值在數(shù)據(jù)模型中定義。

          6、用戶自定義FTL指令:宏和變換器

          7、節(jié)點

          節(jié)點變量表示為樹型結(jié)構(gòu)中的一個節(jié)點,通常在XML處理中使用。

          模板:

          使用FTL(freeMarker模板語言)編寫

          組成部分

          一、整體結(jié)構(gòu)

          1、注釋:<#--注釋內(nèi)容-->,不會輸出。

          2、文本:直接輸出。

          3、interpolation:由 ${var} 或 #{var} 限定,由計算值代替輸出。

          4、FTL標記

          二、指令:

          freemarker指令有兩種:

          1、預(yù)定義指令:引用方式為<#指令名稱>

          2、用戶定義指令:引用方式為<@指令名稱>,引用用戶定義指令時須將#換為@。

          注意:如果使用不存在的指令,F(xiàn)reeMarker不會使用模板輸出,而是產(chǎn)生一個錯誤消息。

          freemarker指令由FTL標記來引用,F(xiàn)TL標記和HTML標記類似,名字前加#來加以區(qū)分。如HTML標記的形式為<h1></h1>則FTL標記的形式是<#list></#list>(此處h1標記和list指令沒有任何功能上的對應(yīng)關(guān)系,只是做為說明使用一下)。

          有三種FTL標記:

          1)、開始標記:<#指令名稱>

          2)、結(jié)束標記:</#指令名稱>

          3)、空標記:<#指令名稱/>

          注意:

          1) FTL會忽略標記之中的空格,但是,<#和指令 與 </#和指令 之間不能有空格。

          2) FTL標記不能夠交叉,必須合理嵌套。每個開始標記對應(yīng)一個結(jié)束標記,層層嵌套。 如:

          <#list>

          <li>

          ${數(shù)據(jù)}

          <#if 變量>

          <p>game over!</p>

          </#if>

          </li>

          </#list>

          注意事項:

          1)、FTL對大小寫敏感。所以使用的標記及interpolation要注意大小寫。name與NAME就是不同的對象。<#list>是正確的標記,而<#List>則不是。

          2)、interpolation只能在文本部分使用,不能位于FTL標記內(nèi)。如<#if ${var}>是錯誤的,正確的方法是:<#if var>,而且此處var必須為布爾值。

          3)、FTL標記不能位于另一個FTL標記內(nèi)部,注釋例外。注釋可以位于標記及interpolation內(nèi)部。

          三、表達式

          1、直接指定值:

          1-1、字符串:

          由雙引號或單引號括起來的字符串,其中的特殊字符(如' " \等)需要轉(zhuǎn)義。

          1-2、raw字符串:

          有一種特殊的字符串稱為raw字符串,被認為是純文本,其中的\和{等不具有特殊含義,該類字符串在引號前面加r,下面是一個例子:

          ${r"/${data}"year""}屏幕輸出結(jié)果為:/${data}"year"

          轉(zhuǎn)義    含義

          序列  

          \"  雙引號(u0022)

          \'  單引號(u0027)

          \\  反斜杠(u005C)

          \n  換行(u000A)

          \r  Return (u000D)

          \t  Tab (u0009)

          \b  Backspace (u0008)

          \f  Form feed (u000C)

          \l  <

          \g  >

          \a  &

          \{  {

          \xCode  4位16進制Unicode代碼

          1-3、數(shù)字:直接輸入,不需要引號

          1)、精度數(shù)字使用“.”分隔,不能使用分組符號

          2)、目前版本不支持科學計數(shù)法,所以“1E3”是錯誤的

          3)、不能省略小數(shù)點前面的0,所以“.5”是錯誤的

          4)、數(shù)字8、+8、08和8.00都是相同的

          1-4、布爾值:true和false,不使用引號

          1-5、序列:由逗號分隔的子變量列表,由[]方括號限定。

          1)、子變量列表可以是表達式

          2)、可以使用數(shù)字范圍定義數(shù)字序列,<b>不需要方括號限定</b>,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定義反遞增范圍如:5..2。

          1-6、散列(hash)

          1)、由逗號分隔的鍵/值列表,由{}大括號限定,鍵和值之間用冒號分隔,如:{"key1":valu1,"key2":"character string"....}

          2)、鍵和值都是表達式,但是鍵必須是字符串。

          2、獲取變量:

          2-1、頂層變量:${變量名}

          變量名只能是字母、數(shù)字、下劃線、$、#、@ 的組合,且不能以數(shù)字開頭。

          2-2、散列:有兩種方法

          1)、點語法:變量名字和頂層變量的名字受同樣的限制

          2)、方括號語法:變量名字無限制,可以是任意的表達式的結(jié)果

          book.author.name      散列表的多級:{"book":{"author":{"name":"張三"},"price":{"price1":200,"price2":500}},"book":{"author":{"name":"張三"}}

          book.author.["name"]

          book["author"].name

          book["author"]["name"]

          以上是等價的。

          2-3、序列:使用散列的方括號語法獲取變量,方括號中的表達式結(jié)果必須為數(shù)字。注意:第一個項目的索引為0。可以使用

          [startindex..endindex]語法獲取序列片段。

          2-4、特殊變量:FreeMarker內(nèi)定義變量,使用.variablename語法訪問。

          3、字符串操作

          3-1、interpolation:使用${}或#{}在文本部分插入表達式的值,例如:

          ${"hello${username}!"}

          ${"${username}${username}${username}"}

          也可以使用+來獲得同樣的結(jié)果:

          ${"hello"+username+"!"}

          ${username+username+username}

          注意:${}只能用于文本部分而不能出現(xiàn)于標記內(nèi)。

          <#if ${user.login}>或<#if "${user.login}">都是錯誤的;

          <#if user.login>是正確的。

          本例中user.login的值必須是布爾類型。

          3-2、子串:

          舉例說明:假如user的值為"Big Joe"

          ${user[0]}${user[4]}結(jié)果是:BJ

          ${user[1..4]}結(jié)果是:ig J

          4、序列操作

          4-1、連接操作:可以使用+來操作,例如:

          ["title","author"]+["month","day"]

          5、散列操作

          5-1、連接操作:可以使用+來操作,如果有相同的KEY,則右邊的值會替代左邊的值,例如:

          {"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}結(jié)果month的值就是6。

          6、算術(shù)運算

          6-1、操作符:+、-、*、/、%

          除+號以外的其他操作符兩邊的數(shù)據(jù),必須都是數(shù)字類型。

          如果+號操作符一邊有一個字符型數(shù)據(jù),會自動將另一邊的數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù),運算結(jié)果為字符型數(shù)據(jù)。

          6-2、比較操作符:

          1)、=

          2)、==

          3)、!=

          4)、<

          5)、<=

          6)、>

          7)、>=

          1-3的操作符,兩邊的數(shù)據(jù)類型必須相同,否則會產(chǎn)生錯誤

          4-7的操作符,對于日期和數(shù)字可以使用,字符串不可以使用。

          注意:

          1)、FreeMarker是精確比較,所以"x" "x " "X"是不等的

          2)、因為<和>對FTL來說是開始和結(jié)束標記,所以,可以用兩種方法來避免這種情況:

          一種是使用括號<#if (a<b)>

          另一是使用替代輸出,對應(yīng)如下:

          <  lt

          <= lte

          >  gt

          >= gte

          6-3、邏輯操作符:只能用于布爾值,否則會出現(xiàn)錯誤。

          &&(and)與運算

          ||(or)或運算

          !(not)非運算

          6-4、內(nèi)建函數(shù):使用方法類似于訪問散列的子變量,只是使用?代替.例如:${test?upper_case?html}

          常用的內(nèi)建函數(shù)列舉如下:

          1)、字符串使用

          html:對字符串進行HTML編碼

          cap_first:字符串第一個字母大寫

          lower_first:字符串第一個字母小寫

          upper_case:將字符串轉(zhuǎn)換成大寫

          trim:去年字符前后的空白字符

          2)、序列使用:

          size:獲得序列中元素的數(shù)目

          3)、數(shù)字使用:

          int:取得數(shù)字的整數(shù)部分

          7、操作符的優(yōu)先順序:

          后綴:[subbarName][subStringRange].(mathodParams)

          一元:+expr、-expr、! (not)

          內(nèi)建:?

          乘法:*、/、%

          加法:+、-

          關(guān)系:<、<=、>、>= (lt、lte、gt、gte)

          相等:=、==、!=

          邏輯與:&& (and)

          邏輯或:|| (or)

          數(shù)字范圍:..

          四、interpolation

          inperpolation只能用于文本,有兩種類型:通用interpolation及數(shù)字interpolation

          1、通用interpolation

          如${expr}

          1-1、插入字符串值:直接輸出表達式結(jié)果。

          1-2、插入數(shù)字值:根據(jù)缺省格式(由setting指令設(shè)置)將表達式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string來格式化單個interpolation

          如:

          <#setting number_format="currency" />

          <#assign answer=42 />

          ${answer}  <#-- ¥42.00 -->

          ${answer?string}  <#-- ¥42.00 -->

          ${answer?string.number}  <#-- 42 -->

          ${answer?string.currency}  <#-- ¥42.00 -->

          ${answer?string.percent}  <#-- 42,00% -->

          1-3、插入日期值:根據(jù)缺省格式(由setting指令設(shè)置)將表達式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string來格式化單個interpolation

          如:

          ${lastupdata?string("yyyy-MM-dd HH:mm:ss zzzz")}  <#-- 2003-04-08 21:24:44 Pacific Daylight Time -->

          ${lastupdata?string("EEE,MMM d, ''yy")}  <#-- tue,Apr 8, '03 -->

          ${lastupdata?string("EEEE,MMMM dd, yyyy,hh:mm:ss a '('zzz')'")}  <#-- Tuesday,April 08, 2003, 09:24:44 PM (PDT)-->

          1-4、插入布爾值:根據(jù)缺省格式(由setting指令設(shè)置)將表達式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string來格式化單個interpolation

          如:

          <#assign foo=ture />

          ${foo?string("yes","no")} <#-- yes -->

          2、數(shù)字interpolation:

          有兩種形式:

          1)、#{expr}

          2)、#{expr;format}:format可以用來格式化數(shù)字,format可以是如下:

          mX:小數(shù)部分最小X位

          MX:小數(shù)部分最大X位

          例如:

          <#assign x=2.582 />

          <#assign y=4 />

          #{x;M2} <#-- 2.58 -->

          #{y;M2} <#-- 4 -->

          #{x;m1} <#-- 2.582 -->

          #{y;m1} <#-- 4.0 -->

          #{x;m1M2} <#-- 2.58 -->

          #{y;m1M2} <#-- 4.0 -->

          雜項

          一、用戶定義指令

          變換器變量是兩種不同類型的用戶自定義指令,他們的區(qū)別是:

          宏可以在模板中用macro指令來定義

          變換器是在模板外由程序定義

          1、宏:和某個變量關(guān)聯(lián)的模板片段,以便在模板中通過用戶自定義指令使用該變量

          1-1、基本用法:

          例如:

          <#macro greet>

          <font size="+2"> Hello JOE!</font>

          </#macro>

          使用時:

          <@greet></@greet>

          如果沒有體內(nèi)容也可以用

          <@greet />

          1-2、變量:

          1)、可以在宏定義之后定義參數(shù),宏參數(shù)是局部變量,只在宏定義中有效。如:

          <#macro greet person>

          <font size="+2"> Hello ${person}!</font>

          </#macro>

          使用時:

          <@greet person="emma"> and <@greet person="LEO">

          輸出為:

          <font size="+2"> Hello emma!</font>

          <font size="+2"> Hello LEO!</font>

          注意:宏的參數(shù)是FTL表達式,所以,person=emma和上面的例子中具有不同的意義,這意味著將變量emma的值傳給person,這個值可能是任意一種數(shù)據(jù)類型,甚至是一個復(fù)雜的表達式。

          宏可以有多個參數(shù),使用時參數(shù)的次序是無關(guān)的,但是只能使用宏中定義的參數(shù),并且對所有參數(shù)賦值。如:

          <#macro greet person color>

          <font size="+2" color="${color}"> Hello ${person}!</font>

          </#macro>

          使用時:

          <@greet color="black" person="emma" />正確

          <@greet person="emma" />錯誤,color沒有賦值,此時,如果在定義宏時為color定義缺省值<#macro greet person color="black">這樣的話,這個使用方法就是正確的。

          <@greet color="black" person="emma" bgcolor="yellow" />錯誤,宏greet定義中未指定bgcolor這個參數(shù)

          2、嵌套內(nèi)容:

          2-1、自定義指令可以有嵌套內(nèi)容,使用<#nested>指令,執(zhí)行自定義指令開始和結(jié)束標記之間的模板片段。例如:

          <#macro greet>

          <p>

          <#nested>

          </p>

          </#macro>

          <@greet>hello Emma!</@greet>

          輸出為

          <p>hello Emma!</p>

          2-2、<#nested>指令可以被多次調(diào)用,例如

          <#macro greet>

          <p>

          <#nested>

          <#nested>

          <#nested>

          <#nested>

          </p>

          </#macro>

          <@greet>hello Emma!</@greet>

          輸出為

          <p>

          hello Emma!

          hello Emma!

          hello Emma!

          hello Emma!

          </p>

          2-3、嵌套的內(nèi)容可以是有效的FTL,例如:

          <#macro welcome>

          <p>

          <#nested>

          </p>

          </#macro>

          <#macro greet person color="black">

          <font size="+2" color="${color}"> Hello ${person}!</font>

          </#macro>

          <@welcome>

          <@greet person="Emma" color="red" />

          <@greet person="Andrew" />

          <@greet person="Peter" />

          </@welcome>

          輸出為:

          <p>

          <font size="+2" color="red"> Hello Emma!</font>

          <font size="+2" color="black"> Hello Andrew!</font>

          <font size="+2" color="black"> Hello Peter!</font>

          </p>

          2-4、宏定義中的局部變量對嵌套內(nèi)容是不可見的,例如:

          <#macro repeat count>

          <#local y="test" />

          <#list 1..count as x>

          ${y}${count}/${x}:<#nested />

          </#list>

          </#macro>

          <@repeat count=3>

          ${y?default("?")}

          ${x?default("?")}

          ${count?default("?")}

          </@repeat>

          輸出結(jié)果為

          test 3/1:???

          test 3/2:???

          test 3/3:???

          2-5、在宏定義中使用循環(huán)變量,通常用來重復(fù)嵌套內(nèi)容,基本用法為:作為nested指令的參數(shù),傳遞循環(huán)變量的實際值,而在調(diào)用自定義指令時,在標記的參數(shù)后面指定循環(huán)變量的名字。

          例如:

          <#macro repeat count>

          <#list 1..count as x>

          <#nested x,x/2,x==count />

          </#list>

          </#macro>

          <@repeat count=4;c,halfc,last>

          ${c}. ${halfc}

          <#if last>

          last!

          </#if>

          </@repeat>

          輸出結(jié)果是

          1. 0.5

          2. 1

          3. 1.5

          4. 2last!

          注意:指定循環(huán)變量的數(shù)目和用戶定義指令開始標記指定的不同不會有問題

          調(diào)用時,少指定循環(huán)變量,多指定的值會不見

          調(diào)用時,多指定循環(huán)變量,多余的循環(huán)變量不會被創(chuàng)建

          二、在模板中定義變量

          1、在模板中定義的變量有三種類型

          1-1、plain變量:可以在模板的任何地方訪問,包括使用include指令插入的模板,使用assign指令創(chuàng)建和替換。

          1-2、局部變量:在宏定義體中有效,使用local指令創(chuàng)建和替換。

          1-3、循環(huán)變量:只能存在于指令的嵌套內(nèi)容,由指令(如list)自動創(chuàng)建。

          注意:

          1)、宏的參數(shù)是局部變量,不是循環(huán)變量。

          2)、局部變量隱藏同名的plain變量

          3)、循環(huán)變量隱藏同名的plain變量和局部變量。

          例如:

          <#assign x="plain">

          1. ${x} <#-- plain -->

          <@test />

          6. ${x}

          <#list ["loop"] as x>

          7. ${x} <#-- loop -->

          <#assign x="plain2">

          8. ${x} <#-- loop -->

          </#list>

          9. ${x} <#-- plain2 -->

          <#macro test>

          2. ${x} <#-- plain -->

          <#local x="local">

          3. ${x} <#-- local -->

          <#list ["loop"] as x>

          4. ${x} <#-- loop -->

          </#list>

          5. ${x} <#-- local -->

          </#macro>

          4)、內(nèi)部循環(huán)變量隱藏同名的外部循環(huán)變量

          <#list ["loop1"] as x>

          ${x} <#-- loop1 -->

          <#list ["loop2"] as x>

          ${x} <#-- loop2 -->

          <#list ["loop3"] as x>

          ${x} <#-- loop3 -->

          </#list>

          ${x} <#-- loop2 -->

          </#list>

          ${x} <#-- loop1 -->

          </#list>

          5)、模板中的變量會隱藏數(shù)據(jù)模型中的同名變量,如果需訪問數(shù)據(jù)模型中的變量,使用特殊變量global。

          例如:

          假設(shè)數(shù)據(jù)模型中的user值為Emma

          <#assign user="Man">

          ${user} <#-- Man -->

          ${.global.user} <#-- Emma -->

          posted @ 2009-10-29 13:23 junly 閱讀(1871) | 評論 (0)編輯 收藏

           開始--運行--cmd 進入命令提示符 輸入netstat -ano 即可看到所有連接的PID 之后在任務(wù)管理器中找到這個PID所對應(yīng)

          的程序如果任務(wù)管理器中沒有PID這一項,可以在任務(wù)管理器中選"查看"-"選擇列"

                  經(jīng)常,我們在啟動應(yīng)用的時候發(fā)現(xiàn)系統(tǒng)需要的端口被別的程序占用,如何知道誰占有了我們需要的端口,很多人

          都比較頭疼,下面就介紹一種非常簡單的方法,希望對大家有用

          假如我們需要確定誰占用了我們的9050端口

          1、Windows平臺
          在windows命令行窗口下執(zhí)行:

          C:\>netstat -aon|findstr "9050"TCP    127.0.0.1:9050         0.0.0.0:0              LISTENING       2016

          看到了嗎,端口被進程號為2016的進程占用,繼續(xù)執(zhí)行下面命令:

          C:\>tasklist|findstr "2016"tor.exe                     2016 Console                 0     16,064 K
          很清楚吧,tor占用了你的端口。

          posted @ 2009-10-29 13:10 junly 閱讀(195) | 評論 (0)編輯 收藏
          僅列出標題
          共18頁: First 上一頁 10 11 12 13 14 15 16 17 18 
          主站蜘蛛池模板: 子洲县| 增城市| 洪泽县| 潜江市| 揭东县| 和田市| 垦利县| 沾益县| 石嘴山市| 义马市| 普安县| 合山市| 大荔县| 永清县| 镇宁| 敦化市| 夏津县| 辉县市| 永修县| 根河市| 紫云| 安乡县| 乐安县| 讷河市| 广河县| 曲麻莱县| 商洛市| 佳木斯市| 弥勒县| 清水河县| 泽库县| 惠安县| 墨脱县| 辽宁省| 达尔| 会昌县| 宿松县| 永春县| 商河县| 瑞安市| 普陀区|