beetl模板使用场景_Beetl

BeetlÄ£°åÓïÑÔʹÓÃÖ¸ÄÏ

---Àî¼ÒÖÇ2013-1-30£¨ÐÂÄêÊ×·¢°æ£©

¸ÐлÀÏÆźͶù×Ó£¬ÓÐʱºòÈÝÈÌÎһص½¼Òºó»¹¼ÌÐøд´úÂë

¸Ðл¹«Ë¾ºÍͬÊ£¬¶¼Õâô棬»¹Ö§³ÖÎÒÍê³ÉBeetl

¸ÐлʹÓÃBeetlµÄÄ°ÉúÅóÓÑ£¬Ç×~ûÓÐÄãÃÇ£¬BeetlÒ²²»¿ÉÄÜ×öµ½×îºÃ

BeetlÊÇBee

Template language£¬BeeÒëΪæµµÄÈË£¬ÒâָæµÖйúµÄ¿ª·¢ÈËÔ±¡£Ä¿Ç°°æ±¾1.2.0£¬Õû¸ö´óС415K£¬Ëü¾ßÓÐÈçÏÂÌØÐÔ£º

1·Ç³£¼òµ¥£ºËüµÄÓï·¨ÊÇjavascriptÒ»¸ö×Ó¼¯£¬Ö»ÓÐÉÙÁ¿µÄ´ó¼ÒÊìϤµÄ·ûºÅ¡£ÈκÎÁ˽âjava£¬»òÕßjavascriptµÄÈË£¬¶¼ÄÜ¿ìËÙѧ»á¡£Èç¹û´ÓδÓùýÈκÎÄ£°åÓïÑÔ£¬ÓÃBeetlÊǷdz£ºÜºÏÊʵÄ.²»ÐèÒªÔÚѧϰһÖÖµÄеÄÓïÑÔÓï·¨¡£Óï·¨¿ÉÒԲο¼ÔÚÏßѧϰÍøÕ¾

2¹¦ÄÜÆëÈ«£ºbeetl¾ßÓÐÄ¿Ç°Á÷ÐеÄÄ£°åÒýÇæËùÖ§³ÖµÄ¹¦ÄÜ£¬Èç¾ßÓÐ freemarkerËùÌṩµÄ¾ø´ó²¿·Ö¹¦ÄÜ£¨²Î¿¼ ÓÐÓÐЩ¶ÀÌع¦ÄÜÊÇÕâЩÓÐ10ÄêÒÔÉÏÀúÊ·Ä£°åÒýÇæËù²»¾ß±¸µÄ¡£

3ÐÔÄÜ׿Խ£ºÔÚÓÅ»¯Ä£Ê½(°üÀ¨¶¯Ì¬±àÒë³ÉclassºÍ²ÉÓÃbyteÊä³ö)ÏÂÔËÐУ¬Ã¿ÃëäÖȾģ°åÊý¸ßÓÚÆäËûÄ£°åÒýÇ棬¶øÏûºÄµÄϵͳ×ÊÔ´µÍÓÚÆäËûÄ£°åÒýÇæ¡££¨FreemarkerµÄ2-4±¶

4ÌṩһϵÁÐÆäËûÄ£°åÓïÑÔûÓÐÌṩµÄ¹¦ÄÜ£¬Èç×Ô¶¨Òåռλ·ûºÅ£¬¿ØÖÆÓï¾ä·ûºÅ£¬Ä£°å±äÁ¿,ÐéÄâÊôÐÔ£¬×Ô¶¨Ò庯Êý£¬±êÇ©tagµÈ£¬°²È«Êä³öµÈ¡£ËüÃDz¢²»¸´ÔÓ£¬µ«ÓпÉÄܽâ¾öÄãÔÚʹÓñðµÄÄ£°åÓïÑÔʱºòÓöµ½µÄһЩ²»±ã½ÝµÄÎÊÌâ¡£

5¿ÉÒÔÖ§³ÖÄ£°åµÄµ¥¶À¿ª·¢ºÍ²âÊÔ£¬¼´ÔÚMVC¼Ü¹¹ÖУ¬¼´Ê¹Ã»ÓÐMºÍC²¿·Ö£¬Ò²ÄÜ¿ª·¢ºÍ²âÊÔÄ£°å¡£

6ͬʱ֧³Ö½ÏΪËÉÉ¢µÄMVCºÍÑϸñµÄMVC£¬Èç¹ûÔÚÄ£°åÓïÑÔÀïǶÈë¼ÆËã±í´ïʽ£¬¸´ÔÓÌõ¼þ±í´ïʽ£¬ÒÔ¼°º¯Êýµ÷ÓÃÓиÉÉæÒµÎñÂß¼­ÏÓÒÉ£¬Äã¿ÉÒÔ½ûֹʹÓÃÕâЩÓï·¨¡£¹ØÓÚÕâÒ»µã£¬¿ÉÒԲο¼

7ÄÜÓëSerlvet,Spring MVC,Struts2,JFinalµÈweb¿ò¼Ü½áºÏÆðÀ´

1.1.BeetlÄÜΪÄã×öЩʲô

×÷Ϊģ°åÓïÑÔ£¬Äã¿ÉÒÔÓÃÓÚÈκÎÊʺÏÔÚMVCµÄµØ·½¡£Èç´úÂëÉú³É£¬»òÕß³¬´ó¹æÄ£·ÃÎÊÁ¿µÄ»¥ÁªÍø£¬µçÉ̵Ķ¯Ì¬web½çÃ棬ÔÚ¹¦ÄÜÉϺÍÐÔÄÜÉÏËüÍêÈ«ÄÜ´úÌæÄ¿Ç°Á÷ÐеÄFreemarker£¬Velocity¡£Èç¹ûÓÐÈκÎÎÊÌ⣬¿ÉÒÔ·ÃÎÊQQȺ219324263£¬»òÕß·¢ËÍÓʼþµ½xiandafu@126.com

ÒòΪBeetlÊÇ»ùÓÚantlrʵÏÖÓï·¨½âÎöµÄ£¬Òò´ËÈç¹ûÄã½ö½ö¶Ôantlr¸ÐÐËȤ£¬beetlÈÔÈ»¿ÉÒÔ×÷ΪÄãµÄÒ»¸öÖØÒª²Î¿¼

1.2.Beetl¿É¿¿Ã´£¿ÐÔÄÜÈçºÎ£¿

BeetlÒѾ­Óв»ÉÙʹÓÃÕߣ¬Óеç×ÓÉÌÎñϵͳ£¬Ò²ÓÐÆóÒµÄÚ²¿¹ÜÀíϵͳ£¬Ò²ÓдóÐÍÃÅ»§ÍøÕ¾£¬¾­¹ý¹ýÁËÒ»Äê¶àµÄʹÓú͸Ľø£¬beetlÒѾ­ºÜÎȶ¨¿É¿¿ÁË£¬ÈçÏÂʽBeetlµÄµ¥Ôª²âÊÔ¡£

BeetlµÄÐÔÄÜÒ²·Ç³£²»´í£¬Õë¶ÔÁ÷ÐеÄFreemarker£¬×öÁ˵¥ÏîºÍÕûÌå²âÊÔ£¬Ã¿Ò»ÏÄܳ¬¹ýFreemarker¡£

1.3.BeetlĿǰʹÇé¿ö

BeetlĿǰÿÖÜÏÂÔØÁ¿³¬¹ý70¸ö£¨º¬ÎĵµÏÂÔØ£©£¬ÒÑÖªµÄÄܹ«¿ªÁªÏµ·½Ê½µÄʹÓÃÕßÈçϵ«²»ÏÞÓÚÈçÏÂ

MR.ÖÜ: thinking_chou@126.com

£Ù£Ñ:115649963

°ëÊÞÈË:http://my.oschina.net/sqhua/blog

Ô­ÉÏÒ»¿Ã²Ý:1086306

ÑîÏ×Ã÷:http://my.oschina.net/gtd

ÖÜÀÚ:http://my.oschina.net/b1412

kyle1970:http://my.oschina.net/kyle1970

Green:http://software-lgl.blogspot.com.au/

點點¡­愛護:http://my.oschina.net/hdjwhy/blog

´óÁ¬-ƾº£ÁÙ·ç:http://my.oschina.net/dlpinghailinfeng/

СС:http://my.oschina.net/u/927334

ÀèÃ÷ΰ:limingwei@mail.com

²Ý¸ùºÜæ:mintelyu@126.com

·Ü¶·:http://www.riaway.com/

ÂóÌï:http://276708050.qzone.qq.com/

ddrÀϱ±: http://my.oschina.net/hoodoon/blog

packageorg.bee.tl.samples;

importorg.bee.tl.core.GroupTemplate;

importorg.bee.tl.core.Template;

publicclassHelloworld

{

publicstaticvoidmain(String[]

args)throwsException

{

String

input ="hello,${name}!";

GroupTemplate

group =newGroupTemplate();/1

Template

template = group.getStringTemplate(input); /2

template.set("name","beetl");/3

String

output = template.getTextAsString();/4

System.out.println(output);

}

}

1ÓÿյĹ¹Ô캯Êý´´½¨ GroupTemplate´´½¨Ò»¸öÄ£°å,ÄܽÓÊÕÒ»¸ö×Ö·û´®Ä£°å¡£¸ü³£¼ûµÄÊÇÓÃÄ£°åÎļþ¸ùĿ¼³õʼ»¯GroupTemplate¡£ÈçGroupTemplategroup =

new GroupTemplate(new File(¡°c:\templateroot¡±))£¬ÄܽÓÊÕÒ»¸öÄ£°åÎļþ´´½¨Ä£°å

2Ä£°åÊÇString£¬Í¨¹ýGroupTemplateµÄgetStringTemplate´´½¨Ò»¸öÄ£°åÀàTemplate¡£¡°${¡± ¡°}¡±ÊÇÄ£°åÀïµÄռλ·ûºÅ¡£ÀïÃæµÄ±í´ïʽ¼ÆËãºó½«Êä³ö¡£ÔÚ´ËÀý×ÓÀnameÊÇÒ»¸ö±äÁ¿

Èç¹ûÄ£°åÊÇÒ»¸öÎļþ£¬ÔòÐèÒªgetFileTemplate£¬´«ÈëÒ»¸öÏà¶ÔrootµÄ·¾¶À´´´½¨Ò»¸öÄ£°åÀ࣬Èç

GroupTemplategroup= new

GroupTemplate(new File(¡°c:/templateroot¡±))

Template template=

group.getFileTemplate(¡°/user/userList.html¡±);

GroupTemplate»á½âÎöc:/templateroot/user/userList.html

3template.set("name","beetl")ÊǶ¨ÒåÄ£°å±äÁ¿£¬set·½·¨ÔÊÐí ×Ö·û´®-¶ÔÏó×÷¶ÔΪ²ÎÊý.×Ö·û´®ÎªÄ£°åÀïµÄ±äÁ¿Ãû£¬Òò´Ë×Ö·û´®±ØÐëºÏºõjava±äÁ¿Ãû¹æÔò£¬Èç×Öĸ¿ªÍ·£¬²»ÄÜÓпոñµÈ¡£ ͨ¹ýset·½·¨ÉèÖñäÁ¿ºó£¬¿ÉÒÔÔÙÄ£°åÀïÈκεط½Ö±½ÓÒýÓá£

Èç¹ûÐèÒªÒýÓöÔÏóµÄÊôÐÔ£¬ÔòÓÃСÊýµã£¬Èç${user.name},Èç¹û¶ÔÏóÊǸöÊý×é»òÕßList¼¯ºÏ£¬¿ÉÒÔÓÃ[Ë÷Òý],Èç${user.friends[0]},Èç¹û¶ÔÏóÊÇMap¼¯ºÏ£¬Ê¹ÓÃ[key],keyΪÈκζÔÏó£¬Èç${books[¡®thinking in java¡¯].author}

4µ÷ÓÃtemplate.getTextAsString()»òÕßtemplate.getText(Writer)»òÕß template.getText(OutputStream os)¶¼¿ÉÒÔ»ñµÃÄ£°åäÖȾµÄ½á¹û£¨Èç¹ûÉèÖÃÔÊÐíbyteÖ±½ÓÊä³ö£¬ÔòÖ»ÄÜÓÃOutputStream£¬²Î¿¼¸ß¼¶ÌØÐÔhello,beetl!

BeetlĬÈÏÇé¿öÏ£¬Ä£°å²ÉÓÃ×÷Ϊ¿ØÖÆÓï¾ä½áÊø

hello,${user.name}

ĬÈÏÇé¿öÏ£¬Õ¼Î»·ûºÅʹÓÃ"${"×÷Ϊ¿ªÊ¼ºÍ"}"½áβռλ·ûºÅ

${users[index]}

