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')}·µ»ØÖ¸¶¨ÈÕÆÚ
´òÓ¡Ò»¸ö¶ÔÏó
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Ä£°åÒýÇæÄÇô¶à£¬³ÌÐòÔ±±ØÐëÓÃÕâЩÄÑÓõÄÄ£°åÒýÇæô£¬ÎÞ·¨Ñ¡Ôñ