随笔-124  评论-49  文章-56  trackbacks-0
 
     摘要: 在我已往的Struts 1.x项目经验中,有个问题不时的出现——在创建FormBean时,对于某个属性到底应该用String还是其它类型? 开发Web应用程序与开发传统桌面应用程序不同,Web应用程序实际上是分布个不同的主机(当然也可以同一个主机,不过比较少见)上的两个进程之间互交。这种互交建立在HTTP之上,它们互相传递是都是字符串。换句话说, 服务器可以的接收到的来自用...  阅读全文

Max 2006-11-07 14:26 发表评论

文章来源:http://www.blogjava.net/max/archive/2006/11/07/79602.html
posted @ 2009-10-29 19:00 junly 阅读(147) | 评论 (0)编辑 收藏
     摘要: Struts 2.0系列之四
国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。  阅读全文

Max 2006-11-01 19:06 发表评论

文章来源:http://www.blogjava.net/max/archive/2006/11/01/78536.html
posted @ 2009-10-29 19:00 junly 阅读(65) | 评论 (0)编辑 收藏
     摘要: 有Struts 1.x经验的朋友都知道Action是Struts的核心内容,当然Struts 2.0也不例外。不过,Struts 1.x与Struts 2.0的Action模型很大的区别。   Struts 1.x Stuts 2.0 ...  阅读全文

Max 2006-10-25 12:10 发表评论

文章来源:http://www.blogjava.net/max/archive/2006/10/25/77157.html
posted @ 2009-10-29 19:00 junly 阅读(93) | 评论 (0)编辑 收藏
     摘要: 在上一篇文章《为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。如果,您看完《为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我。我的E-MAIL:Max.M.Yuan@gmail.com。 在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标...  阅读全文

Max 2006-10-18 12:02 发表评论

文章来源:http://www.blogjava.net/max/archive/2006/10/18/75857.html
posted @ 2009-10-29 19:00 junly 阅读(74) | 评论 (0)编辑 收藏
     摘要: Struts 2.0系列之一
Struts 2.0的简单易用、方便测试相信也会给大家留下不错的印象吧。我相信,Struts 2.0作为一个全新的Web架构,将会再次掀起Web开发的热潮。  阅读全文

Max 2006-10-10 18:35 发表评论

文章来源:http://www.blogjava.net/max/archive/2006/10/10/74353.html
posted @ 2009-10-29 19:00 junly 阅读(73) | 评论 (0)编辑 收藏

明明已经将某个web应用从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的一个应用不只是那个文件夹而已...

 

 

详细操作应该是这样的:

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 阅读(4722) | 评论 (0)编辑 收藏

 /*
 由于javascript是一种无类型语言,所以一个数组的元素可以具有任意的数据类型,同一个数组的不同元素
 可以具有不同的类型,数组的元素设置可以包含其他数组,这样就可以创建一个复杂的数组了.
 并且在这点上说javascript作为一种脚本语言不同于那种严格的面向对象的c++.c#,java了.具有更高的灵活性.
 */

 /*
 *在javascript1.1和其后的版本中,数组是用构造函数Array()和运算符new来创建,
 可用以下的三种方式来创建javascript 中的数组.
 */
 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数据也作数组的下标了,事实上                       并非如您所想       
 //javascript在您是用负数,浮点数,(或布尔型,对象,其他值时),javascript会将它转换为一个字符串
 //用生成的字符串作为对象的属性名字,而不是定义了一个新的数组元素
 //上面的实例事实就是为a 创建了一个名为:"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);
 //以上测试也很明确我们用整数作为数组的下标是才会真正为数组添加一个元素,
 //这里用数组的长度来体现了javascript的数组中的奥妙。


 //通过设置数组的length属性能过截断数组的长度。
 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]);
 }

 //这里测试我们的多维数组元素
 /*
 *javascript中实际上是不支持多维数组
 *但是我们将一个一维数组的元素再赋给其一个一维数组,这样就看起来就实现了多维数组了,但
 实际上他还是个一维数组,这和我们理解c语言的数组时的那种想法一样,但他们的实现机制是不一样的。
 */
 var g=new Array(3);
 g[3]=a;
 g[3][2]="Test"
 document.write("<br />g[3][2]="+g[3][2]);
 
  //数组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());
  //数组的reverse()方法
  c.reverse();
  document.write("<br />c的元素在reverse()方法再join()后的结果是:"+c.join("|"));

  //concat()方法的测试
  var h=new Array(1,2,3);
  h= h.concat([4,5]);
  //但是concat函数不会递归地展开一个元素为数组的数组。
  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()方法:返回的数组包含有第一个参数指定的元素和那个元素开始到第二个参数指定的