È»¶ø£¬BeetlÖ§³Ö×Ô¶¨Òå¿ØÖÆÓï¾äºÍռλ·ûºÅ£¬ÒÔÊÊÓ¦²»Í¬ÀàÐÍÄ£°åÎļþ,Èç¹ûÓÐÄãϲ»¶µÄ·ç¸ñ£¬Æ©ÈçhtmlÄ£°åÖУ¬Ê¹Óã¬Ôò¿ÉÒÔ²ÉÓÃÈç϶¨Òå

public static void main(String[] args) {

GroupTempate group = new GroupTemplate(root);

group.setStatementStart("");

group.setPlaceholderStart("${");

group.setPlaceholderStart("}");

//»òÕß¿ÉÒÔÖ±½Óµ÷ÓÃ//group.config("","${","}");

File child = ¡­..

Template template =group.getFileTemplate(child);

String output = template.getTextAsString();

}

´Ë´úÂë¿ÉÒÔ½âÎöÈçÏÂÄ£°åÎļþ

Hello

${name} ${greeting~}

BeetlʹÓÃÕß³£ÓõĿØÖÆÓï¾ä¶¨½ç·ûºÅÓÐ

l

l ?>

l@ºÍ»Ø³µ(ÉèÖö¨½ç·ûºÅλnull£¬¼´¿É)£¬Èç@for(user in userList){

hello,${user.name}

@}

l»òÕß

l#:ºÍ »Ø³µ

BeetlÓû§³£Ê¹ÓõÄռλ·ûºÅÖ÷ÒªÊÇ¡±${}¡±»òÕß ¡°$ $¡±,¡±^

^¡±

ÒÔÏÂÄÚÈÝÈç¹û²»×öÌØÊâ˵Ã÷£¬¿ØÖÆÓï¾äʹÓúÍռλ·ûºÅ²ÉÓÃ${}