//元素为止的元素但不包含第二个参数所指定的元素。


//splice()方法
//splice()方法是插入或删除数组元素通用的方法。
/*
splice函数第一个参数指定了要插入或删除的元素在数组中的位置。
第二个参数指定了要从数组中删除的元个数
在第二参数之后可以有任意多个参数,它们指定的是从第一个参数指定的位置处插入的元素。
第一个元素及后续元素,做出相应的移动。
*/

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中的数组作为堆栈时和php类似
//这点有趣更有用。
//以下是作为堆栈是使用的小实例
/*
push方法是将一个或多个新元素附加到数组的尾部,然后返回数组的新长度。
pop将删除数组的最后一个元素,坚守数组的长度,返回他删除的值。
*/
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()返回的结果是:"+stack.pop());
document.write("<br />stack.length="+stack.length);

//以下是作为队列使用的小实例
/*
unshift方法将一个或多个元素添加到数组元素的头部,然后把已有的元素移动到下标最大的位置已腾出空间
,它返回的是主族的新长度。
方法shift是删除并返回数组的第一个元素,然后将后面的所有元素都向前移动以填补第一个元素留下的空白。
*/
var list=[];
list.unshift(6,2);
document.write("<br >list的内容为:"+list);
document.write("<br>list的shift方法是:"+list.shift());

//此外就剩下,我们在java中熟悉的toString()方法 了
//It's a piece of cake!
document.write(c.toString());
//说白了,其实数组的toString()方法和无参数的join()的效果是完全相同
//OK,this's chapter for Array,that's all!

</script>

posted @ 2009-10-29 13:27 junly 阅读(133) | 评论 (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 阅读(304) | 评论 (0)编辑 收藏

FreeMarker的指令的文件就称为模板(Template)。

模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型。

数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成。

数据类型:

一、基本:

1、scalars:存储单值

字符串:简单文本由单或双引号括起来。

数字:直接使用数值。

日期:通常从数据模型获得

布尔值:true或false,通常在<#if …>标记中使用

2、hashes:充当其它对象的容器,每个都关联一个唯一的查询名字

具有一个唯一的查询名字和他包含的每个变量相关联。

3、sequences:充当其它对象的容器,按次序访问

使用数字和他包含的每个变量相关联。索引值从0开始。

4、集合变量:

除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由<#list...>指令使用的受限sequences。

5、方法:通过传递的参数进行计算,以新对象返回结果

方法变量通常是基于给出的参数计算值在数据模型中定义。

6、用户自定义FTL指令:宏和变换器

7、节点

节点变量表示为树型结构中的一个节点,通常在XML处理中使用。

模板:

使用FTL(freeMarker模板语言)编写

组成部分

一、整体结构

1、注释:<#--注释内容-->,不会输出。

2、文本:直接输出。

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

4、FTL标记

二、指令:

freemarker指令有两种:

1、预定义指令:引用方式为<#指令名称>

2、用户定义指令:引用方式为<@指令名称>,引用用户定义指令时须将#换为@。

注意:如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。

freemarker指令由FTL标记来引用,FTL标记和HTML标记类似,名字前加#来加以区分。如HTML标记的形式为<h1></h1>则FTL标记的形式是<#list></#list>(此处h1标记和list指令没有任何功能上的对应关系,只是做为说明使用一下)。

有三种FTL标记:

1)、开始标记:<#指令名称>

2)、结束标记:</#指令名称>

3)、空标记:<#指令名称/>

注意:

1) FTL会忽略标记之中的空格,但是,<#和指令 与 </#和指令 之间不能有空格。

2) FTL标记不能够交叉,必须合理嵌套。每个开始标记对应一个结束标记,层层嵌套。 如:

<#list>

<li>

${数据}

<#if 变量>

<p>game over!</p>

</#if>

</li>

</#list>

注意事项:

1)、FTL对大小写敏感。所以使用的标记及interpolation要注意大小写。name与NAME就是不同的对象。<#list>是正确的标记,而<#List>则不是。

2)、interpolation只能在文本部分使用,不能位于FTL标记内。如<#if ${var}>是错误的,正确的方法是:<#if var>,而且此处var必须为布尔值。

3)、FTL标记不能位于另一个FTL标记内部,注释例外。注释可以位于标记及interpolation内部。

三、表达式

1、直接指定值:

1-1、字符串:

由双引号或单引号括起来的字符串,其中的特殊字符(如' " \等)需要转义。

1-2、raw字符串:

有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子:

${r"/${data}"year""}屏幕输出结果为:/${data}"year"

转义    含义

序列  

\"  双引号(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、数字:直接输入,不需要引号

1)、精度数字使用“.”分隔,不能使用分组符号

2)、目前版本不支持科学计数法,所以“1E3”是错误的

3)、不能省略小数点前面的0,所以“.5”是错误的

4)、数字8、+8、08和8.00都是相同的

1-4、布尔值:true和false,不使用引号

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

1)、子变量列表可以是表达式

2)、可以使用数字范围定义数字序列,<b>不需要方括号限定</b>,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定义反递增范围如:5..2。

1-6、散列(hash)

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

2)、键和值都是表达式,但是键必须是字符串。

2、获取变量:

2-1、顶层变量:${变量名}

变量名只能是字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。

2-2、散列:有两种方法

1)、点语法:变量名字和顶层变量的名字受同样的限制

2)、方括号语法:变量名字无限制,可以是任意的表达式的结果

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、序列:使用散列的方括号语法获取变量,方括号中的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用

[startindex..endindex]语法获取序列片段。

2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。

3、字符串操作

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

${"hello${username}!"}

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

也可以使用+来获得同样的结果:

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

${username+username+username}

注意:${}只能用于文本部分而不能出现于标记内。

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

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

本例中user.login的值必须是布尔类型。

3-2、子串:

举例说明:假如user的值为"Big Joe"

${user[0]}${user[4]}结果是:BJ

${user[1..4]}结果是:ig J

4、序列操作

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

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

5、散列操作

5-1、连接操作:可以使用+来操作,如果有相同的KEY,则右边的值会替代左边的值,例如:

{"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}结果month的值就是6。

6、算术运算

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

除+号以外的其他操作符两边的数据,必须都是数字类型。

如果+号操作符一边有一个字符型数据,会自动将另一边的数据转换为字符型数据,运算结果为字符型数据。

6-2、比较操作符:

1)、=

2)、==

3)、!=

4)、<

5)、<=

6)、>

7)、>=

1-3的操作符,两边的数据类型必须相同,否则会产生错误

4-7的操作符,对于日期和数字可以使用,字符串不可以使用。

注意:

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

2)、因为<和>对FTL来说是开始和结束标记,所以,可以用两种方法来避免这种情况:

一种是使用括号<#if (a<b)>

另一是使用替代输出,对应如下:

<  lt

<= lte

>  gt

>= gte

6-3、逻辑操作符:只能用于布尔值,否则会出现错误。

&&(and)与运算

||(or)或运算

!(not)非运算

6-4、内建函数:使用方法类似于访问散列的子变量,只是使用?代替.例如:${test?upper_case?html}