BeetÓÐÁ©ÖÖ±äÁ¿£¬Ò»ÖÖÊÇͨ¹ýtemplate.set(...)Öд«ÈëµÄ£¬Õâ¸öÊÇÖ»¶ÁÈ«¾Ö±äÁ¿£¬ÔÚÄ£°åÖÐÈκÎÒ»´¦£¬°üÀ¨×ÓÄ£°åµÈ¶¼¿ÉÒÔ±»ÒýÓ㬵«²»Äܸü¸Ä£¬ÁíÍ⣬BeetlÒ²ÔÊÐí¶¨ÒåÁÙʱ±äÁ¿£¬(ÔÚÄ£°åÒ³Ã棬ʹÓÃÁÙʱ±äÁ¿²¢²»ÖµµÃÍƼö£¬µ«BeetlÄÜÖ§³Ö£©£¬ÈçÏÂËùʾ

name='lijz',loopCount=100+other ,girlName;%>

¹Ø¼ü×ÖvarÊDZØÐëµÄ£¬Õâµã²»Í¬ÓÚjavascript

BeeltÖеñäÁ¿Í¬javascript²»Ò»Ñù£¬Ã»ÓÐ×Ô¼ºµÄ×÷ÓÃÓò£¬Õâµã¸újavaÀàËÆ£¬ÈçÏ»ᱨ´í£¬¡°±äÁ¿ÒѾ­¶¨Ò塱¡£ÔçÆð°æ±¾Ö§³Öjavascript×÷ÓÃÓò£¬µ«ÏÔÈ»Õâ²¢²»ÊÇÒ»¸öºÃÌØÐÔ

name=¡¯lijz¡¯,i=1;

%>

=1){%>

Hello,${name}

BeetlÖ§³Ö¶¨ÒåJson±äÁ¿£¬ËäÈ»´Ë¹¦Äܲ¢²»ÊǺÜʵÓã¬ÍƼö¸´ÔÓµÄÊý¾Ý½á¹¹£¬»¹ÊÇÒªÔÙ¿ØÖƲãÉèÖñȽϺÃ

usersList=[{¡°name¡±:¡±lijz¡±,¡±age¡±:18},{¡°name¡±:¡±lucy¡±,¡±age¡±:16}];%>

ËýµÃÃû×ÖÊÇ${userList[1][¡°name¡±]}

Beetl½«ÉÏÊöJson±äÁ¿¶ÔÓ¦ÓÚjavaµÄMap»òÕßList£¬ÈçÉÏÀý×ÓÔòÊÇÒ»¸öList£¬°üº¬ÁËÈý¸öMap£¬µÚÒ»¸öMapµÄname½¡Öµ¶ÔÓ¦ÓÚ¡°lijz¡±

JsonµÄkeyÖµÒ²¿ÉÒÔ²»Óõ¥Ë«ÒýºÅ£¬ÈçÉÏÀý£¬Ò²¿ÉÒÔд³É

usersList=[{name:¡±lijz¡±,age:18},{name:¡±lucy¡±,age:16}];%>

¶ÔÓÚBeetlÖгöÏÖµÄÕûÐλòÕ߸¡µãÐÍ£¬¶ÔÓ¦ÓÚjavaÖÐBeeNumber,ÊÇÒ»¸öÖ§³Ö³¤¾«¶ÈÐ͵ÄÀà.beetl²¢²»ÊÔͼwrap java¶ÔÏó£¬ÕⲻͬÓÚ±ðµÄÄ£°åÓïÑÔ£¬µ«ÎªÁËÖ§³Ö³¤¾«¶ÈÔËË㣬ģ°åÓïÑÔÖеÄÊý×ÖÐͶ¼ÓÃBeeNumber´ú±í

±äÁ¿ÃüÃû¹æÔòͬjavascript»òÕßjava£¬µ«²»ÔÊÐíÒÔÁ©¸öÏ»®Ïß¿ªÍ·"__",ÕâÊÇÒòΪÒÔ´Ë¿ªÍ·µÄ¶àΪBeetlÄÚ²¿µÄһЩÁÙʱ±äÁ¿

ÊôÐÔÒýÓÃÊÇÄ£°åÖеÄÖØÒªÒ»²¿·Ö£¬beetlÖ§³ÖÊôÐÔÒýÓÃÈç¹ûjavascriptµÄÖ§³Ö·½Ê½Ò»Ñù£¬ÈçÏÂ

1BeetlÖ§³Öͨ¹ý¡±.¡±ºÅÀ´·ÃÎʶÔÏóµÄµÄÊôÐÔ£¬Èç¹ûjavascriptÒ»Ñù¡£Èç¹ûUser¶ÔÏóÓиögetName()·½·¨£¬ÄÇôÔÚÄ£°åÖУ¬¿ÉÒÔͨ¹ý${xxx.name}À´·ÃÎÊ

2Èç¹ûÄ£°å±äÁ¿ÊÇÊý×é»òÕßListÀ࣬Õâ¿ÉÒÔͨ¹ý[]À´·ÃÎÊ£¬Èç${userList[0]}

3Èç¹ûÄ£°å±äÁ¿ÊÇMapÀ࣬Õâ¿ÉÒÔͨ¹ý[]À´·ÃÎÊ£¬Èç${map[¡°name¡±]},Èç¹ûkeyÖµÊÇ×Ö·û´®ÀàÐÍ£¬Ò²¿ÉÒÔʹÓÃ${map.name}.µ«²»½¨ÒéÕâôʹÓã¬ÒòΪ»áÈÃÄ£°åÔĶÁÕßÎóÒÔΪÊÇÒ»¸öPojo¶ÔÏó

4BeetlÒ²Ö§³ÖGeneric Get·½Ê½£¬¼´Èç¹û¶ÔÏóÓÐÒ»¸öpublic Object get(String key)·½·¨£¬¿ÉÒÔͨ¹ý¡±.¡±ºÅ»òÕß[]À´·ÃÎÊ£¬Æ©Èç

${activityRecord.name}»òÕß${activityRecord[¡°name¡±] }¶¼½«µ÷ÓÃactivityRecordµÄget(String key)·½·¨¡£Èç¹û¶ÔÏó¼ÈÓоßÌåÊôÐÔ£¬ÓÖÓÐGeneric get£¨ÕâÖÖÄ£ÐÍÉè¼Æ·½Ê½ÊDz»ÖµµÃ¹ÄÀø£©£¬ÔòÒÔ¾ßÌåÊôÐÔÓÅÏȼ¶¸ß.

5BeetlÒ²¿ÉÒÔͨ¹ý[]À´ÒýÓÃÊôÐÔ£¬Èç${user[¡°name¡±]}Ï൱ÓÚ${user.name}.Õâ¸újavascript±£³ÖÒ»Ö¡£µ«½¨Òé²»Õâô×ö£¬ÒòΪÈÝÒ×ÈÃÔĶÁÄ£°åµÄÈËÎóÈÏΪÕâÊÇÒ»¸öMapÀàÐÍ

BeetlÖ§³ÖÀàËÆjavascriptµÄËãÊõ±í´ïʽºÍÌõ¼þ±í´ïʽ£¬Èç+ - * / %ÒÔ¼°£¨£©£¬ÈçÏÂÀý×Ó

the result

is ${(a+b)*c-0.75}

×¢£ºËãÊý±í´ïʽºÍÂß¼­±í´ïʽÎÞÐèµ£ÐļÆË㾫¶ÈÎÊÌ⣬beetlµ×²ãÓÃBeeNumberÀ´ÊµÏÖ£¬Ö§³Ö³¤¾«¶È¼ÆËã

BeetlÖ§³ÖÀàËÆJavascript,javaµÄÌõ¼þ±í´ïʽ

Èç>£¬= , <=ÒÔ¼°!,ÈçÏÂÀý×Ó

a=1,b=2,c=3;if((b-c)>=1){ %>

Hello

big!

:( ,small!

ÅжϱäÁ¿ÊÇ·ñΪnull£¬Í¬jsÒ»Ñù£¬Èçif(a==null)

ÅжϱäÁ¿£¨È«¾Ö±äÁ¿£©ÊÇ·ñ´æÔÚ£¬¿ÉÒÔÓÃexistº¯Êý£¬Èçif(exist(¡°a¡±)),Ò²¿ÉÒÔʹÓð²È«Êä³öÌØÐÔ£¬Èç

If(a!¡¯¡¯==¡¯¡¯)Èç¹ûa²»´æÔÚ£¬»òÕßaΪnull£¬»òÕßaÊÇ¿Õ×Ö·û´®£¬¾ù·µ»Øtrue¡£ÏêϸÇë²Î¿¼°²È«Êä³ö

2.7.Ñ­»·Óï¾ä

BeetlÖ§³Öfor

inÑ­»·¸ñʽ£¬ºÍwhileÑ­»·£¬ÒÔ¼°break£¬continue£¬return (ʵ¼ÊÉÏ¿ÉÒÔ³öÏÖÔÚÈκεط½)£¬ÈçÏÂÀý×Ó

//java´úÂë

tempalte.set("userList",userList);

//Ä£°å

×ܹ²${userList.~size}

${user_index} . Welcome ${user.name}!

Ñ­»·ÖпÉÒÔʹÓÃÊý×飬List»òÕßMapµÄ×ÓÀ࣬µ±Ê¹ÓÃMap×ÓÀàµÄʱºò£¬ÈçÏÂÀý×Ó

softMap={'beetl':'very good ','freemarker':'very

good!'};%>

Compare

the ${softMap.~size} soft ware as follows

${soft_index}

/ ${soft_size} . ${soft.key} is ${soft.value}

key¼ÈÊÇMapÀïµÄkeyÖµ

value¼ÈÊÇMapÀïµÄValue

Èç¹ûÑ­»·ÖУ¬ÐèÒªÒýÓõ±Ç°Ë÷Òý,±äÁ¿Ãû¼ÓÉϺó׺¡°_index¡±,´ú±íµ±Ç°Ñ­»·µÄ¼ÆÊýÆ÷£¬´Ó0¿ªÊ¼¡£ÔÚÑ­»·ÌåÀﻹ¿ÉÒÔ±äÁ¿Ãû¼ÓÉϺó×î_size±íʾ³¤¶È

BeetlÒ²¿ÉÒÔÔÚ¼¯ºÏ±äÁ¿Ãûºó¼ÓÉÏ"!"ÓÃÒÔ°²È«Êä³ö£¬¼´Èç¹û¼¯ºÏΪnull£¬ÔòÒ²²»½øÈëÑ­»·Ì壬Èç

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

BeetlÒ²Ö§³ÖwhileÑ­»·£¬Æä¸ñʽÊÇwhile(Ìõ¼þ±í´ïʽ){}£¬ÈçÏÂÀý×Ó£¬Ñ­»·4´ÎÊä³ö

vara = 1;

while(a<5){

%>

${a}

a=a+1;

}

%>

BeetlÖ§³Öͬjavascript£¬javaÒ»ÑùµÄifÓï¾ä£¬ºÍswitch.ÈçÏÂÀý×Ó

isGirl = true;%>

¹ÃÄÄãºÃ

С»ï×Ó£¬ÄãºÃ

SwitchºÍcase¿ÉÒÔʹÓÃÈκαí´ïʽ£¬ÏÂÁÐÖУ¬switch½«±äÁ¿scoreÓëcaseÖеø÷¸ö³£Á¿±È½Ï£¬Èç¹ûûÓÐÕÒµ½£¬ÔòÖ´ÐÐdefault

score = 1;%>

Get 1 score!

Default here

}%>

BeetlÄÚÖÃÁËÉÙÁ¿ÊµÓú¯Êý£¬¿ÉÒÔÔÚBeetlÈκεط½µ÷Óã¬Ò»°ãÇé¿öÊÇÔÚռλ·ûÀïµ÷Óá£

ÈçÏÂÀý×ÓÊǵ÷ÓÃdateº¯Êý£¬²»´«²ÎÊýÇé¿öÏ£¬·µ»Øµ±Ç°ÈÕÆÚ

Todayis ${date()}

BeetlÔÊÐíÓû§×Ô¶¨Ò庯ÊýÒÔÊʺÏÌض¨ÁìÓòʹÓã¬Çë²Î¿¼¸ß¼¶Ó÷¨¡£Ò²»¶Ó­ÓÐÈË°ÑËûÈÏΪÄܹ«Óõĺ¯Êý·¢¸øÎÒ£¬ÎÒ½«×÷ΪºËÐĺ¯Êý·ÅÈëbeetlÀï

¼¸ºõËùÓеÄÄ£°åÓïÑÔ¶¼Ö§³Ö¸ñʽ»¯£¬BeetlÒ²²»ÁÐÍ⣬ÈçÏÂÀý×ÓBeetlÌṩµÄÄÚÖÃÈÕÆÚ¸ñʽ

date = date(); %>

Today is

${date,dateFormat="yyyy-MM-dd"}.

Today is

$date,dateFormat$

¸ñʽ»¯º¯ÊýÖ»ÐèÒªÒ»¸ö×Ö·û´®×÷Ϊ²ÎÊý·ÅÔÚ=ºÅºóÃ棬Èç¹ûûÓÐΪ¸ñʽ»¯º¯ÊýÊäÈë²ÎÊý£¬ÔòʹÓÃĬÈÏÖµ£¬dateFormat¸ñʽ»¯º¯ÊýĬÈÏÖµÊÇlocal

BeetlÔÊÐíÓû§×Ô¶¨Òå¸ñʽ»¯º¯ÊýÒÔÊʺÏÌض¨ÁìÓò£¬Çë²Î¿¼¸ß¼¶Óû§£¬Ò²»¶Ó­ÓÐÈË°ÑËûÈÏΪÄܹ«Óõĸñʽ»¯º¯Êý·¢¸øÎÒ£¬ÎÒ½«×÷ΪºËÐĺ¯Êý·ÅÈëbeetlÀï

2.11.Ö±½Óµ÷ÓÃclass·½·¨ºÍÊôÐÔ

ĬÈÏÇé¿ö£¬ÊDz»ÔÊÐíÖ±½Óµ÷ÓöÔÏóµÄ·½·¨µÄ£¬±ØÐëÏȵ÷ÓÃgroupTemplate.enableNativeCall();

${@user.getMaxFriend(¡°lucy¡±)}

${@user.maxFriend}

${@com.xxxx.constants.Order.getMaxNum()}

var max = @com.xxxx.constants.Order.MAX_NUM;

%>

¿ÉÒÔµ÷ÓÃinstanceµÄpublic·½·¨ºÍÊôÐÔ£¬Ò²¿ÉÒÔµ÷Óþ²Ì¬ÀàµÄÊôÐԺͷ½·¨,ÐèÒª¼ÓÒ»¸ö@ָʾ´Ëµ÷ÓÃÊÇÖ±½Óµ÷ÓÃclass

Ä¿Ç°Beetl²»Ö§³ÖÁ¬Ðøµ÷ÓÃClass·½·¨ºÍÊôÐÔ£¬ÈçÏÂÁÐÊÇ·Ç·¨µÄ

@com.xxxx.constants.Order.getMaxNum().intValue()

BeetlĬÈÏÇé¿öʹÓÃorg.bee.tl.core.DefaultErrorHandlerÀ´´¦ÀíÓï·¨½âÎö´íÎóºÍÔËÐÐʱ¿ÌµÄ´íÎó£¬ÔÚ½âÊÍÖ´ÐеÄÈÏÇé¿öÏ£¬»áÏÔʾÈçÏÂÐÅÏ¢

l´íÎóÐкÅ

l´íÎóÔ­ÒòÒÔ¼°Òì³£Õ»

l´íÎóµÄ¹Ø¼ü×Ö

lÒÔ¼°´íÎóÉÏÏÂ3ÐÐ

l´íÎóËùÔÚµÄÄ£°åÎļþ

ÈçÏÂËùʾ

Template t = new BeeTemplate("

c=1;}%>");

//ʹÓÃÑϸñMVCÏÞÖÆ£¬Òò´Ë²»ÔÊÐí±äÁ¿¶¨Òåt.makeStrict(true);t.set("isGirl", false);t.getTextAsString() ;»áµ¼ÖÂÈçϱàÒë´íÎó

STRICK_MVCλÓÚ1ÐУ¬·ûºÅvar1|

¹ØÓÚÈçºÎ×Ô¶¨Òå´íÎó´¦Àí£¬Çë²Î¿¼¸ß¼¶Ó÷¨

Èç¹ûÊÇÔÚ±àÒëÖ´ÐУ¬ÔòÏÔʾµÄÐÅϢûÓдíÎó¹Ø¼ü×Ö£¬ÕâÊÇÒòΪÒѾ­±àÒë³Éclass£¬java±¨´í²»Ö§³Ö´íÎó¹Ø¼ü×Ö

Ö¸Áî¸ñʽΪ£º DIRECTIVEÖ¸ÁîÃûÖ¸Áî²ÎÊý£¨¿ÉÑ¡£©

BeetlÄ¿Ç°Ö»Ö§³Ö°²È«Êä³öÖ¸Á·Ö±ðÊÇ

DIRECTIVE SAFE_OUTPUT_OPEN

;

DIRECTIVE SAFE_OUTPUT_CLOSE

;

Ç°Õß´ò¿ª°²È«Êä³ö¹¦ÄÜ£¬´ËÖ¸ÁîºóµÄËùÓбí´ïʽ¶¼¾ßÓа²È«Êä³ö¹¦ÄÜ£¬

ºóÕßÊǹرհ²È«Êä³ö¹¦ÄÜ¡£ÏêÇé²Î¿¼

2.14.°²È«Êä³ö

°²È«Êä³öÊÇÈκÎÒ»¸öÄ£°åÒýÇæ±ØÐëÖØÊÓµÄÎÊÌ⣬·ñÔò£¬½«¼«´óÀ§ÈÅÄ£°å¿ª·¢Õß¡£BeetlÖУ¬Èç¹ûÒªÊä³öµÄÄ£°å±äÁ¿Îªnull£¬Ôòbeetl½«²»×öÊä³ö£¬Õâµã²»Í¬ÓÚJSP£¬JSPÊä³önull£¬Ò²²»Í¬ÓÚFeemarker£¬Èç¹ûûÓÐÓÃ!,Ëü»á±¨´í.

Ä£°åÖл¹ÓÐÁ©ÖÐÇé¿ö»áµ¼ÖÂÄ£°åÊä³öÒì³£

lÓÐʱºòÄ£°å±äÁ¿²¢²»´æÔÚ£¨Æ©Èç×ÓÄ£°åÀ

lÄ£°å±äÁ¿Îªnull£¬µ«Êä³öµÄÊǴ˱äÁ¿µÄÒ»¸öÊôÐÔ£¬Èç${user.wife.name}

Õë¶ÔÇ°Á©ÖÖÖÖÇé¿ö£¬¿ÉÒÔÔÚ±äÁ¿ÒýÓúó¼ÓÉÏ£¡ÒÔÌáÐÑbeetlÕâÊÇÒ»¸ö°²È«Êä³öµÄ±äÁ¿¡£

Èç${{user.wife.name! },¼´Ê¹user²»´æÔÚ£¬»òÕßuserΪnull£¬»òÕßuser.wifeΪnull£¬»òÕßuser.wife.nameΪnull beetl¶¼²»½«Êä³ö

¿ÉÒÔÔÚ!ºóÔö¼ÓÒ»¸ö³£Á¿£¨×Ö·û´®£¬Êý×ÖÀàÐÍ£©£¬»òÕßÁíÍâÒ»¸ö±äÁ¿£¬·½·¨£¬±¾µØµ÷Óã¬×÷ΪĬÈÏÊä³ö£¬Æ©Èç

${user.wife.name!¡±µ¥Éí¡±}£¬Èç¹ûuserΪnull£¬»òÕßuser.wifeΪnull£¬»òÕßuser.wife.nameΪnull£¬Êä³ö¡±µ¥Éí¡±

Æ©Èç${user. birthday!@System.constants.DefaultBir}£¬±íʾÈç¹ûuserΪnull£¬»òÕßuser. birthdayΪnull£¬Êä³öSystem.constants.DefaultBir

l»¹ÓÐÒ»ÖÖÇé¿öºÜÉÙ·¢Éú£¬µ«Ò²ÓпÉÄÜ£¬Êä³öÄ£°å±äÁ¿·¢ÉúµÄÈκÎÒì³££¬Èç±äÁ¿ÄÚ²¿Å׳öµÄÒ»¸öÒì³£

ÕâÐèҪʹÓøñʽ${!(±äÁ¿)},ÕâÑù£¬ÔÚ±äÁ¿ÒýÓ÷¢ÉúÈκÎÒì³£Çé¿öÏ£¬¶¼²»×÷Êä³ö£¬Æ©Èç

${!(user.name)},£¬beetl½«»áµ÷ÓÃuser.getName()·½·¨£¬Èç¹û·¢ÉúÒì³££¬beetl½«²»»áºöÂÔ´ËÒì³££¬¼ÌÐøäÖȾ

ÈçÏÂÊÇÔ¤±àÒëºóµÄ´úÂë

try{

out.write(user.getName());

}catch(Exception ex){

}

ÖµµÃ×¢ÒâµÄÊÇ£¬ÔÚ±äÁ¿ºó¼ÓÉÏ!²»½ö½ö¿ÉÒÔÓ¦ÓÃÓÚռλ·ûÊä³ö(µ«Ö÷ÒªÊÇÓ¦ÓÃÓÚռλ·ûÊä³ö)£¬Ò²¿ÉÒÔÓÃÓÚ±í´ïʽÖУ¬È磺

vark = user.name!'N/A'+user.age!;

%>

${k}

Èç¹ûuserΪnull£¬ÔòkÖµ½«ÎªN/A

ÔÚÓÐЩģ°åÀ¿ÉÄÜÕû¸öÄ£°å¶¼ÐèÒª°²È«Êä³ö£¬Ò²¿ÉÄÜÄ£°åµÄ²¿·ÖÐèÒª°²È«Êä³ö£¬Ê¹ÓÃÕß²»±ØΪÿһ¸ö±í´ïʽʹÓã¡£¬¿ÉÒÔʹÓÃbeetlµÄ°²È«Ö¸Ê¾·ûºÅÀ´Íê³É°²È«Êä³ö

È磺

DIRECTIVE SAFE_OUTPUT_OPEN;

%>

${user.wife.name}

Ä£°åÆäËûÄÚÈÝ£¬¾ùÄÜ°²È«Êä³ö¡­¡­

//¹Ø±Õ°²È«Êä³ö

DIRECTIVE SAFE_OUTPUT_CLOSE;

%>

Beetl²»½¨Òéÿһ¸öÒ³Ã涼ʹÓÃDIRECTIVE SAFE_OUTPUT_OPEN£¬ÕâÑù£¬Èç¹ûÈç¹ûÕæÓв»ÆÚÍûµÄ´íÎ󣬲»ÈÝÒ×¼°Ê±·¢ÏÖ£¬Æä´Î£¬°²È«Êä³öÒâΪ×Åbeetl»áÓжîÍâµÄ´úÂë¼ì²âÖµÊÇ·ñ´æÔÚ»òÕßÊÇ·ñΪnull£¬ÐÔÄÜ»áÂÔ²îµã

Beetl²ÉÓÃjavascriptÒ»ÑùµÄ×¢ÊÍ·ç¸ñ£¬¼´µ¥ÐÐʹÓÃ"//" ,¶àÐпÉÒÔʹÓÃ/**/ÈçÏ´úÂë

var a = 3 ;

//µ¥ÐÐ×¢ÊÍ

/*ÕâÊǶàÐÐ×¢ÊÍ */

var b = 2;

/*ÒÔÏÂÄÚÈÝÒ³±»×¢ÊÍÁË

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

%>

ÄÚÈÝ...........

*/

%>

BeetlÏÖÔÚÔÝʱ²»Ö§³Öռλ·ûµÄ×¢ÊÍ

¶ÔÆ룺ÎÒ·¢ÏÖ±ðµÄÄ£°åÓïÑÔÒªÊÇ×öµ½¶ÔÆ룬·Ç³£À§ÄÑ,BeetlÄãÍêÈ«²»Óõ£ÐÄ£¬±ÈÈçvelocty£¬stringtemlate£¬freemarkerÀý×Ó¶¼³öÏÖÁ˲»¶ÔÆëµÄÇé¿ö£¬Ó°ÏìÁËÃÀ¹Û£¬BeetlÍêÈ«ÎÞÐèµ£ÐÄÊä³ö¶ÔÆë

°üº¬ÆäËûÄ£°åÎļþ£ºÔÚBeetlÖУ¬Õâ²»ÊÇÒ»¸öÌØÊâµÄ¹¦ÄÜ£¬Í¨¹ýµ÷Óú¯ÊýincludeFileTemplate,»òÕßincludeStringTemplate¶¼¿ÉÒÔʵÏÖ£¬Ç°ÕßÊÇ°üº¬Ò»¸öÎļþÄ£°å£¬ºóÕßÊǽ«Ò»¸östringÄ£°å×÷ΪÊäÈë¡£ÏêϸʹÓÃÇë²Î¿¼¸ß¼¶Ó÷¨

Escape£º¿ÉÒÔʹÓÃ\×öescape·ûºÅ£¬Èç\$monkey\$½«×÷Ϊһ¸öÆÕͨµÄÎı¾£¬Êä³öΪ$monkey$.ÔÙÈçΪÁËÔÚÇ®ºó¼ÓÉÏÃÀÔª·ûºÅ£¨Õ¼Î»·ûÇ¡ºÃÓÖÊÇÃÀÔª·ûºÅ£©¿ÉÒÔÓÃÕâÁ©ÖÖ·½Ê½hello,it's

$money$\$,»òÕßHello,it's

$money+"\$"$¡£Èç¹ûÒªÊä³ö\·ûºÅ±¾Éú£¬ÔòÐèÒªÓÃÁ©¸ö\\,ÕâµãÓëjavascript£¬javaÓïÒåÒ»ÖÂ.

¿ÕÖµ²ßÂÔ£ºÈç¹ûÒ»¸ö±äÁ¿Îª¿Õ£¬ÔòÊä³öµÄʱºòĬÈÏΪ¿Õ×Ö·û´®£¬Ò²¿ÉÒÔÖƶ¨Êä³ö

${u.wife.name!"N/A"}

Èç¹ûuΪ¿Õ£¬»òÕßu.wifeΪ¿Õ£¬Êä³ö¶¼ÊÇ"N/A"

±êÇ©£ºÀàËÆjspµÄ±êÇ©Tag£¬ÔÊÐíÄ㽫ģ°åÎļþÖеÄÒ»¶ÎÎļþÄÚÈÝ×÷ΪÊäÈ룬¾­¹ýº¯Êý²Ù×÷£¬±ä³ÉÌض¨µÄÊä³ö£¬ÈçϱêÇ©

This is

static footer,will be replaced by fotter.html

ÔòÄ£°åÎļþÀïµÈÓںźóµÄ×Ö·û´®½«±»ÒÔ´ËÌæ»».

±í´ïʽ¼ÆË㣺org.bee.tl.core.SimpleRuleEval.À©Õ¹ÁËBeeTemplate£¬¿ÉÒÔÓÃÀ´¼ÆËã±í´ïʽ£¬ÈçÏ´úÂë

SimpleRuleEval eval = new

SimpleRuleEval("a+15");

eval.set("a", 3);

int o = eval.calcInt();

´ËʱoΪ18

±í´ïʽ¿ÉÒÔÊÇÈκμÆËã±í´ïʽ»òÕßÌõ¼þ±í´ïʽ£¬Èç(12+5)*3,»òÕßa>12&&a<=18

ÆäËû·½·¨»¹ÓÐ

calc()·µ»ØObject£¬£¨¶ÔÓÚËãÊý¼ÆË㣬ObjectΪBeeNumberÀàÐÍ£©calcInt()·µ»ØInt

calcBoolean()·µ»Øboolean

calcDouble()·µ»ØdoubleÆäËûÏêϸ²Î¿¼API

ÎÞÂÛÄãÊÇÔÚѧϰʹÓÃBeetl£¬»¹ÊÇÔÚÏîÄ¿ÖÐʹÓÃBeetl£¬ºÃµÄÏ°¹ßÊÇÕýÈ·³õʼ»¯GroupTemplate£¬²¢Í¨¹ýGroupTemplate»ñµÃTemplate£¬ÈçÏÂʾÀý´úÂ루Ҳ¿ÉÒԲο¼3.2À´´´½¨GroupTemplate£©

importorg.bee.tl.core.GroupTemplate;

publicclassGroupTemplateUtil {

staticGroupTemplategroup=newGroupTemplate(new File("/home/template"));

static{

group.setPlaceholderStart("

group.setPlaceholderEnd("%>");

group.setStatementStart("${");

group.setStatementEnd("}");

group.enableNativeCall();//1

group.enableChecker(10);//2

/*

ÆäËûÅäÖᣡ£¡£¡£¡£¡£¡£

*/

//×îºóÔÊÐí±àÒë³Éclass

group.enableOptimize();//3

addCommonFunction();//4

addCommonFormat();//5

}

publicstaticGroupTemplate getGroup (){

returngroup;

}

publicstaticvoidaddCommonFunction(){

}

publicstaticvoidaddCommonFormat(){

}

}

1ÔËÐÐÖ±½Óµ÷ÓÃjavaÀà

2ÿ10Ãë¼ì²éÒ»ÏÂÄ£°åÎļþÊÇ·ñ¸üÐÂ,Èç¹ûδµ÷Ó㬻òÕßÉèÖÃΪ0£¬Ôò²»¼ì²é¸üÐÂ

3ÔÊÐíÓÅ»¯³Éclass´úÂëÔËÐÐ

4Ôö¼ÓÏîÄ¿×Ô¶¨Òå·½·¨

5Ôö¼ÓÏîÄ¿×Ô¶¨ÒåµÄ¸ñʽ»¯º¯Êý

È»ºóÄã¿ÉÒÔÔÚ´úÂëÀïµ÷ÓÃ

Template t =

GroupTemplateUtil.getGroup

().getFileTemplate("/exp/string_add_template.html");

T.set("user",new User());

String str =

t.getTextAsString();

×¢Ò⣺groupTemplate.enableOptimizeÓ¦¸ÃÔÚÆäËûÅäÖÃÑ¡ÏîºóÔÙµ÷Óã¬ÒòΪ´ËÑ¡ÏîÒª¸ù¾ÝÇ°ÃæµÄÅäÖÃÀ´³õʼ»¯groupTemplate

GroupTemplateÓкܶàÑ¡Ï¸üΪ¿ÉÒÔͨ¹ýConfigÀàÀ´Íê³É´´½¨GroupuTemplate£¬ConfigĬÈÏ»áÏÈ×°ÔØ /org/bee/tl/core/beetl-default.properties,È»ºóÈç¹ûclasspathÏ´æÔÚbeetl.properties,ÔÙ×°ÔØ»òÕ߸²¸ÇÆäÊôÐÔ¡£beetl-default.propertiesÄÚÈÝÈçÏÂ

#######ĬÈÏÅäÖÃ

DELIMITER_PLACEHOLDER_START=${

DELIMITER_PLACEHOLDER_END=}

DELIMITER_STATEMENT_START=

DELIMITER_STATEMENT_END=%>

NATIVE_CALL =TRUE

COMPILE_CLASS=FALSE

DIRECT_BYTE_OUTPUT

=FALSE

TEMPLATE_ROOT=

TEMPLATE_CHARSET

=GBK

TEMPLATE_CACHE_CHECK_PERIOD

=2

TEMPLATE_CLASS_FOLDER=

ERROR_HANDLER =org.bee.tl.core.DefaultErrorHandler

MVC_STRICT =FALSE

#ÄÚ²¿Ê¹ÓÃ

DEBUG=FALSE

#######ĬÈÏÅäÖýáÊø

#######ÐÔÄÜ×î¼ÑÅäÖÿªÊ¼

#COMPILE_CLASS=true

#DIRECT_BYTE_OUTPUT

= true

########ÐÔÄÜ×î¼ÑÅäÖýáÊø

#######ÑϸñMVCÅäÖÿªÊ¼

#MVC_STRICT =

TRUE

#NATIVE_CALL =

FALSE

########ÑϸñMVCÅäÖýáÊø

#######±àÒë³ÉclassµÄÆäËûÑ¡Ïʼ£¬Î´ÍêÈ«²âÊÔ£¬ÔÝʱ²»Ö§³Ö

#COMPILE_CLASS_KEEP_SOURCE=FALSE

#OPTIMIZE_COMPILE_LATTER=FALSE

#OPTIMIZE_COMPILE_WORKER_NUM=2

#######±àÒë³ÉclassµÄÆäËûÑ¡Ïî½áÊø

ÈçÏÂÀý×ÓÊÇbeetlµ¥Ôª²âÊÔµÄÅäÖÃ

Config config =newConfig();

config.load("/beetl-test.properties");

home= System.getProperty("user.dir") + File.separator+"template"+ File.separator;

config.put(Config.TEMPLATE_ROOT,home);

GroupTemplatebase= config.createGroupTemplate();

ĬÈÏÇé¿öÏ£¬Beetl²ÉÓýâÊÍÖ´ÐУ¬ÐÔÄÜÂÔµÍÓÚÆäËûÄ£°åÓïÑÔ£¬ÇÒͬÆäËûÄ£°åÓïÑÔÒ»Ñù£¬ÏûºÄÁ˽ϴóµÄϵͳ×ÊÔ´¡£Beetl1.0°æ±¾ºó¿ÉÒÔÔÚÔËÐÐʱ±àÒë³Éclass£¬²¢ÇÒͨ¹ýÔËÐÐʱ¿ÌÍƲâ³öÆäÄ£°å±äÁ¿µÄjavaÀàÐÍ£¬Í¨¹ý¶Å¾ø·´Éä²Ù×÷´Ó¶ø»ñµÃ×îºÃµÄÐÔÄÜ

Ö»ÐèÒªµ÷ÓÃgroupTemplate.enableOptimize();

ĬÈÏÇé¿öÏ£¬ËùÒÔÔ¤±àÒëµÄÀ඼½«·ÅÔÚuser.homeµÄ.beeĿ¼Ï£¬ÈçÏÂʾÀý

Èç¹ûÏëÒª±£´æÔÚÖ¸¶¨µÄĿ¼£¬¿ÉÒÔÔÚµ÷ÓÃenableOptimizeÇ°µ÷ÓÃgroupTemplate.setTempFolder(String

path),´«Èë·¾¶

Ä¿Ç°²¢²»ÊÇËùÓеÄÄ£°å¶¼ÄÜÓÅ»¯³Éclass´úÂë¡£Çë²Î¿¼´úÂëÓÅ»¯Á˽âÈçºÎ±àдģ°å´úÂë¡£µ«ÎÞÂÛÈçºÎ£¬Èç¹ûÓÅ»¯Ê§°Ü£¬beetls½«»á½âÊÍÖ´ÐС£

×¢Ò⣺а汾ÖÐĬÈϲ»Éú³ÉjavaÔ´´úÂ룬Èç¹ûÏë±£³ÖÉú³ÉµÄjava´úÂ룬ÔòÐèÒªÈçϳõʼ»¯GroupTemplate

Map config=newHashMap();

config.put(GroupTemplate.OPTIMIZE_KEEP_SOURCE,true);

group.enableOptimize(config);

3.4.ÔÊÐíByteÖ±½ÓÊä³ö

Èç¹ûÄãÈ·¶¨Êä³öµÄ×Ö·û¼¯×ÜÊǹ̶¨µÄ£¬±ÈÈç×ÜÊÇGBK£¬ÄÇô£¬ÔÊÐíbyteÊä³ö½«¶ÔÐÔÄܽøÒ»²½ÌṩÖʵÄÓÅ»¯¡£¼ÓËÙäÖȾËÙ¶ÈÒÔ¼°½µµÍ¶ÔCPUµÄÏûºÄ¡£ÕâÊÇÒòΪ£¬byteÖ±½ÓÊä³ö£¬Ê¡È¥ÁËÄ£°åÖÐÎı¾µÄתÂë¹ý³Ì¡£ÔÊÐíbyte×Ö½ÚÊä³ö£¬ÐÔÄÜ»áÌṩһ±¶£¬ÐèÒª×öµÄ½ö½öÊÇÈçÏÂÁ©¸öÉèÖÃ:

groupTemplate.enableDirectOutputByte();

ÔÙÊä³öµÄʱºò£¬ÌṩOutputStream×÷ΪÊä³öÁ÷£¬Èçweb¿ª·¢Àï

protectedvoiddoGet(HttpServletRequest request, HttpServletResponse

response)throwsServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

Template

t = ServletGroupTemplate.intance().getTemplate("/news.html", request, response);

PortalService

portalService =newPortalService();

List

list = portalService.getNews(News.GNENERAL_NEWS);

t.set("newsList", list);

try{

t.getText(response.getOutputStream());

}catch(BeeException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

}

BeetlÔÊÐíÌṩ×Ô¶¨Ò庯ÊýÒÔÊʺÏÌض¨ÒµÎñÐèÇó£¬×Ô¶¨Ò庯ÊýÐèҪʵÏÖorg.bee.tl.core.Function¡£Èç϶¨ÒåÁËÒ»¸ödateº¯Êý½ö½ö·µ»ØÒ»¸öjava.util.DateʵÀý

publicclassDateFunctionimplementsFunction {

publicDate call(Object[] paras,Context ctx) {

returnnewDate();

}

publicstaticvoidmain(String[] args)throwsIOException{

GroupTemplate group =newGroupTemplate();

group.registerFunction("date",newDateFunction());

Template t = group.getStringTemplate("today is

$date()$");

System.out.println(t.getTextAsString());

}

}

×¢²áµÄ·½·¨Ãû¿ÉÒÔ´ø"."£¬ÈçÏÂ

group.registerFunction("date.now",

new DateFunction());ÔòÔÚÄ£°åÀ¿ÉÒÔʹÓÃtoday is

${date.now()}.

ÁíÍâÒ»ÖÖ×Ô¶¨Òåbeetl·½·¨µÄÊÇʹÓÃGroupTemplate.registerFunctionPackage(String

packageName,Object o);

Beetl½«ÕÒµ½oËùÊôµÄËùÓÐpublic·ÇStatic·½·¨£¬²¢ÒÀ´Î°´ÕÕpackageName+"."+·½·¨Ãû ×÷Ϊbeetl·½·¨Ãû£¬ÈçÏÂÀý×Ó

group.registerFunctionPackage("string",newObject(){

/**

*@paramstr

*@paramfrom d¶ÔÓÚÊý×ÖÐÍ£¬beetlÀﶼʹÓÃBeeNumber

*@paramto

*@return

*@throwsException

*/

publicString sub(String str,BeeNumber from,BeeNumber to)throwsException{

if(str==null){

thrownewException("error

paramter");

}

returnstr.substring(from.intValue(), to.intValue());

}

publicvoidprint(String

str,Context ctx){

ByteWriter w = (Writer)ctx.getVar("__pw");

try{

w.write(str);

}catch(IOException e) {

thrownewRuntimeException(e.getMessage());

}

}

});

ÈçÉÏ×¢²áÁËÁ©¸ö·½·¨£¬·Ö±ðÊÇstring.sub·½·¨ÒÔ¼°string.printº¯Êý¡£

BeetlÔÊÐíÌṩ×Ô¶¨Òå¸ñʽ»¯º¯Êý£¬ÓÃÓÚ¸ñʽ»¯Êä³ö¡£ ¸ñʽ»¯º¯ÊýÐèҪʵÏÖorg.bee.tl.core.Format

publicclassDateFormatextendsFormat{

publicObject

format(Object data,String pattern){

SimpleDateFormat sdf =null;

if(pattern==null){

sdf =newSimpleDateFormat();

}else{

sdf =newSimpleDateFormat(pattern);

}

returnsdf.format(data);

}

publicstaticvoidmain(String[]

args)throwsIOException {

GroupTemplate group =newGroupTemplate();

group.registerFunction("now",newDateFunction());

group.registerFormat("df",newDateFormat());

Template t = group.getStringTemplate("today is

$now(),df=¡¯yyyy-MM-dd¡¯$");

System.out.println(t.getTextAsString());

}

}

ÆäÖÐ,Ò²¿ÉÒÔÖ±½ÓÓÃtoday is ${now(),shortDate}Èç¹ûûÓÐ=ºÅ£¬format(Object data, String pattern)ÖеÄpatternΪ¿Õ

×¢²áµÄ¸ñʽ»¯º¯ÊýÃû¿ÉÒÔ´ø"."£¬ÈçÏ£º

group.registerFormat("date.short",

new DateFormat());ÔòÔÚÄ£°åÀ¿ÉÒÔʹÓÃtoday is ${now(),date.short}.

Ä£°å±äÁ¿¶¨ÒåºÍ¸³Öµ¸úÆäËû±äÁ¿Ã»ÓÐÇø±ð£¬Î¨Ò»²»Í¬µÄʱËûÔÊÐíµÄÄÚÈÝÊÇÒ»¶ÎÄ£°å£¬ËûµÄÖµÊÇÄ£°åËù¶ÔÓ¦µÄ×Ö·û´®£¨×Ö½ÚģʽÏÂÊÇ×Ö½ÚÊý×飩£¬¸ñʽÈçÏÂ

varvaribaleName = {¡­.}.£¬Ä£°å±äÁ¿¿ÉÒÔÒ»µ©¶¨ÒåºÃºó£¬¿ÉÒÔÓÃÔÚÆäÈκεط½£¬Æ©ÈçÖظ´Ê¹ÓÃÄ£°å±äÁ¿£¬½«Ä£°å±äÁ¿ÓÃÔÚ×ÓÄ£°åÀ

var a = {

var

k= 123;

%>

${k}.

};

%>

${a}

ÈçÉÏÀý£¬aÊÇÒ»¸öÄ£°å±äÁ¿£¬½á¹ûÊÇ¡±123.¡±

ʹÓÃÄ£°å±äÁ¿Ò»¸ö³£¼ûµÄµØ·½ÊǸü¼ÓÁé»îµÄ²¼¾Ö

var part1 = {

%>

ÕâÊÇÄÚÈÝÒ»

};

%>

var part2 = {

%>

ÕâÊÇÄÚÈݶþ

};

%>

inlcudeFileTemplate("/common/_layout.html",{"part1":part1,"part2":part2})

Èç¹ûÉèÖÃÁËÑϸñMVC£¬ÔòÒÔÏÂÓï·¨½«²»ÔÚÄ£°åÎļþÀïÔÊÐí£¬·ñÔò½«±¨³öSTRICK_MVC´íÎó

¶¨Òå±äÁ¿£¬Îª±äÁ¿¸³Öµ,Èçvar a = 12ÊÇ·Ç·¨µÄ

ËãÊõ±í´ïʽ Èç${user.age+12}ÊÇ·Ç·¨µÄ

³ýÁËÖ»ÔÊÐí²¼¶ûÒÔÍ⣬²»ÔÊÐíÂß¼­±í´ïʽºÍ·½·¨µ÷Óà Èçif(user.gender==1)ÊÇ·Ç·¨µÄ

·½·¨µ÷Óã¬Èç${subString(string,1)}ÊÇ·Ç·¨µÄ

Class·½·¨ºÍÊôÐÔµ÷Óã¬

ÑϸñµÄMVC£¬·Ç³£ÓÐÖúÓÚÂß¼­ÓëÊÓͼµÄ·ÖÀ룬Ìرðµ±Âß¼­ÓëÊÓͼÊÇÓÉÁ©¸öÍŶÓÀ´Íê³ÉµÄ¡£Èç¹ûÄãÊȺÃÑϸñMVC£¬¿ÉÒÔµ÷ÓÃgroupTemplate.enableStrict()

ÎÞÐèΪjava¶ÔÏó¶¨Òå¶îÍâµÄÊôÐÔÓÃÓÚ¸¨ÖúÏÔʾ£¬ÐéÄâÊôÐÔ¿ÉÒÔÇáÒ××öµ½£¬ÈçBeetlΪjava.util.Collection¶¨ÒåµÄÒ»¸öÐéÄâÊôÐÔsize£¬ÓÃÓÚ±íʾ¼¯ºÏ´óС

group.registerVirtualAttributeEval(newVirtualAttributeEval(){

publicObject

eval(Object o,String attributeName,Context ctx){

if(attributeName.equals("size")){

return((Collection)o).size();

}else{

thrownewIllegalArgumentException();

}

}

publicbooleanisSuppoert(Class

c,String attributeName){

if(Collection.class.isAssignableFrom(c)&&attributeName.equals("size")){

returntrue;

}else{

returnfalse;

}

}

});

ÕâÑù£¬ËùÒÔCollection×ÓÀ඼ÓÐÐéÄâÊôÐÔsize¡£$userList.~size$Êä³öuserList¼¯ºÏ³¤¶È

ʵÏÖÐéÄâÊôÐÔ£¬±ØÐëʵÏÖ½Ó¿ÚÁ©¸ö·½·¨£¬Ò»¸öÊÇisSupport,ÕâÈÃBeetlÓÃÓÚÕÒµ½VirtualAttributeEval£¬eval·½·¨ÓÃÓÚ¼ÆËãÐéÄâÊôÐÔ

Ëùν±êÇ©£¬¼´ÔÊÐí´¦ÀíÄ£°åÎļþÀïµÄÒ»¿éÄÚÈÝ£¬¹¦ÄܵÈÓÚͬjsp tag¡£ÈçÏÂ{}µÄÄÚÈÝÔÚbeetlÔËÐеÄʱºò½«»á±»É¾³ý

This

content will be deleted

×Ô¶¨Òå±êÇ©org.bee.tl.core.Tag£¬ÐèҪʵÏÖrequriedInput£¬ÓÃÓÚ¸æËßBeetl£¬ÊÇ·ñÐèÒªÏÈäÖȾÎı¾Ìå¡£

setInputÊÇ°ÑäÖȾµÄ½á¹û´«»Ø¸ø±êÇ©º¯Êý

getOutput×îºóÓÃÓÚ·µ»ØÎı¾´¦Àíº¯ÊýµÄ½á¹û

ÈçÏÂÊÇBeetlÌṩµÄÄÚÖõÄdelÎı¾´¦Àíº¯ÊýʵÏÖ

publicclassDeleteFunctionextendsTag{

publicString

getOutput(){

return"";

}

@Override

publicbooleanrequriedInput(){

returnfalse;

}

}

¿ÉÒÔͨ¹ý¸¸ÀàÊôÐÔargs,»ñÈ¡ÊäÈë²ÎÊý£¬Ïêϸ¿ÉÒԲο¼API

ÓÉÓÚ±êÇ©½«»á´¦Àí±êÇ©ÄÚµÄäÖȾ½á¹û£¬Èç¹ûÔÚʹÓÃbyteÊä³öµÄ»°£¬×îºÃ¼Ì³ÐByteSupportTag£¬Í¬Ê±ÊµÏÖgetOutput(),getOutputAsByte()Á©¸ö½Ó¿Ú£¬¾ßÌåÓ÷¨¿ÉÒԲ鿴ԴÂë¡£Èç¹ûÊÇÔÊÐíÖ±½ÓÊä³ö£¬Beetl½«»áµ÷ÓÃgetOutputAsByte ()¶ø²»ÊÇgetOutput(),È»¶ø£¬Èç¹ûÄã¼Ì³ÐTag£¬Ò²¿ÉÒԵģ¬Ö»ÊÇbyteÊä³öµÄÐÔÄܽ«ÔÚ´Ë´¦»á´òÒ»µãÕÛ¿Û.ÒòΪbeetlÅжÏֻʵÏÖÁËTag½Ó¿Ú£¬¾Í»áµ÷ÓÃgetOutput()·½·¨£¬½«µÃµ½Êä³öÔÙתһ´ÎByte×÷ΪäÖȾ½á¹û¡£

Beetl²»Ö±½ÓÖ§³Öºê¶¨Ò壬µ«¿ÉÒÔ¼ä½Óͨ¹ýÄÚÖõÄincludeFileTemplate±êÇ©À´×öµ½£¬ÕâÕýÈçJSP×öµÄÄÇÑù£¬ÈçÏÂÊÇÒ»¸öprint.htmlÎļþ£¬½«¶¨Òå¸öºê

Debug info is

ÔòÔÚÈκÎÎļþÖУ¬¶¼¿ÉÒÔʹÓÃincludeFileTemplateʹÓô˺ê

´ó¶àÊýÄ£°åÓïÑÔ¶¼»áÊä³ö¶îÍâµÄ¿Õ¸ñ»òÕ߻سµ£¬JSPÒ²Èç´Ë£¬freemaker»¹×¨ÃÅÓÐһɾ³ý¶àÓà¿Õ¸ñµÄº¯Êý£¬ÔÚbeetlÖУ¬ÊDz»ÐèÒª´Ë¹¦ÄܵÄ

ÉÏͼÀ´Ô´ÓÚÄÏÀÚ·­ÒëµÄÖÐÎÄ°æFreemarker£¬ËµÊÇÒÔÉÏ´úÂë»áÓйý¶àµÄ»»ÐУ¨br£©£¬±ØÐëʹÓÃɾ³ý¶àÓà¿ÕÐк¯Êý²ÅÄÜʹģ°åÊä³ö´ïµ½ÎÒ

ÃÇÏëµÃÑù×Ó¡£BeetlûÓд˶îÍ⺯Êý×öÕâÊÂÇ飬ÒòΪBeetl×Ô¶¯¾ÍÄÜ·Ö±æ³öÕâЩ¶îÍâ¿ÕÐС£ÎªÊ²Ã´beetlÎÞÐèµ£ÐĶîÍâ¿ÕÐÐÄØ£¬ÆäʵºÜ¼òµ¥£¬beetlÅöµ½Ö»ÓÐbeetlÓï¾äµÄÐУ¬ÎÞÂÛÊÇÇ°Óпոñ»¹ÊǺóÓлسµ£¬¶¼»áºöÂԵģ¬¿´¹ýbeetlÔÚÓÅ»¯Ä£Ê½ÏÂÉú³ÉµÄclass´úÂë¾ÍºÜÈÝÒ×ÄÜ¿´³öÀ´¡£

µ«ÔÚÒ»ÖÖÇé¿öÏ£¬Ä£°åβ²¿£¬BeetlÊÇÎÞ·ÇÅжÏÊÇ·ñ¿ÕÐеģ¬ÈçÏ£º

${name}

beetlÓï¾ä%>

ÔÚµÚÒ»ÐÐռλ·ûnameºóÃæÓиö»Ø³µ£¬beetlÎÞ·¨ÅжÏÕâ¸ö»Ø³µÊÇ·ñÊÇÓû§ÐèÒªµÄ»Ø³µ»¹Êǽö½öΪÁËÆäºóµÄ¿ØÖÆÓï¾ä¡£Ä¿Ç°Çé¿öÏ£¬beetlÈÏΪÓû§ÐèÒªÊä³ö¿Õ¸ñÐУ¬Òò´Ë£¬Ä£°åµÄÊä³ö»áÔÚβ²¿¶à³öÒ»¸ö¿Õ¸ñ¡£

groupTemplate..setErrorHandler(h)ÓÃÓÚÉèÖÃÄã×Ô¶¨ÒåµÄ´íÎó´¦Àí£¬Æ©È磬ĬÈÏÇé¿öÏ£¬´íÎó´¦Àí»áÏÔʾ´íÎóËùÔÚÐУ¬´íÎóÔ­Òò£¬ÒÔ¼°Ä£°åÉÏÏÂ3ÐеÄÄÚÈÝ£¬Èç¹ûÄ㲻ϣÍû¿Í»§¿´µ½ÄãµÄÄ£°åÄÚÈÝ£¬Äã¿ÉÒÔ×Ô¶¨Òå´íÎó´¦Àí£¬Çë²Î¿¼org.bee.tl.core.DefaultErrorHandler

Èç¹ûgroupTemplate.setErrorHandler£¬´«Èënull£¬Ôò±íʾ²»Ï£ÍûgroupTemplate´¦Àí´íÎó£¬ÆäºóÄ£°åµÄÈκδíÎ󶼽«Å׳ö,ÈçÏÂÀý×Ó£º

try{

Template

template = ¡­¡­ ;

template.set(¡­..);

t.getText£¨writer£©

}catch(BeeException

bee){

DefaultErrorHandlerh = new DefaultErrorHandler ();

h.processExcption(bee);

//or´òÓ¡µ½Ç°Ì¨£¬h.processExcption(bee,writer);

throw new

YourExcepion(bee.getMessage(),bee);

}

×Ö·û´®Ä£°åͨ³£ÓÃÓÚCMSϵͳ£¬½«Ä£°åÒ³ÃæÉú³É¾²Ì¬Ò³Ã棬´Ëʱ×Ö·û´®Ä£°åÀ´Ô´ÓÚCMSµÄÊý¾Ý¿â¡£Í¨³£Çé¿öÏ£¬Éú³É¾²Ì¬Ò³Ãæ¿ÉÒÔ²»»º´æÄ£°å£¬µ«Èç¹û¶ÔÐÔÄÜÒ²ÓÐÒªÇ󣬿ÉÒÔ»º´æ×Ö·û´®Ä£°å£¬¿ÉÒÔµ÷ÓÃ

Template t = groupTemplate.getStringTemplate(input, key);

InputÊÇ×Ö·û´®Ä£°å£¬keyÊÇ´ËÄ£°å»º´æµÄΨһ±êʾ£¬±ØÐëÊǺϷ¨µÄjavaÀàÃû£¨ÕâÑùÔÚÔÊÐí±àÒë³ÉclassµÄʱºò£¬´Ëkey¾ÍÊÇclassÀàÃû£©¡£Èç¹ûÐèҪɾ³ý»º´æ£¬Ôòµ÷ÓÃÈçÏÂÓï¾ä¼´¿É

groupTemplate.removeTemplateCache(key);

³ýÁËgetStringTemplate·½·¨Í⣬»¹¿ÉÒÔµ÷Óà getReaderTemplate£¬ÊäÈëÊÇjava.io.Reader

Ä£°åÓïÑÔ±ØÐëÖ§³Ö²¼¾Ö£¬·ñÔò¾Í²»ÊÇÒ»¸öºÃµÄÄ£°åÓïÑÔ£¬BeetlÖ§³ÖÓñêÇ©º¯Êýlayout×ö¼òµ¥²¼¾Ö£¬Ò²Ö§³ÖÁªºÏʹÓÃÄ£°å±äÁ¿ºÍinclude±êÇ©º¯ÊýÀ´×ö¸´ÔÓ²¼¾Ö¡£

Layout²¼¾ÖÇë²Î¿¼8.3µÄ±êÇ©º¯Êý

¸´ÔÓ²¼¾Ö²Î¿¼3.7µÄÄ£°å±äÁ¿

ÔÚºǫ́ûÓÐ×¼±¸ºÃÄ£Ð͵ÄÇé¿öÏ£¬ÈçºÎÑé֤ģ°åÊÇ·ñÕýÈ·ÄØ£¬¿ÉÒÔ²ÉÓÃjson±äÁ¿À´´úÌæpojoµÄjava¶ÔÏóÀ´Íê³É²âÊÔ£¬beetlÀ©Õ¹°üÌṩÁËorg.bee.tl.ext.SimpleTemplateTestUtilÀ´°ïÖú²âÊÔ

ÈçÏ´úÂ룺

String input = "this is

template,${user.name},${sessions['userId']}";

String json = "var user =

{'name':'joel'},sessions={'userId':'12345'};";

Writer w = new StringWriter();

SimpleTemplateTestUtil util = new

SimpleTemplateTestUtil(input, json, w);

util.run();

System.out.println(util.isOk());

System.out.println(w);

Êä³öÊÇ

true

this is template,joel,12345

¿ÉÒÔ¿´µ½¾¡¹Üºǫ́ģÐÍ£¨user¶ÔÏ󣬺Ísessions»á»°»¹Ã»ÓÐ×¼±¸ºÃ£©£¬Ä£°åÈÔÈ»Äܹ»ÔËÐвâÊÔ£¬Èç¹ûÄ£°åÓдíÎ󣬴íÎóÒ²½«Êä³öWriterÀï

ΪÁËÄÜÔÚSpring

MVCÖÐʹÓÃBeetl£¬±ØÐëÅäÖÃViewResolver£¬ÈçÏÂ

init-method="init">

RootÊôÐÔ¸æËßBeetlÄ£°åÎļþδWebRootµÄÄĸöĿ¼Ï£¬Í¨³£ÊÇ/ ,ĬÈÏÊÇ/

optimizeÊôÐÔÔÊÐíÓÅ»¯£¬Ô¤±àÒë³Éclass¡£Ä¬ÈÏÊÇtrue

nativeCallÔËÐб¾µØµ÷ÓÃ,ĬÈÏÊÇtrue

checkÊÇÿ¸ô¶àÉÙÃë¼ì²âÒ»ÏÂÎļþÊÇ·ñ¸Ä±ä£¬ÉèÖý϶Ìʱ¼äÓÐÀûÓÚ¿ª·¢£¬ÔÚÏßÉÏ»·¾³£¬ÉèÖÃΪ0£¬Ôò²»¼ì²éÄ£°å¸üУ¬Ä¬ÈÏÊÇ2Ãë

ÆäËûÊôÐÔ»¹ÓÐ

tempFolder£ºÔ¤±àÒëÉú³ÉµÄÔ´ÎļþÒÔ¼°classµÄλÖã¬Ä¬ÈÏÊÇWebRoot/WEB-INF/.tempĿ¼ÏÂ

ռλ·ûÖ¸¶¨£ºstatementStart£¬statementEnd£¬placeholderStart£¬placeholderEndĬÈÏ·Ö±ðÊÇ

%> ${ }

charset£ºÄ£°å×Ö·û¼¯£¬Ä¬ÈÏÊÇGBK

¿ª·¢ÕßÒ²¿ÉÒԼ̳ÐBeetlGroupUtilConfiguration£¬ÊµÏÖinitOther·½·¨£¬ÎªGroupTemplateÔö¼Ó¸ü¶àµÄÌØÐÔ£¬ÈçÏ´úÂë

public class MyBeetlGroupConfigration extends BeetlGroupUtilConfiguration

{

Protected voidinitOther(){

group.registerFunction(......)

}

}

ÔÚSpring MVCÖУ¬ÈκÎÔÚModelMapÖеıäÁ¿¶¼¿ÉÒÔÖ±½ÓÔÚBeetlÖÐÒýÓã¬ÔÚSessionÖеıäÁ¿£¬ÐèҪʹÓÃsession["±äÁ¿Ãû"]

ÈçÏÂHelloWorldController´úÂë

@Controller

@SessionAttributes("currUser")

publicclassHelloWorldController

{

@RequestMapping("/hello")

publicModelAndView

helloWorld(ModelMap model ) {

String

message ="Hello World, Spring 3.0!";

model.addAttribute("name","joel");

model.addAttribute("currUser","libear");

returnnewModelAndView("/hello.html","message", message);

}

}

ÔòÔÚÄ£°åÖУ¬·ÃÎÊname,message£¬currUser·Ö±ð²ÉÓÃÈçÏ·½Ê½

${name},${message},${session["currUser"]}

³ýÁËÓû§ÉèÖõĵñäÁ¿Í⣬ÆäËûÄÜ·ÃÎʵıäÁ¿»¹ÓÐ

ctxPath: webÓ¦ÓõÄÉÏÏÂÎÄ»·¾³Â·¾¶

servlet:°üº¬ÁËrequest,response,session

Ö»ÐèÒªÔÚStrutsÅäÖÃÎļþÀïÔö¼ÓÈçÏÂÅäÖ㬾ͿÉÒÔʹÓÃBeetl£¬´ËʱBeetlµÄÊôÐÔÈÔÈ»ÊǶÁÈ¡classpathµÄbeetl.properties.Èç¹ûûÓУ¬¾ÍʹÓÃĬÈÏ

·

·

·

ÔÚÊÓͼ²ã£¬¿ÉÒÔÖ±½Ó·ÃÎÊAction¶¨ÒåºÃµÄÊôÐÔ£¬Ò²¿ÉÒÔ·ÃÎÊÈçϱäÁ¿¡£

session£¬¿ÉÒÔ»ñÈ¡session»á»°request,ÊÇHTTPRequest

ctxPath,ÊÇrequest.getContextPath()

Èç¹ûÄãÐèÒª³õʼ»¯GroupTemplate£¬ÈçÔö¼ÓһЩ×Ô¶¨Òå·½·¨µÈ£¬¿ÉÒÔ´´½¨Ò»¸öÐÄÀۼ̳ÐStruts2BeetlActionResult£¬²¢¸²¸Çpublic void initGroupTemplate(GroupTemplate group)

Èç¹ûÄ㻹ÐèÒªÔÚÄ£°åäÖȾǰ×öһЩ´¦Àí£¬¿ÉÒÔ¸²¸Çpublic void addCommonProperty(Template t, HttpServletRequest

req,HttpServletResponse rsp)

JfinalÊǹúÄÚºÜÓÐDZÁ¦µÄWeb¿ª·¢¿ò¼Ü£¬Beetl¿ÉÒÔºÜÈÝÒ××÷ΪÆä¿ò¼ÜµÄÊÓͼ²ã¼¼Êõ¡£´úÂëÈçÏÂ

import

org.bee.tl.ext.jfinal.BeetlRenderFactory

publicclassDemoConfigextendsJFinalConfig

{

publicvoidconfigConstant(Constants

me)

{

me.setDevMode(true);

me.setMainRenderFactory(newBeetlRenderFactory());

}}

ĬÈÏÇé¿öÏÂBeetlrednerFacotry»á×°ÔØclasspath·¾¶/beetl.propertiesµÄÅäÖã¬ÅäÖÃÀïδָ¶¨ÊôÐÔTEMPLATE_ROOTµÄÖµ£¬ÕâBeetlrednerFacotryĬÈϵÄÄ£°å¸ùĿ¼ÔÚWebRoot/WEB-INF/templateĿ¼Ï¡£Èç¹ûÖ¸¶¨ÁË£¬Æ©ÈçTEMPLATE_ROOT=/beetl/templateÔòÄ£°å¸úĿ¼ÔÚWebRoot/WEB-INF/beetl/template.

ÔÚ¿ØÖƲ㣬ͨ¹ýsetAttr·½·¨ÉèÖõıäÁ¿£¬¿ÉÒÔÔÙÔÚÄ£°åÎļþÖÐÖ±½ÓÒýÓã¬Ä£°åÖл¹ÄÚÖÃÁËÈçϱäÁ¿session£¬¿ÉÒÔ»ñÈ¡session»á»°request,ÊÇHTTPRequest

ctxPath,ÊÇrequest.getContextPath()

ÈçÏÂÄ£°åÀý×Ó

Hello£¬${session[¡°user¡±]}

for(order in orderList){}

%>

¿ÉÒÔͨ¹ýµ÷Óþ²Ì¬·½·¨BeetlRenderFactory. groupTemplateÀ´»ñÈ¡groupTemplate£¬È磺

BeetlRenderFactory.groupTemplate.registerFunction¡­¡­

7.ÔÚServletÖÐʹÓÃBeetl

ÎÞÂÛÔÚºÎÖÖ¿ò¼ÜÏÂʹÓÃBeetl,¶¼±ØÐë±£Ö¤GroupTemplateÊǵ¥Àý£¬ÇÒ±»ÕýÈ·³õʼ»¯£¬ËùÒÔBeetlÀ©Õ¹°üÌṩÁËÒ»ÖÖÔÚServletÖÐʹÓÃBeetlµÄÀý×Ó£¬Ê¹ÓÃÓû§¼àÌýÆ÷³õʼ»¯GroupTemplate£¬ÈçÏ´úÂë

publicclassMyTestListenerimplementsServletContextListener {

publicvoidcontextInitialized(ServletContextEvent arg0) {

ServletGroupTemplate.intance().init(arg0.getServletContext());

}

publicvoidcontextDestroyed(ServletContextEvent arg0) {

}

}

ServletGroupTemplateλÓÚÀ©Õ¹°üorg.bee.tl.extÏ£¬´ËÀཫ´Óweb.xml¶ÁÈ¡ÈçϱäÁ¿³õʼ»¯GroupTemplate:

GroupTemplate.RootÊôÐÔ¸æËßBeetlÄ£°åÎļþδWebRootµÄÄĸöĿ¼Ï£¬Í¨³£ÊÇ/ ,ĬÈÏÊÇ/

GroupTemplate.OptimizeÊôÐÔÔÊÐíÓÅ»¯£¬Ô¤±àÒë³Éclass¡£Ä¬ÈÏÊÇtrue

GroupTemplate.NativeCallÔËÐб¾µØµ÷ÓÃ,ĬÈÏÊÇtrue

GroupTemplate.CheckÊÇÿ¸ô¶àÉÙÃë¼ì²âÒ»ÏÂÎļþÊÇ·ñ¸Ä±ä£¬ÉèÖý϶Ìʱ¼äÓÐÀûÓÚ¿ª·¢£¬ÔÚÏßÉÏ»·¾³£¬ÉèÖÃΪ0£¬Ôò²»¼ì²éÄ£°å¸üУ¬Ä¬ÈÏÊÇ2Ãë

GroupTemplate.DirectByteOutputÉèÖÃΪtrue£¬ÔÊÐíbyteÊä³ö´Ó¶øÌáÉýÐÔÄÜ£¬Ä¬ÈÏÊÇfalse

ÆäËûÊôÐÔ»¹ÓÐ

GroupTemplate.TempFolder£ºÔ¤±àÒëÉú³ÉµÄÔ´ÎļþÒÔ¼°classµÄλÖã¬Ä¬ÈÏÊÇWebRoot/WEB-INF/.tempĿ¼Ï¡£µ«ÊÇÓÉÓÚ²¿Êð·½Ê½ÒÔ¼°web·þÎñÆ÷²»Ò»Ñù£¬ÈçʹÓÃwar·½Ê½²¿Êð£¬Beetl²»ÄÜ´ÓServletContextµÃµ½ÕýÈ·µÄ¾ø¶Ô·¾¶¡£Äã×îºÃ¿´¿´ÊÇ·ñÊÇÔÚĬÈÏĿ¼Ï£¬·ñÔò£¬ÇëÖ¸¶¨Ò»¸ö¾ø¶Ô·¾¶¡£

ռλ·ûÖ¸¶¨£ºGroupTemplate.StatementStart£¬GroupTemplate..StatementEnd£¬GroupTemplate.PlaceholderStart£¬GroupTemplate.PlaceholderEndĬÈÏ·Ö±ðÊÇ

%> ${ }

GroupTemplate.Charset£ºÄ£°å×Ö·û¼¯£¬Ä¬ÈÏÊÇGBK

Òò´ËWeb.xmlÎļþ¿´ÆðÀ´ÏñÕâÑù

com.MyTestListener

GroupTemplate.Root

/

GroupTemplate.Optimize

true

GroupTemplate.NativeCall

true

GroupTemplate.Check

2

Ö»ÐèÒªÔÚServletÖе÷ÓÃServletGroupTemplate.instance().getTemplate(child,request,response)¾Í¿ÉÒÔ»ñÈ¡Template

ÈçÏ´úÂë

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//

TODO Auto-generated method stub

request.getSession().setAttribute("user",

"joelli");

Template

t = ServletGroupTemplate.intance().getTemplate("/hello.html",

request, response);

t.set("message",

"hello");

try

{

response.setCharacterEncoding("UTF-8");

t.getText(response.getWriter());

}

catch (BeeException e) {

//¼ÈȻûÓÐÉèÖôíÎó´¦ÀíÆ÷£¬GroupTemplate½«Ê¹ÓÃĬÈÏ´¦Àí£¬´ËÒì³£²»»á±»Å׳ö

}

}

getTemplate½«»á»ñÈ¡child¶ÔÓ¦µÄÄ£°å£¬²¢»¹×öÈçϸ³Öµ²Ù×÷

½«Session¸³Öµ¸øsession,½«ContextPath¸³Öµ¸øctxPath,ÒÔ¼°ËùÓÐrequestÖеÄÊôÐÔ¶¼¸³Öµ¸øTemplate£¬Òò´Ë¿ÉÒÔÔÚÄ£°åʹÓÃ${session["user"]} ,${ctxPath},${meesage}À´·ÃÎÊServeltÖи³ÖµµÄ±äÁ¿

×¢Ò⣬Èç¹ûÒª»ñÈ¡groupTemplate£¬¿ÉÒÔµ÷ÓÃServletGroupTemplate. instance ().getGroup()»ñÈ¡

À©Õ¹°üÏÖÔÚÌṩµÄ¹¦ÄÜÓÐÏÞ£¬Ö÷ÒªÊÇÌṩ³£ÓÃÀ©Õ¹£¬ÒÔ¼°×÷ΪÀý×Ӳο¼¡£Èç¹ûÄãÓкܺõÄÀ©Õ¹£¬¿ÉÒÔ²ÎÓëµ½À©Õ¹°üµÄ¿ª·¢À´

º¯ÊýÃû³Æ

ʹÓÃ˵Ã÷

date

·µ»ØÒ»¸öjava.sql.DateÀàÐ͵ıäÁ¿£¬Èç${date()}·µ»ØÒ»¸öµ±Ç°Ê±¼ä

${date('2011-1-1','yyyy-MM-dd')}·µ»ØÖ¸¶¨ÈÕÆÚ

print

´òÓ¡Ò»¸ö¶ÔÏó

println

´òÓ¡Ò»¸ö¶ÔÏóÒÔ¼°»Ø³µ»»ÐзûºÅ£¬»Ø³µ»»ºÅ·ûºÅʹÓõÄÊÇÄ£°å±¾ÉíµÄ£¬¶ø²»ÊDZ¾µØϵͳµÄ

printf

¸ñʽ»¯Êä³ö£¬Èç

%s. Next year, you'll be %d", name, age)%>

nvl

º¯Êýnvl£¬Èç¹û¶ÔÏóΪnull£¬Ôò·µ»ØµÚ¶þ¸ö²ÎÊý£¬·ñÔò£¬·µ»Ø×Ô¼º

${nvl(user,"²»´æÔÚ"}

debug

ÔÚ¿ØÖÆ̨Êä³ödebugÖ¸¶¨µÄ¶ÔÏóÒÔ¼°ËùÔÚÄ£°åÎļþÖеÄÐÐÊý£¬²ÉÓÃ

System.out.println("

"+line+">"+debugObject.toString);

exist

ÅжÏÈ«¾Ö±äÁ¿ÊÇ·ñ´æÔÚ£¨²»ÄÜÅжÏÁÙʱ±äÁ¿£©

assert

Èç¹û±í´ïʽΪfalse£¬ÔòÅ׳öÒì³££¬Òì³£ÐÅÏ¢¿ÉÒÔµÚ¶þ¸ö²ÎÊýÖ¸¶¨

assert( exist(¡°userList¡±) ),»òÕß

assert( exist(¡°userList¡±),¡±È±ÉÙÓû§ÐÅÏ¢¡±);

Beetl½«²»ÔÙäÖȾģ°å£¬Í˳ö

trunc

½ØÈ¡Êý×Ö£¬±£ÁôÖ¸¶¨µÄСÊý룬Èç

${trunk(12.456,2)}Êä³öÊÇ12.45

${trunk(12.456,0)}Êä³öÊÇ12

${trunk(12.456)}Êä³öÊÇ12

decode

Ò»¸ö¼ò»¯µÄif else½á¹¹£¬Èç

${decode(a,1,"a=1",2,"a=2","²»ÖªµÀÁË")}

Èç¹ûaÊÇ1£¬ÕâdecodeÊä³ö"a=1",Èç¹ûaÊÇ2£¬ÔòÊä³ö"a==2",

Èç¹ûÊÇÆäËûÖµ£¬ÔòÊä³ö"²»ÖªµÀÁË"

º¯ÊýÃû³Æ

ʹÓÃ˵Ã÷

strutil.startWith

${ strutil.startWith(¡°hello¡±,¡±he¡±)Êä³öÊÇtrue

strutil.endWith

${ strutil.endWith(¡°hello¡±,¡±o¡±)Êä³öÊÇtrue

strutil.length

${ strutil. length (¡°hello¡±),Êä³öÊÇ5

strutil.subString

${ strutil.subString (¡°hello¡±,1),Êä³öÊÇ¡°ello¡±

strutil.subStringTo

${ strutil.subStringTo (¡°hello¡±,1,2),Êä³öÊÇ¡°el¡±

strutil.split

${ strutil.split (¡°hello,joeli¡±,¡±,¡±),Êä³öÊÇÊý×飬ÓÐÁ©¸öÔªËØ£¬µÚÒ»¸öÊÇhello£¬µÚ¶þ¸öÊÇjoelli¡±

strutil.contain

${ strutil.split (¡°hello,¡±el¡±),Êä³öÊÇtrue

strutil.toUpperCase

${ strutil.toUpperCase (¡°hello¡±),Êä³öÊÇHELLO

strutil.toLowerCase

${ strutil.toLowerCase (¡°Hello¡±),Êä³öÊÇhello

strutil.replace

${ strutil.replace (¡°Hello¡±,¡±lo¡±,¡±loooo¡±),Êä³öÊÇhelloooo

strutil.format

${ strutil.format (¡°hello,{0}, my age is

{1}¡±,¡±joeli¡±,15),Êä³öÊÇhello,joelli, my age is 15.

º¯ÊýÃû³Æ

ʹÓÃ˵Ã÷

dateFormat

ÈÕÆÚ¸ñʽ»¯º¯Êý£¬Èç

${date,dateFormat='yyyy-Mm-dd'}

µÈÓÚ·ûºÅºóµÄ²ÎÊýÒ²¿ÉÒÔûÓУ¬ÔòʹÓñ¾µØĬÈÏÀ´×ö¸ñʽ»¯

Èç

${date,dateFormat}

º¯ÊýÃû³Æ

ʹÓÃ˵Ã÷

deleteTag

´Ë±êÇ©ÌåµÄÄÚÈݽ«²»×÷Êä³ö

includeFileTemplate

includeÒ»¸öÄ£°å£¬Èç

Èç¹ûÏëÍù×ÓÄ£°åÖд«Èë²ÎÊý£¬Ôò¿ÉÒÔºóÃæ¸úÒ»¸öjson±äÁ¿£¬Èç

includeÒ»¸öÄ£°å£¬Èç

inlucde

ͬÉÏ

layout

Ìṩһ¸ö²¼¾Ö¹¦ÄÜ£¬Ã¿¸öÒ³Ãæ×ÜÊÇÓÉÒ»¶¨²¼¾Ö£¬ÈçÒ³ÃæÍ·£¬²Ëµ¥£¬Ò³Ãæ½Å£¬ÒÔ¼°ÕýÎÄ

layout±êÇ©ÔÊÐíΪÕýÎÄÖ¸¶¨Ò»¸ö²¼¾Ö£¬ÈçÏÂʹÓ÷½Ê½

content.htmlÄÚÈÝÈçÏ£º

this isÕýÎÄ

..........

layout.htmlÊDz¼¾ÖÎļþ£¬ÄÚÈÝÈçÏ·

this is header

this is content:${layoutContent}

this is footer:

ÔËÐÐcontent.htmlÄ£°åÎļþºó£¬£¬ÕýÎÄÎļþµÄÄÚÈݽ«±»Ìæ»»µ½layoutContentµÄµØ·½£¬±ä³ÉÈçÏÂÄÚÈÝ

this is header

this is content:this isÕýÎÄ

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

this is footer:

Èç¹ûÏëÍùlayoutÒ³Ãæ´«Èë²ÎÊý£¬Ôò´«ÈëÒ»¸öjson±äÁ¿£¬ÈçÏÂÍùlayout.htmlÒ³Ãæ´«ÈëÒ»¸öÓû§µÇ¼ʱ¼ä

this isÕýÎÄ

..........

cache

ÄÜCache±êÇ©µÄÄÚÈÝ£¬²¢Ö¸¶¨¶à³¤Ê±¼äˢУ¬Èç

ÄÚÈÝÌå

ÐèÒªÖ¸¶¨Èý¸ö²ÎÊý£¬µÚÒ»¸öÊÇcacheµÄKeyÖµ£¬µÚ¶þ¸öÊÇ»º´æ´æÔÚµÄʱ¼ä£¬ÃëΪµ¥Î»£¬µÚÈý¸ö±íʾÊÇ·ñÇ¿ÖÆˢз£¬false±íʾ²»£¬true±íʾǿÖÆË¢ÐÂ

CacheĬÈÏʵÏÖorg.bee.tl.ext.cache.SimpleCacheManager.Äã¿ÉÒÔÉèÖÃÄã×Ô¼ºµÄCacheʵÏÖ£¬Í¨¹ýµ÷ÓÃCacheTag. cacheManager= new

YourCacheImplementation();

¿ÉÒÔÔÚ³ÌÐòÀïµ÷ÓÃÈçÏ·½·¨ÊÖ¹¤É¾³ýCache£º

public void clearAll();

public void clearAll(String key);

public void clearAll(String... keys);

8.4.¹¦ÄܶԱÈ

²Î¿¼ÁËFreemarker¹Ù·½Îĵµ£¨2.3.19£© µÚÒ»ÁÐÊǹٷ½ÎĵµÄ¿Â¼£¬µÚ¶þÁÐÊDZíʾbeetlÖÐÊÇ·ñ¾ßÓÐͬÑùµÄ¹¦ÄÜ

ͨ¹ýÏÂÁбí¸ñ£¬¿ÉÒÔ¿´³ö¾ø´ó²¿·Ö¹¦ÄÜ£¬beetl¶¼ÊÇÖ§³ÖµÄ¡£

¹¦ÄÜ

ÊÇ·ñÖ§³Ö

±¸×¢

1.1¼ò½é

Ö§³Ö

1.2Ä£°å+Êý¾ÝÄ£ÐÍ=Êä³ö

Ö§³Ö

1.3Êý¾ÝÄ£ÐÍÒ»ÀÀ

Ö§³Ö

1.4.1¼ò½é

Ö§³Ö

1.4.2 (.1--.4)Ö¸ÁîʾÀý

Ö§³Ö

BeetlÖУ¬²ÉÓÃincludeFileTemplate±êÇ©À´includeÒ»¸öÎļþ¡£BeetlÖл¹Ö§³Öswitch/case

1.4.2.5´¦Àí²»´æÔڵıäÁ¿

Ö§³Ö

²»Ö§³ÖѯÎʱäÁ¿ÊÇ·ñ´æÔÚ,µ«¿ÉÒÔͨ¹ýÀ©Õ¹º¯ÊýÀ´Ö§³Ö

2.1»ù±¾ÄÚÈÝ

Ö§³Ö

2.2.1ÀàÐͼò½é

´ó²¿·ÖÖ§³Ö

ºÜÉÙʹÓõĽڵãÀàÐͲ»Ö§³Ö

2.2.2±êÁ¿

Ö§³Ö

2.2.3ÈÝÆ÷

Ö§³Ö

2.2.4·½·¨ºÍº¯Êý

Ö§³Ö

¿ÉÒÔͨ¹ýÀ©Õ¹º¯ÊýÀ´¼ä½ÓÖ§³Ö

2.2.5ÆäËü£¨½ÚµãÀàÐÍ£©

²»Ö§³Ö

3.1×ÜÌå½á¹¹

Ö§³Ö

3.2Ö¸Áî

Ö§³Ö

3.3±í´ïʽ

Ö§³Ö

¼¯ºÏ²Ù×÷²»Ö§³Ö£¬µ«¿ÉÒÔͨ¹ýÀ©Õ¹º¯ÊýÀ´ÊµÏÖ¼¯ºÏ²Ù×÷¡£

½ØÈ¡×Ö·û´®Ò²²»ÊÇÄÚÖõģ¬µ«¿ÉÒÔͨ¹ýÀ©Õ¹º¯ÊýÀ´ÊµÏÖ£¬Èçstr.subString

3.3.3.1×Ö·û´®

Ö§³Ö

3.3.3.2Êý×Ö

Ö§³Ö

3.3.3.3²¼¶ûÖµ

Ö§³Ö

3.3.3.4ÐòÁÐ

Ö§³Ö

²ÉÓÃjsÓï·¨µÄjson¸ñʽ֧³Ö¡£µ«²»°üÀ¨Ö§³Östart..endÕâÑùµÄ·½Ê½

3.3.3.5¹þÏ£±í

Ö§³Ö

3.3.4¼ìË÷±äÁ¿

Ö§³Ö

3.3.5×Ö·û´®²Ù×÷

²»Ö§³Ö

´ËÓï·¨ºÜÆæ¹Ö£¬Ö»ÄÜ˵freemaker¸´ÔÓÁËÓï·¨

3.3.5.2»ñÈ¡Ò»¸ö×Ö·û

Ö§³Ö

ͨ¹ýÀ©Õ¹º¯ÊýÖ§³Ö

3.3.6.1ÐòÁвÙ×÷Á¬½Ó

Ö§³Ö

ͨ¹ýÀ©Õ¹º¯ÊýÖ§³Ö

3.3.6.2ÐòÁÐÇзÖ

Ö§³Ö

ͨ¹ýÀ©Õ¹º¯ÊýÖ§³Ö

3.3.7¹þÏ£±í²Ù×÷Á¬½Ó

Ö§³Ö

3.3.8ËãÊýÔËËã

Ö§³Ö

3.3.9±È½ÏÔËËã

Ö§³Ö

3.3.10Âß¼­²Ù×÷

Ö§³Ö

3.3.11ÄÚ½¨º¯Êý

Ö§³Ö

3.3.13´¦Àí²»´æÔÚµÄÖµ

Ö§³Ö

ͨ¹ýÀ©Õ¹º¯ÊýÖ§³Ö

3.3.13.1ĬÈÏÖµ

²¿·ÖÖ§³Ö

3.3.13.2¼ì²â²»´æÔÚµÄÖµ

Ö§³Ö

3.3.14À¨ºÅ

Ö§³Ö

3.3.15±í´ïʽÖеĿոñ

Ö§³Ö

3.3.16²Ù×÷·ûµÄÓÅÏȼ¶

Ö§³Ö

ÎÞÊý×Ö·¶Î§Õâ¸ö¸ÅÄî

3.4²åÖµ

Ö§³Ö

4.1×Ô¶¨ÒåÖ¸Áºê£©

Ö§³Ö

¼ä½Óͨ¹ý±êÇ©µÈÖ§³Ö

4.1.4ǶÌ×ÄÚÈÝ

Ö§³Ö

BeetlÖÐÖ÷ÒªÓÃÔÚlayout±êÇ©Àï

4.1.5ºêºÍÑ­»·±äÁ¿

Ö§³Ö

4.2ÔÚÄ£°åÖж¨Òå±äÁ¿

Ö§³Ö

4.3ÃüÃû¿Õ¼ä

²¿·ÖÖ§³Ö

ͨ¹ýÀ©Õ¹º¯ÊýÖ§³Ö£¬

4.4¿Õ°×´¦Àí

Ö§³Ö

BeetlÖв»ÐèÒª´Ë¶îÍ⹦ÄÜ

4.5Ìæ»»£¨·½À¨ºÅ£©Óï·¨

Ö§³Ö

8.5.FreemarkerÐÔÄܱȽÏ

»¹ÊÇÒÔ³£ÓÃÄ£°åΪ׼£¨´óС6K£©£¬Ñ­»·äÖȾ50000´Î£¬ÐèҪʱ¼ä£¨ºÁÃëΪµ¥Î»£©ÈçÏÂ

Beetl1.2M1½âÊÍÖ´Ðз½Ê½£¨ÆÕͨģʽ£©£¬ÔËÐÐÈý´Î£¬·Ö±ð1356,1365,1348

Beetl1.2M1±àÒëÖ´Ðз½Ê½£¨ÆÕͨģʽ£©£¬ÔËÐÐÈý´Î£¬·Ö±ð913,922,905

Freemarker·Ö±ðÊÇ1155,1130,1122Beetl1.2M1ÔÊÐí×Ö½ÚÁ÷ÓÅ»¯£¬½âÊÍ·½Ê½Ö´ÐÐÈý´Î£¬·Ö±ðÊÇ587,605,610

Beetl1.2M1ÔÊÐí×Ö½ÚÁ÷ÓÅ»¯£¬±àÒ뷽ʽִÐÐÈý´Î£¬·Ö±ðÊÇ385,355,370

¼ò¶øÑÔÖ®£¬¶Ôbeetl×öÔËÐÐʱ±àÒ룬byteÊä³öÉ趨ºó£¬äÖȾ5Íò´Î6KµÄÄ£°å£¬ÐÔÄÜÈçÏÂ

Freemarker

Beetl

1140ºÁÃë

370ºÁÃë

¼°Ê±²»¶Ôbeetl×öÈκÎÓÅ»¯£¬ÐÔÄÜÒ²ÓëFreemarker³Öƽ.ÈçÏÂÊǵ¥Ïî²âÊÔµÄÐÔÄܱȽϣ¬Êý¾Ý²»ÔÙÁгö£¬Ã»ÏîÐÔÄܲâÊÔ¶¼³¬¹ýÁËFreemarker

¸üÐÂʱ¼ä

¸üÐÂÄÚÈÝ

2012-11-18

Öع¹Íê³É£¬·¢²¼ÁË1.2beta°æ±¾

2012-10-24

ÎĵµÍêÉƺÍbug£¬ÐÞ¸´ÁËÒ»¸ö»á²úÉú¶àÓà¿Õ¸ñµÄÇá΢bug

2012-10-5

ÐÔÄÜÓÅ»¯£¬Ìí¼Ó´íÎó´¦ÀíÎĵµËµÃ÷

2012-9-25

²âÊÔÄ£°å£¬ÐÞ¸´bug

2012-9-23

×Ö·û´®Ä£°å

2012-9-9

°²È«Êä³ö×öÁ˵÷Õû£¬¿ÉÒÔÓ¦ÓÃÓÚ±í´ïʽÖÐ

2012-8-25

ͨ¹ýʹÓÃConfigÀ´¼ò»¯´´½¨GroupTemplate

2012-6-10

Beetl1.2M1·¢²¼£¬ÐÔÄÜÓÅ»¯£¬Îı¾ºÏ²¢Êä³ö£¬¶þ½øÖÆÖ±½ÓÊä³ö

2012-1-8

Beetl1.1·¢²¼£¬±àÒëclassÍêÉÆ

2011-10-1

Beetl1.0·¢²¼£¬ÔËÐÐÖбàÒë³Éclass

2011-6-1

BeetlµÄ0.6Ò»¸ö³õʼ»¯°æ±¾·¢²¼

2011-4-1

¿ªÊ¼Éè¼ÆºÍ¿ª·¢beetl

2010-12-1

JavaÄ£°åÒýÇæÄÇô¶à£¬³ÌÐòÔ±±ØÐëÓÃÕâЩÄÑÓõÄÄ£°åÒýÇæô£¬ÎÞ·¨Ñ¡Ôñ

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值