常用的内建函数列举如下:

1)、字符串使用

html:对字符串进行HTML编码

cap_first:字符串第一个字母大写

lower_first:字符串第一个字母小写

upper_case:将字符串转换成大写

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

2)、序列使用:

size:获得序列中元素的数目

3)、数字使用:

int:取得数字的整数部分

7、操作符的优先顺序:

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

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

内建:?

乘法:*、/、%

加法:+、-

关系:<、<=、>、>= (lt、lte、gt、gte)

相等:=、==、!=

逻辑与:&& (and)

逻辑或:|| (or)

数字范围:..

四、interpolation

inperpolation只能用于文本,有两种类型:通用interpolation及数字interpolation

1、通用interpolation

如${expr}

1-1、插入字符串值:直接输出表达式结果。

1-2、插入数字值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数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、插入日期值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数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、插入布尔值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation

如:

<#assign foo=ture />

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

2、数字interpolation:

有两种形式:

1)、#{expr}

2)、#{expr;format}:format可以用来格式化数字,format可以是如下:

mX:小数部分最小X位

MX:小数部分最大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 -->

杂项

一、用户定义指令

变换器变量是两种不同类型的用户自定义指令,他们的区别是:

宏可以在模板中用macro指令来定义

变换器是在模板外由程序定义

1、宏:和某个变量关联的模板片段,以便在模板中通过用户自定义指令使用该变量

1-1、基本用法:

例如:

<#macro greet>

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

</#macro>

使用时:

<@greet></@greet>

如果没有体内容也可以用

<@greet />

1-2、变量:

1)、可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义中有效。如:

<#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>

注意:宏的参数是FTL表达式,所以,person=emma和上面的例子中具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意一种数据类型,甚至是一个复杂的表达式。

宏可以有多个参数,使用时参数的次序是无关的,但是只能使用宏中定义的参数,并且对所有参数赋值。如:

<#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这个参数

2、嵌套内容:

2-1、自定义指令可以有嵌套内容,使用<#nested>指令,执行自定义指令开始和结束标记之间的模板片段。例如:

<#macro greet>

<p>

<#nested>

</p>

</#macro>

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

输出为

<p>hello Emma!</p>

2-2、<#nested>指令可以被多次调用,例如

<#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、嵌套的内容可以是有效的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、宏定义中的局部变量对嵌套内容是不可见的,例如:

<#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>

输出结果为

test 3/1:???

test 3/2:???

test 3/3:???

2-5、在宏定义中使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。

例如:

<#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>

输出结果是

1. 0.5

2. 1

3. 1.5

4. 2last!

注意:指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题

调用时,少指定循环变量,多指定的值会不见

调用时,多指定循环变量,多余的循环变量不会被创建

二、在模板中定义变量

1、在模板中定义的变量有三种类型

1-1、plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。

1-2、局部变量:在宏定义体中有效,使用local指令创建和替换。

1-3、循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建。

注意:

1)、宏的参数是局部变量,不是循环变量。

2)、局部变量隐藏同名的plain变量

3)、循环变量隐藏同名的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)、内部循环变量隐藏同名的外部循环变量

<#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)、模板中的变量会隐藏数据模型中的同名变量,如果需访问数据模型中的变量,使用特殊变量global。

例如:

假设数据模型中的user值为Emma

<#assign user="Man">

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

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

posted @ 2009-10-29 13:23 junly 阅读(1843) | 评论 (0)编辑 收藏

 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应

的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列"

        经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人

都比较头疼,下面就介绍一种非常简单的方法,希望对大家有用

假如我们需要确定谁占用了我们的9050端口

1、Windows平台
在windows命令行窗口下执行:

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

看到了吗,端口被进程号为2016的进程占用,继续执行下面命令:

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

posted @ 2009-10-29 13:10 junly 阅读(169) | 评论 (0)编辑 收藏
仅列出标题
共18页: First 上一页 10 11 12 13 14 15 16 17 18