??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产成人手机在线观看 ,亚洲欧美日韩综合久久久久,国产成人精品日本亚洲语音http://www.tkk7.com/jzone/category/40488.htmljava web, java wap ..My laboratory..zh-cnTue, 27 Apr 2010 06:23:32 GMTTue, 27 Apr 2010 06:23:32 GMT60FreeMarker 字符串的截取http://www.tkk7.com/jzone/articles/318932.htmlGavin.leeGavin.leeWed, 21 Apr 2010 01:53:00 GMThttp://www.tkk7.com/jzone/articles/318932.html 截取字符串方法一Q?{str[0..5]}
截取字符串方法二Q?{str?substring(0,5)}

Gavin.lee 2010-04-21 09:53 发表评论
]]>
巧用Freemarker的自定义Ҏhttp://www.tkk7.com/jzone/articles/314371.htmlGavin.leeGavin.leeWed, 03 Mar 2010 01:53:00 GMThttp://www.tkk7.com/jzone/articles/314371.htmlhttp://gzhzh.javaeye.com/blog/433273

一直以来,都想在FTL模板面里应用java的方法?br /> “要想使用Freemarker支持的自定义ҎQ需要实现freemarker.template.TemplateMethodModel接口Q然后将Ҏ对象攑օ到Freemarker的数据模型中Q这样在ftl文g中便可以像用Freemarker内置Ҏ一样用该Ҏ了?#8221;

具体的需求方法:
package yixun.wap.tools;

import java.util.List;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;

public class EncodeURLMethod implements TemplateMethodModel {

    
/**  
     * 执行Ҏ  
     * 
@param argList Ҏ参数列表  
     * 
@return Object Ҏq回?nbsp; 
     * 
@throws TemplateModelException  
     
*/

    
public Object exec(List arg0) throws TemplateModelException {
        
if(arg0.size() != 1{    //限定Ҏ中必M只能传递一个参?/span>
            throw new TemplateModelException("template exception");
        }

        
        String encode 
= java.net.URLEncoder.encode((String) arg0.get(0));
        
return encode;
    }

}


EncodeURLMethod的实例对象放入模型中输出Q?br />
body.put("encodeURL"new EncodeURLMethod());

在Freemarker模版文g中应用:
${body.encodeURL("时时?/span>")}

得到的就是经qencoder的数据串了。这Lh非常方便了Q可以根据业务的需求,扩大FreeMarker的内|方法库?

Gavin.lee 2010-03-03 09:53 发表评论
]]>
FreeMarke开发指?/title><link>http://www.tkk7.com/jzone/articles/291812.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 19 Aug 2009 10:16:00 GMT</pubDate><guid>http://www.tkk7.com/jzone/articles/291812.html</guid><description><![CDATA[<p>1概念<br /> 2指o<br /> if, else, elseif <br /> switch, case, default, break<br /> list, break <br /> include <br /> Import <br /> compress <br /> escape, noescape <br /> assign <br /> global <br /> setting <br /> macro, nested, return<br /> t, lt, rt <br /> 3一些常用方法或注意事项 <br /> 表达式{换类 <br /> 数字循环 <br /> ҎQ点取整数 <br /> l变量默认?<br /> 判断对象是不是null <br /> 常用格式化日?<br /> d全局׃n变量数据模型 <br /> 直接调用java对象的方?<br /> 字符串处?内置Ҏ) <br /> 在模杉K对sequences和hashes初始?<br /> 注释标志 <br /> sequences内置Ҏ <br /> hashes内置Ҏ <br /> 4 freemarker在web开发中注意事项 <br /> web中常用的几个对象 <br /> view中值的搜烦序 <br /> 在模杉Kftl里用标{?<br /> 如何初始化共享变?<br /> 与webwork整合配置 <br /> 5高Ҏ <br /> 自定义方?<br /> 自定?Transforms <br /> <br /> </p> <p>1概念<br /> 最常用?个概?br /> sequence  序列Q对应java里的list、数l等非键值对的集?br /> hash      键值对的集?br /> namespace 对一个ftl文g的引?利用q个名字可以讉K到该ftl文g的资?/p> <p>2指o<br /> <span style="font-family: Comic Sans MS"><strong style="font-size: 14pt">if, else, elseif</strong></span><br /> 语法<br /> <#if condition><br />   ...<br /> <#elseif condition2><br />   ...<br /> <#elseif condition3><br />   ...<br /> <#else><br />   ...<br /> </#if><br /> <br /> <span style="font-family: Comic Sans MS"><strong style="font-size: 14pt">switch, case, default, break</strong></span><br /> 语法<br /> <#switch value><br />   <#case refValue1><br />     ...<br />     <#break><br />   <#case refValue2><br />     ...<br />     <#break><br />   ...<br />   <#case refValueN><br />     ...<br />     <#break><br />   <#default><br />     ...<br /> </#switch></p> <p>用例<br /> 字符?br /> <#switch being.size><br />   <#case "small"><br />      This will be processed if it is small<br />      <#break><br />   <#case "medium"><br />      This will be processed if it is medium<br />      <#break><br />   <#case "large"><br />      This will be processed if it is large<br />      <#break><br />   <#default><br />      This will be processed if it is neither<br /> </#switch><br /> 数字<br /> <#switch x><br />   <#case x = 1><br />     1<br />   <#case x = 2><br />     2<br />   <#default><br />     d<br /> </#switch></p> <p>如果x=1 输出 1 2, x=2输出 2, x=3 输出d</p> <p><span style="font-family: Comic Sans MS"><strong style="font-size: 14pt">list, break</strong></span><br /> 语法<br /> <#list sequence as item><br /> ...<br /> <#if item = "spring"><#break></#if><br /> ...<br /> </#list><br /> 关键?br /> item_index:是list当前值的下标<br /> item_has_next:判断list是否q有?/p> <p>用例<br /> <#assign seq = ["winter", "spring", "summer", "autumn"]><br /> <#list seq as x><br />   ${x_index + 1}. ${x}<#if x_has_next>,</#if><br /> </#list></p> <p>输出<br />   1. winter,<br />   2. spring,<br />   3. summer,<br />   4. autumn  </p> <p><br /> <span style="font-family: Comic Sans MS"><strong style="font-size: 14pt">include</strong></span><br /> 语法<br /> <#include filename><br /> or<br /> <#include filename options><br /> options包含两个属?br /> encoding=”GBK” ~码格式<br /> parse=true 是否作ؓftl语法解析,默认是trueQfalse是以文本方式引?注意在ftl文g里布值都是直接赋值的如parse=true,而不是parse=”true”<br /> 用例<br /> /common/copyright.ftl包含内容<br /> Copyright 2001-2002 ${me}<br><br /> All rights reserved. <br /> 模板文g<br /> <#assign me = "Juila Smith"><br /> <h1>Some test</h1><br /> <p>Yeah.<br /> <hr><br /> <#include "/common/copyright.ftl" encoding=”GBK”><br /> 输出l果<br /> <h1>Some test</h1><br /> <p>Yeah.<br /> <hr><br /> Copyright 2001-2002 Juila Smith<br /> All rights reserved. </p> <p><span style="font-family: Comic Sans MS"><strong style="font-size: 14pt">import</strong></span><br /> 语法<br /> <#import path as hash><br /> cM于java里的import,它导入文Ӟ然后可以在当前文g里用被导入文g里的宏组?/p> <p>用例</p> <p>假设mylib.ftl里定义了宏copyright那么我们在其他模杉K面里可以q样使用<br /> <#import "/libs/mylib.ftl" as my></p> <p><@my.copyright date="1999-2002"/></p> <p>"my"在freemarker里被UCnamespace</p> <p>compress<br /> 语法<br /> <#compress><br />   ...<br /> </#compress><br /> 用来压羃I白I间和空白的?br /> 用例<br /> <#assign x = "    moo  \n\n   "><br /> (<#compress><br />   1 2  3   4    5<br />   ${moo}<br />   test only</p> <p>  I said, test only</p> <p></#compress>) <br /> 输出<br /> (1 2 3 4 5<br /> moo<br /> test only<br /> I said, test only)<br /> <br /> <span style="font-size: 14pt; font-family: Comic Sans MS"><strong>escape, noescape</strong></span><br /> 语法<br /> <#escape identifier as expression><br />   ...<br />   <#noescape>...</#noescape><br />   ...<br /> </#escape><br /> 用例<br /> 主要使用在相似的字符串变量输出,比如某一个模块的所有字W串输出都必Lhtml安全的,q个时候就可以使用该表辑ּ<br /> <#escape x as x?html><br />   First name: ${firstName}<br />   <#noescape>Last name: ${lastName}</#noescape><br />   Maiden name: ${maidenName}<br /> </#escape><br /> 相同表达?<br />   First name: ${firstName?html}<br />   Last name: ${lastName }<br />   Maiden name: ${maidenName?html}<br /> assign<br /> 语法<br /> <#assign name=value><br /> or<br /> <#assign name1=value1 name2=value2 ... nameN=valueN><br /> or<br /> <#assign same as above... in namespacehash><br /> or<br /> <#assign name><br />   capture this<br /> </#assign><br /> or<br /> <#assign name in namespacehash><br />   capture this<br /> </#assign><br /> 用例<br /> 生成变量,q且l变量赋?br /> lseasons赋予序列?br /> <#assign seasons = ["winter", "spring", "summer", "autumn"]></p> <p>l变量test?<br /> <#assign test = test + 1></p> <p>lmy namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变?br /> <#import "/mylib.ftl" as my><br /> <#assign bgColor="red" in my></p> <p>一D输出的文本作ؓ变量保存在x?br /> 下面的阴影部分输出的文本被赋值给x<br /> <#assign x><br />   <#list 1..3 as n><br />     ${n} <@myMacro /><br />   </#list><br /> </#assign><br /> Number of words: ${x?word_list?size}<br /> ${x}</p> <p><#assign x>Hello ${user}!</#assign>     error<br /> <#assign x=” Hello ${user}!”>         true</p> <p>同时也支持中文赋|如:<br /> <#assign 语法><br />   java<br /> </#assign><br /> ${语法}<br /> 打印输出:<br /> java<br /> global<br /> 语法<br /> <#global name=value><br /> or<br /> <#global name1=value1 name2=value2 ... nameN=valueN><br /> or<br /> <#global name><br />   capture this<br /> </#global></p> <p>全局赋D法,利用q个语法l变量赋|那么q个变量在所有的namespace中是可见?如果q个变量被当前的assign语法覆盖 ?lt;#global x=2> <#assign x=1> 在当前页面里x=2被隐藏Q或者通过${.global.x}来访?/p> <p><span style="font-family: Comic Sans MS"><strong style="font-size: 14pt">setting</strong></span><br /> 语法<br /> <#setting name=value><br /> 用来讄整个pȝ的一个环?br /> locale<br /> number_format<br /> boolean_format<br /> date_format, time_format, datetime_format<br /> time_zone<br /> classic_compatible<br /> 用例<br /> 假如当前是匈牙利的设|,然后修改成美?br /> ${1.2}<br /> <#setting locale="en_US"><br /> ${1.2} <br /> 输出<br /> 1,2<br /> 1.2<br /> 因ؓ匈牙利是采用“,”作ؓ十进制的分隔W,国是用“.”</p> <p> </p> <p><span style="font-size: 14pt; font-family: Comic Sans MS"><strong>macro, nested, return</strong></span><br /> 语法</p> <p><#macro name param1 param2 ... paramN><br />   ...<br />   <#nested loopvar1, loopvar2, ..., loopvarN><br />   ...<br />   <#return><br />   ...<br /> </#macro><br /> 用例<br /> <#macro test foo bar="Bar" baaz=-1><br />   Test text, and the params: ${foo}, ${bar}, ${baaz}<br /> </#macro><br /> <@test foo="a" bar="b" baaz=5*5-2/><br /> <@test foo="a" bar="b"/><br /> <@test foo="a" baaz=5*5-2/><br /> <@test foo="a"/><br /> 输出<br />   Test text, and the params: a, b, 23<br />   Test text, and the params: a, b, -1<br />   Test text, and the params: a, Bar, 23<br />   Test text, and the params: a, Bar, -1<br /> 定义循环输出的宏<br /> <#macro list title items><br />   <p>${title?cap_first}:<br />   <ul><br />     <#list items as x><br />       <li>${x?cap_first}<br />     </#list><br />   </ul><br /> </#macro><br /> <@list items=["mouse", "elephant", "python"] title="Animals"/><br /> 输出l果 <br /> <p>Animals:<br />   <ul><br />       <li>Mouse<br />       <li>Elephant<br />       <li>Python<br />   </ul><br /> 包含body的宏<br /> <#macro repeat count><br />   <#list 1..count as x><br />     <#nested x, x/2, x==count><br />   </#list><br /> </#macro><br /> <@repeat count=4 ; c halfc last><br />   ${c}. ${halfc}<#if last> Last!</#if><br /> </@repeat><br /> 输出<br /> 1. 0.5<br />   2. 1<br />   3. 1.5<br />   4. 2 Last!</p> <p> </p> <p><br /> <span style="font-size: 14pt; font-family: Comic Sans MS"><strong>t, lt, rt</strong></span><br /> 语法<br /> <#t> L左右I白和回车换?/p> <p><#lt>L左边I白和回车换?/p> <p><#rt>L双I白和回车换?/p> <p><#nt>取消上面的效?/p> <p><br /> 3一些常用方法或注意事项</p> <p><br /> 表达式{换类<br /> ${expression}计算expressionq输?br /> #{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m<br /> M表示数点后最多的位数,m表示数点后最的位数?{121.2322;m2M2}输出121.23</p> <p> <br /> 数字循环<br /> 1..5 表示??Q原型number..number<br /> <br /> ҎQ点取整数<br /> ${123.23?int} 输出123<br /> <br /> l变量默认?br /> ${var?default(“hello world<br>”)?html}如果var is null那么会被hello world<br>替代<br /> <br /> 判断对象是不是null<br />     <#if mouse?exists><br />       Mouse found<br /> <#else><br /> 也可以直?{mouse?if_exists})输出布尔?br /> <br /> 常用格式化日?br />  openingTime必须是Date?详细查看freemarker文档 Reference->build-in referece->build-in for date</p> <p>${openingTime?date}<br /> ${openingTime?date_time}<br /> ${openingTime?time}<br /> </p> <p><br /> d全局׃n变量数据模型<br /> 在代码里的实?br />     cfg = Configuration.getDefaultConfiguration();<br /> cfg.setSharedVariable("global", "you good");<br /> 面实现可以通过global指o,具体查看指o里的global部分<br /> <br /> 直接调用java对象的方?br /> ${object.methed(args)} <br /> </p> <p><br /> 字符串处?内置Ҏ)<br /> html安全输出<br /> “abc<table>sdfsf”?html<br /> q回安全的html输出,替换掉html代码<br /> <br /> xml安全输出<br /> var?xml  <br /> <br /> substring的用?br /> <#assign user=”hello jeen”><br /> ${user[0]}${user[4]}<br /> ${user[1..4]}<br /> 输出 :<br /> ho<br /> ello <br /> <br /> cMString.split的用?br />  “abc;def;ghi”?split(“;”)q回sequence<br /> 字W串按空D{化成sequence,然后取sequence的长?br />      var?word_list  效果?var?split(“ ”)<br />  var?word_list?size<br /> </p> <p><br /> 取得字符串长?br /> var?length<br /> </p> <p><br /> 大写输出字符<br /> var?upper_case<br /> </p> <p><br /> 写输出字符<br /> var?lower_case<br /> </p> <p><br /> 首字W大?br /> var?cap_first<br /> </p> <p><br /> 首字W小?br /> var?uncap_first<br /> </p> <p><br /> L字符串前后空?br /> var?trim<br /> <br /> </p> <p>每个单词的首字符大写<br /> var?capitalize<br /> </p> <p><br /> cMString.indexof:<br />  “babcdabcd”?index_of(“abc”) q回1<br />  “babcdabcd”?index_of(“abc”,2) q回5<br /> <br /> cMString.lastIndexOf<br />  last_index_of和String.lastIndexOfcM,同上<br /> <br /> 下面两个可能在代码生成的时候用(在引号前?#8221;\”Q?br /> j_string: 在字W串引号前加”\”<br />  <#assign beanName = 'The "foo" bean.'><br />  String BEAN_NAME = "${beanName?j_string}";<br /> 打印输出:<br />  String BEAN_NAME = "The \"foo\" bean.";<br /> js_string:<br /> <br />  <#assign user = "Big Joe's \"right hand\"."><br /> <script><br />   alert("Welcome ${user}!");<br /> </script> <br /> 打印输出<br />  alert("Welcome Big Joe\'s \"right hand\"!");<br /> <br /> 替换字符?replace<br /> ${s?replace('ba’, 'XY’ )}<br /> ${s?replace('ba’, 'XY’ , '规则参数’)}s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下:<br /> · i: 大小写不区分.<br /> · f: 只替换第一个出现被替换字符串的字符?br /> · r:  XY是正则表辑ּ<br /> · m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string.<br /> · s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators.<br /> · c: Permits whitespace and comments in regular expressions.</p> <p><br /> 在模杉K对sequences和hashes初始?br /> sequences </p> <p>1. [“you”,”me”,”he”]<br /> 2. 1..100<br /> 3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”},<br /> {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”},<br /> ]</p> <p><br /> hashes      {“you”:”a”,”me”:”b”,”he”:”c”}</p> <p><br /> 注释标志<br /> <#--<br /> q里是注?br /> --><br /> 旧版本的freemarker采用的是<#comment> 注释 </#comment>Ҏ</p> <p>sequences内置Ҏ<br /> sequence?first<br /> q回sequence的第一个?前提条gsequence不能是null<br /> sequence?last<br />  q回sequence最后一个?br /> sequence?reverse<br />  反{sequence的?br /> sequence?size<br />  q回sequence的大?br /> sequence?sort<br />  对sequence按里面的对象toString()的结果进行排?br /> sequence?sort_by(value)<br /> 对sequence 按里面的对象的属性valueq行排序<br /> ? sequence里面攑օ的是10 个user对象Quser对象里面包含name,age{属?br /> sequence?sort_by(name) 表示所有的user按user.nameq行排序<br /> hashes内置Ҏ<br /> hash?keys<br />  q回hash里的所有keys, q回l果cdsequence<br /> hash?values<br />  q回hash里的所有value, q回l果cdsequence<br /> <br /> 4 freemarker在web开发中注意事项<br /> freemarker与webwork整合<br /> web中常用的几个对象<br /> Freemarker的ftl文g中直接用内部对?<br /> ${Request ["a"]}<br /> ${RequestParameters["a"]}<br /> ${Session ["a"]}<br /> ${Application ["a"]}<br /> ${JspTaglibs ["a"]}</p> <p>与webwork整合之后 通过配置的servlet 已经把request,session{对象置入了数据模型?br /> 在view中存在下面的对象<br />   我们可以在ftl?{req}来打印req对象<br /> · req - the current HttpServletRequest<br /> · res - the current HttpServletResponse<br /> · stack - the current OgnlValueStack<br /> · ognl - the OgnlTool instance<br /> · webwork - an instance of FreemarkerWebWorkUtil<br /> · action - the current WebWork action<br /> · exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view<br /> view中值的搜烦序<br /> ${name}会以下面的序查找name?br /> · freemarker variables<br /> · value stack<br /> · request attributes<br /> · session attributes<br /> · servlet context attributes<br /> 在模杉Kftl里用标{?br /> 注意Q如果标{属性值是数字Q那么必采用nubmer=123方式l属性赋?br /> JSP面<br /> <%@page contentType="text/html;charset=ISO-8859-2" language="java"%><br /> <%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%><br /> <%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%></p> <p><html><br />   <body><br />     <h1><bean:message key="welcome.title"/></h1><br />     <html:errors/><br />     <html:form action="/query"><br />       Keyword: <html:text property="keyword"/><br><br />       Exclude: <html:text property="exclude"/><br><br />       <html:submit value="Send"/><br />     </html:form><br />   </body><br /> </html><br /> 模板ftl面<br /> <#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]><br /> <#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]></p> <p><html><br />   <body><br />     <h1><@bean.message key="welcome.title"/></h1><br />     <@html.errors/><br />     <@html.form action="/query"><br />       Keyword: <@html.text property="keyword"/><br><br />       Exclude: <@html.text property="exclude"/><br><br />       <@html.submit value="Send"/><br />     </@html.form><br />   </body><br /> </html> </p> <p><br /> 如何初始化共享变?br /> 1Q?初始化全局׃n数据模型<br /> freemark在web上用的时候对׃n数据的初始化支持的不?不能在配|初始化的时候实玎ͼ而必通过ftl文g来初始化全局变量。这是不能满主需求的Q我们需要在servlet init的时候留Z个接口来初始化系l的׃n数据<br /> 具体到和webwork整合,因ؓ本nwebwork提供了整合servlet,如果要增加全局׃n变量Q可以通过修改 com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实?我们可以在这?servlet初始化的时候来初始化全局׃n变量<br /> 与webwork整合配置<br /> 配置web.xml<br /> <servlet><br />     <servlet-name>freemarker</servlet-name><br />     <servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class><br />     <init-param><br />       <param-name>TemplatePath</param-name><br /> <param-value>/</param-value><br /> <!—模板蝲入文件夹Q这里相对context rootQ递归获取该文件夹下的所有模?-><br />     </init-param><br />     <init-param><br />       <param-name>NoCache</param-name> <!—是否对模板~存--><br />       <param-value>true</param-value><br />     </init-param><br />     <init-param><br />       <param-name>ContentType</param-name><br />       <param-value>text/html</param-value><br />     </init-param><br />     <init-param><br /> <param-name>template_update_delay</param-name><br /> <!—模板更新时?0表示每次都更?q个适合开发时?-><br />       <param-value>0</param-value><br />     </init-param><br />     <init-param><br />       <param-name>default_encoding</param-name><br />       <param-value>GBK</param-value><br />     </init-param><br />     <init-param><br />       <param-name>number_format</param-name><br />       <param-value>0.##########</param-value><!—数字显C格?-><br />     </init-param><br />     <load-on-startup>1</load-on-startup><br />   </servlet><br />   <servlet-mapping><br />     <servlet-name>freemarker</servlet-name><br />     <url-pattern>*.ftl</url-pattern><br />   </servlet-mapping></p> <p>5高Ҏ<br /> 自定义方?br /> ${timer("yyyy-MM-dd H:mm:ss", x)}<br /> ${timer("yyyy-MM-dd ", x)}</p> <p>在模板中除了可以通过对象来调用方法外Q?{object.methed(args)}Q也可以直接调用java实现的方法,javacdd现接口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间{换成按格式输出的旉Z?br /> public class LongToDate implements TemplateMethodModel {<br />    <br /> public TemplateModel exec(List args) throws TemplateModelException {<br /> SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0)));<br />         return mydate.format(new Date(Long.parseLong((String)args.get(1)));<br />     }<br /> } <br /> LongToDate对象攑օ到数据模型中<br /> root.put("timer", new IndexOfMethod());<br /> ftl模板里?br /> <#assign x = "123112455445"><br /> ${timer("yyyy-MM-dd H:mm:ss", x)}<br /> ${timer("yyyy-MM-dd ", x)}</p> <p>输出<br /> 2001-10-12 5:21:12<br /> 2001-10-12</p> <p>自定?Transforms<br /> 实现自定义的<@transform>文本或表辑ּ</@transform>的功?允许对中间的最l文本进行解析{?/p> <p>例子Q实?lt;@upcase>str</@upcase> str转换成STR 的功?/p> <p>代码如下Q?br /> import java.io.*;<br /> import java.util.*;<br /> import freemarker.template.TemplateTransformModel;</p> <p>class UpperCaseTransform implements TemplateTransformModel {</p> <p>    public Writer getWriter(Writer out, Map args) {<br />         return new UpperCaseWriter(out);<br />     }</p> <p>    private class UpperCaseWriter extends Writer {<br />       <br />         private Writer out;<br />           <br />         UpperCaseWriter (Writer out) {<br />             this.out = out;<br />         }</p> <p>        public void write(char[] cbuf, int off, int len)<br />                 throws IOException {<br />             out.write(new String(cbuf, off, len).toUpperCase());<br />         }</p> <p>        public void flush() throws IOException {<br />             out.flush();<br />         }</p> <p>        public void close() {<br />         }<br />     }<br /> } <br /> 然后此对象put到数据模型中<br /> root.put("upcase", new UpperCaseTransform());</p> <p>在view(ftl)面中可以如下方式?/p> <p><@upcase><br /> hello world<br /> </@upcase></p> <p>打印输出:<br /> HELLO WORLD</p> <img src ="http://www.tkk7.com/jzone/aggbug/291812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jzone/" target="_blank">Gavin.lee</a> 2009-08-19 18:16 <a href="http://www.tkk7.com/jzone/articles/291812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker 中常见的 StringIndexOutOfBoundsExceptionhttp://www.tkk7.com/jzone/articles/286070.htmlGavin.leeGavin.leeThu, 09 Jul 2009 05:10:00 GMThttp://www.tkk7.com/jzone/articles/286070.html

500 Servlet Exception

java.lang.StringIndexOutOfBoundsException: String index out of range: 1
	at java.lang.String.substring(String.java:1935)
	at yixun.wap.filter.ReplaceTextStream.replaceContent(ReplaceTextFilter.java:32)
	at yixun.wap.filter.ReplaceTextFilter.doFilter(ReplaceTextFilter.java:81)
	at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:73)
	at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:167)
	at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:226)
	at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:263)
	at com.caucho.server.port.TcpConnection.run(TcpConnection.java:477)
	at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:591)
	at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:619)


Gavin.lee 2009-07-09 13:10 发表评论
]]>
MyEclipse 安装 FreeMarker~辑?/title><link>http://www.tkk7.com/jzone/articles/286068.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 09 Jul 2009 04:57:00 GMT</pubDate><guid>http://www.tkk7.com/jzone/articles/286068.html</guid><description><![CDATA[ <p> <br />要用FreeMarkerQ话不多_肯定先要lMyEclipse装上FreeMarker的编辑插Ӟq样代码才能高亮昄啊?br /><br /><br />打开菜单?Help -> Software updates -> Find and install.... <br /><br />选择单选项 "Search for new features to install". <br />点击 Add Update Site..., 输入 "FreeMarker"  作ؓ名字以及 "http://www.freemarker.org/eclipse/update" 作ؓ更新的地址 <br />选中复选框 "FreeMarker" 点击下一步或完成按钮Ҏ提示完成插g的安?<br /><br />要想使用FreeMarker开发了Q那q需要网上下载freemarker.jar?/p> <img src ="http://www.tkk7.com/jzone/aggbug/286068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jzone/" target="_blank">Gavin.lee</a> 2009-07-09 12:57 <a href="http://www.tkk7.com/jzone/articles/286068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker 中最常见?undefinedhttp://www.tkk7.com/jzone/articles/286013.htmlGavin.leeGavin.leeThu, 09 Jul 2009 01:50:00 GMThttp://www.tkk7.com/jzone/articles/286013.html500 Servlet Exception
freemarker.core.InvalidReferenceException: Expression s.expect is undefined
on line 7, column 11 in news/prize/open/ssc.ftl.
	at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
	at freemarker.core.Expression.getStringValue(Expression.java:118)
	at freemarker.core.Expression.getStringValue(Expression.java:93)
	at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
	at freemarker.core.Environment.visit(Environment.java:416)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.Environment.visit(Environment.java:394)
	at freemarker.core.BodyInstruction.accept(BodyInstruction.java:93)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.Environment.visit(Environment.java:298)
	at freemarker.core.CompressedBlock.accept(CompressedBlock.java:73)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.EscapeBlock.accept(EscapeBlock.java:84)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.Macro$Context.runMacro(Macro.java:168)
	at freemarker.core.Environment.visit(Environment.java:602)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:209)
	at freemarker.core.Environment.process(Environment.java:189)
	at freemarker.template.Template.process(Template.java:237)
	at yixun.wap.freemarker.FreemarkerDo.doMark(FreemarkerDo.java:47)
	at _jsp._page._news._prize._open._ssc__jsp._jspService(page/news/prize/open/ssc.jsp:41)
	at com.caucho.jsp.JavaPage.service(JavaPage.java:61)
	at com.caucho.jsp.Page.pageservice(Page.java:586)
	at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:190)
	at yixun.wap.filter.ReplaceTextFilter.doFilter(ReplaceTextFilter.java:77)
	at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:73)
	at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:167)
	at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:226)
	at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:263)
	at com.caucho.server.port.TcpConnection.run(TcpConnection.java:477)
	at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:591)
	at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:619)


注:
׃freemarker强烈不支持nullQ所以这个问题呢Q多半就是JSPQ或抛数据源的地方)数据没有正确的传q来。究其原因,不在ftl模板? MyEclipse控制台输出:一看知道哪个页面,哪行错了Qso easy…? O(∩_?O~
[09:44:50.546] Compiling _jsp/_page/_news/_prize/_open/_ssc__jsp.java
[ERROR]
Expression s.expect is undefined on line 7, column 11 in news/prize/open/ssc.ftl.
The problematic instruction:
----------
==> ${s.expect} [on line 7, column 9 in news/prize/open/ssc.ftl]
 in user-directive f.page [on line 3, column 1 in news/prize/open/ssc.ftl]
----------
Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression s.expect is undefined on line 7, column 11 in news/prize/open/ssc.ftl.
 at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
 at freemarker.core.Expression.getStringValue(Expression.java:118)
…?br />…?/pre>

Gavin.lee 2009-07-09 09:50 发表评论
]]>freemarker 语法基础Q{Q?/title><link>http://www.tkk7.com/jzone/articles/284300.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 26 Jun 2009 07:59:00 GMT</pubDate><guid>http://www.tkk7.com/jzone/articles/284300.html</guid><description><![CDATA[<div id="wqcukow" class="blog_content"> <p>http://freemarker.org/docs/index.html   官方手册<br /> </p> <p>FreeMarker的模板文件ƈ不比HTML面复杂多少,FreeMarker模板文g主要由如?个部分组?<br /> <strong>1,文本:直接输出的部?br /> 2,注释:<#-- ... -->格式部分,不会输出<br /> 3,插??{...}?{...}格式的部?用数据模型中的部分替代输?br /> 4,FTL指o:FreeMarker指定,和HTML标记cM,名字前加#予以区分,不会输出</strong></p> <p>下面是一个FreeMarker模板的例?包含了以上所说的4个部?br /> <html><br><br /> <head><br><br /> <title>Welcome!</title><br><br /> </head><br><br /> <body><br><br /> <#-- 注释部分 --><br><br /> <#-- 下面使用插?--><br /> <h1>Welcome ${user} !</h1><br><br /> <p>We have these animals:<br><br /> <u1><br><br /> <#-- 使用FTL指o --><br /> <#list animals as being><br><br />    <li>${being.name} for ${being.price} Euros<br><br /> <#list><br><br /> <u1><br><br /> </body><br><br /> </html></p> <p><strong><span style="font-size: large;">1, FTL指o规则</span></strong></p> <p>在FreeMarker?使用FTL标签来用指?FreeMarker?UFTL标签,q和HTML标签是完全类似的.<br /> 1,开始标{?<#directivename parameter><br /> 2,l束标签:</#directivename><br /> 3,I标{?<#directivename parameter/></p> <p>实际?使用标签时前面的W号#也可能变成@,如果该指令是一个用h令而不是系l内建指令时,应将#W号Ҏ@W号.<br /> 使用FTL标签?应该有正的嵌套,而不是交叉?q和XML标签的用法完全一?如果全用不存在的指o,FreeMarker不会使用模板输出,而是产生一个错误消?FreeMarker会忽略FTL标签中的I白字符.值得注意的是< , /> 和指令之间不允许有空白字W?</p> <p><strong><span style="font-size: large;">2, 插D?/span></strong></p> <p>FreeMarker的插值有如下两种cd:1,通用插?{expr};2,数字格式化插?#{expr}?{expr;format}</p> <p><strong><span style="font-size: small;">2.1 通用插?/span></strong></p> <p>对于通用插?又可以分Z?U情?<br /> 1,插值结果ؓ字符串?直接输出表达式结?br /> 2,插值结果ؓ数字?Ҏ默认格式(?setting指o讄)表辑ּl果转换成文本输?可以使用内徏的字W串函数格式化单个插?如下面的例子:<br /> <#settion number_format="currency"/><br /> <#assign answer=42/><br /> ${answer}<br /> ${answer?string} <#-- the same as ${answer} --><br /> ${answer?string.number}<br /> ${answer?string.currency}<br /> ${answer?string.percent}<br /> ${answer}<br /> 输出l果?<br /> $42.00<br /> $42.00<br /> 42<br /> $42.00<br /> 4,200%<br /> 3,插值结果ؓ日期?Ҏ默认格式(?setting指o讄)表辑ּl果转换成文本输?可以使用内徏的字W串函数格式化单个插?如下面的例子:<br /> ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}<br /> ${lastUpdated?string("EEE, MMM d, ''yy")}<br /> ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}<br /> 输出l果?<br /> 2008-04-08 08:08:08 Pacific Daylight Time<br /> Tue, Apr 8, '03<br /> Tuesday, April 08, 2003, 08:08:08 PM (PDT)<br /> 4,插值结果ؓ布尔?Ҏ默认格式(?setting指o讄)表辑ּl果转换成文本输?可以使用内徏的字W串函数格式化单个插?如下面的例子:<br /> <#assign foo=true/><br /> ${foo?string("yes", "no")}<br /> 输出l果?<br /> yes</p> <p><strong><span style="font-size: small;">2.2 数字格式化插?/span></strong></p> <p>数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以?<br /> mX:数部分最X?br /> MX:数部分最大X?br /> 如下面的例子:<br /> <#assign x=2.582/><br /> <#assign y=4/><br /> #{x; M2} <#-- 输出2.58 --><br /> #{y; M2} <#-- 输出4 --><br /> #{x; m2} <#-- 输出2.6 --><br /> #{y; m2} <#-- 输出4.0 --><br /> #{x; m1M2} <#-- 输出2.58 --><br /> #{x; m1M2} <#-- 输出4.0 --></p> <p><strong><span style="font-size: large;">3, 表达?/span></strong></p> <p>表达式是FreeMarker模板的核心功?表达式放|在插D?{}之中?表明需要输辑ּ的?表达式语法也可与FreeMarker标签l合,用于控制输出.实际上FreeMarker的表辑ּ功能非常强大,它不仅支持直接指定?输出变量?也支持字W串格式化输出和集合讉K{功?</p> <p><strong><span style="font-size: small;">3.1 直接指定?/span></strong></p> <p>使用直接指定D法让FreeMarker直接输出插g的?而不是输出变量?直接指定值可以是字符?数?布尔?集合和MAP对象.</p> <p>1,字符?br /> 直接指定字符串g用单引号或双引号限定,如果字符串g包含Ҏ字符需要{?看下面的例子:<br /> ${"我的文g保存在C:\\?}<br /> ${'我名字是\"annlee\"'}<br /> 输出l果? <br /> 我的文g保存在C:\?br /> 我名字是"annlee"</p> <p>FreeMarker支持如下转义字符:<br /> \";双引?u0022)<br /> \';单引?u0027)<br /> \\;反斜?u005C)<br /> \n;换行(u000A)<br /> \r;回R(u000D)<br /> \t;Tab(u0009)<br /> \b;退格键(u0008)<br /> \f;Form feed(u000C)<br /> \l;<<br /> \g;><br /> \a;&<br /> \{;{<br /> \xCode;直接通过4位的16q制数来指定Unicode?输出该unicode码对应的字符.</p> <p>如果某段文本中包含大量的ҎW号,FreeMarker提供了另一U特D格?可以在指定字W串内容的引号前增加r标记,在r标记后的文g会直接输出.看如下代?<br /> ${r"${foo}"}<br /> ${r"C:\foo\bar"}<br /> 输出l果?<br /> ${foo}<br /> C:\foo\bar</p> <p>2,数?br /> 表达式中的数值直接输?不需要引?数点?."分隔,不能使用分组","W号.FreeMarker目前q不支持U学计数?所?1E3"是错误的.在FreeMarker表达式中使用数值需要注意以下几?<br /> 1,数g能省略小数点前面?,所?.5"是错误的写法<br /> 2,数? , +8 , 8.00都是相同?/p> <p>3,布尔?br /> 直接使用true和false,不用引?</p> <p>4,集合<br /> 集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:<br /> <#list ["星期一", "星期?, "星期?, "星期?, "星期?, "星期?, "星期?] as x><br /> ${x}<br /> </#list><br /> 输出l果?<br /> 星期一<br /> 星期?br /> 星期?br /> 星期?br /> 星期?br /> 星期?br /> 星期?/p> <p>除此之外,集合元素也可以是表达?例子如下:<br /> [2 + 2, [1, 2, 3, 4], "whatnot"]</p> <p>q可以用数字范围定义数字集??..5{同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用Ҏ?数字范围也支持反递增的数字范??..2</p> <p>5,Map对象<br /> Map对象使用花括号包?Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例?<br /> {"语文":78, "数学":80}<br /> Map对象的key和value都是表达?但是key必须是字W串</p> <p><strong><span style="font-size: small;">3.2 输出变量?/span></strong></p> <p>FreeMarker的表辑ּ输出变量?q些变量可以是顶层变?也可以是Map对象中的变量,q可以是集合中的变量,q可以用点(.)语法来访问Java对象的属?下面分别讨论q些情况</p> <p>1,层变量<br /> 所谓顶层变量就是直接放在数据模型中的?例如有如下数据模?<br /> Map root = new HashMap();   //创徏数据模型<br /> root.put("name","annlee");   //name是一个顶层变?/p> <p>对于层变量,直接使用${variableName}来输出变量?变量名只能是字母,数字,下划U?$,@?的组?且不能以数字开头号.Z输出上面的name的?可以使用如下语法:<br /> ${name}</p> <p>2,输出集合元素<br /> 如果需要输出集合元?则可以根据集合元素的索引来输出集合元?集合元素的烦引以Ҏh?假设有烦?<br /> ["星期一","星期?,"星期?,"星期?,"星期?,"星期?,"星期?].该烦引名为week,如果需要输出星期三,则可以用如下语?<br /> ${week[2]}   //输出W三个集合元?/p> <p>此外,FreeMarkerq支持返回集合的子集?如果需要返回集合的子集?则可以用如下语?<br /> week[3..5]   //q回week集合的子集合,子集合中的元素是week集合中的W?-6个元?/p> <p>3,输出Map元素<br /> q里的Map对象可以是直接HashMap的实?甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性ؓkey,属性gؓvalue的Map实例.Z输出Map元素的?可以使用点语法或Ҏ可?假如有下面的数据模型:<br /> Map root = new HashMap();<br /> Book book = new Book();<br /> Author author = new Author();<br /> author.setName("annlee");<br /> author.setAddress("gz");<br /> book.setName("struts2");<br /> book.setAuthor(author);<br /> root.put("info","struts");<br /> root.put("book", book);</p> <p>Z讉K数据模型中名为struts2的书的作者的名字,可以使用如下语法:<br /> book.author.name    //全部使用点语?br /> book["author"].name<br /> book.author["name"]    //混合使用点语法和Ҏ可?br /> book["author"]["name"]   //全部使用Ҏ可?/p> <p>使用点语法时,变量名字有顶层变量一L限制,但方括号语法没有该限?因ؓ名字可以是Q意表辑ּ的结?</p> <p><strong><span style="font-size: small;">3.3, 字符串操?/span></strong></p> <p>FreeMarker的表辑ּ对字W串操作非常灉|,可以字W串帔R和变量连接v?也可以返回字W串的子串等.</p> <p>字符串连接有两种语法:<br /> 1,使用${..}?{..}在字W串帔R部分插入表达式的?从而完成字W串q接.<br /> 2,直接使用q接q算W?来连接字W串</p> <p>例如有如下数据模?<br /> Map root = new HashMap(); root.put("user","annlee");<br /> 下面user变量和常量连接v?<br /> ${"hello, ${user}!"}   //使用W一U语法来q接<br /> ${"hello, " + user + "!"} //使用+hq接<br /> 上面的输出字W串都是hello,annlee!,可以看出q两U语法的效果完全一?</p> <p>值得注意的是,${..}只能用于文本部分,不能用于表达?下面的代码是错误?<br /> <#if ${isBig}>Wow!</#if><br /> <#if "${isBig}">Wow!</#if><br /> 应该写成:<#if isBig>Wow!</#if></p> <p>截取子串可以Ҏ字符串的索引来进?截取子串时如果只指定了一个烦引?则用于取得字W串中指定烦引所对应的字W?如果指定两个索引?则返回两个烦引中间的字符串子?假如有如下数据模?<br /> Map root = new HashMap(); root.put("book","struts2,freemarker");<br /> 可以通过如下语法来截取子?<br /> ${book[0]}${book[4]}   //l果是su<br /> ${book[1..4]}     //l果是tru</p> <p><strong><span style="font-size: small;">3.4 集合q接q算W?/span></strong></p> <p>q里所说的集合q算W是两个集合连接成一个新的集?q接集合的运符?,看如下的例子:<br /> <#list ["星期一","星期?,"星期?] + ["星期?,"星期?,"星期?,"星期?] as x><br /> ${x}<br /> </#list><br /> 输出l果?星期一 星期? 星期?星期?星期?星期?星期?/p> <p><strong><span style="font-size: small;">3.5 Mapq接q算W?/span></strong></p> <p>Map对象的连接运符也是两个Map对象q接成一个新的Map对象,Map对象的连接运符?,如果两个Map对象h相同的key,则右边的值替代左边的?看如下的例子:<br /> <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}><br /> 语文成W?{scores.语文}<br /> 数学成W?{scores.数学}<br /> Java成W?{scores.Java}<br /> 输出l果?<br /> 语文成W?6<br /> 数学成W?7<br /> Java成W?3</p> <p><strong><span style="font-size: small;">3.6 术q算W?/span></strong></p> <p>FreeMarker表达式中完全支持术q算,FreeMarker支持的算术运符包括:+, - , * , / , % 看如下的代码:<br /> <#assign x=5><br /> ${ x * x - 100 }<br /> ${ x /2 }<br /> ${ 12 %10 }<br /> 输出l果?<br /> -75   2.5   2</p> <p>在表辑ּ中用算术运符时要注意以下几点:<br /> 1,q算W两边的q算数字必须是数?br /> 2,使用+q算W时,如果一Ҏ数字,一Ҏ字符?׃自动数字{换ؓ字符串再q接,?${3 + "5"},l果?35</p> <p>使用内徏的int函数可对数值取??<br /> <#assign x=5><br /> ${ (x/2)?int }<br /> ${ 1.1?int }<br /> ${ 1.999?int }<br /> ${ -1.1?int }<br /> ${ -1.999?int }<br /> l果?2 1 1 -1 -1</p> <p><strong><span style="font-size: small;">3.7 比较q算W?/span></strong></p> <p>表达式中支持的比较运符有如下几?<br /> 1,=或?=:判断两个值是否相{?<br /> 2,!=:判断两个值是否不{?<br /> 3,>或者gt:判断左边值是否大于右边?br /> 4,>=或者gte:判断左边值是否大于等于右边?br /> 5,<或者lt:判断左边值是否小于右边?br /> 6,<=或者lte:判断左边值是否小于等于右边?/p> <p>注意:=?=可以用于字符?数值和日期来比较是否相{???=两边必须是相同类型的?否则会生错?而且FreeMarker是精比?"x","x ","X"是不{的.其它的运行符可以作用于数字和日期,但不能作用于字符?大部分的时?使用gt{字母运符代替>会有更好的效?因ؓFreeMarker会把>解释成FTL标签的结束字W?当然,也可以用括h避免q种情况,?<#if (x>y)></p> <p><strong><span style="font-size: small;">3.8 逻辑q算W?/span></strong></p> <p>逻辑q算W有如下几个:<br /> 逻辑?&&<br /> 逻辑?||<br /> 逻辑?!<br /> 逻辑q算W只能作用于布尔?否则生错?/p> <p><strong><span style="font-size: small;">3.9 内徏函数</span></strong></p> <p>FreeMarkerq提供了一些内建函数来转换输出,可以在Q何变量后紧跟?,?后紧跟内建函?可以通过内徏函数来轮换输出变?下面是常用的内徏的字W串函数:<br /> html:对字W串q行HTML~码<br /> cap_first:使字W串W一个字母大?br /> lower_case:字W串转换成小?br /> upper_case:字W串转换成大?br /> trim:L字符串前后的I白字符</p> <p>下面是集合的常用内徏函数<br /> size:获取序列中元素的个数</p> <p>下面是数字值的常用内徏函数<br /> int:取得数字的整数部?l果带符?/p> <p>例如:<br /> <#assign test="Tom & Jerry"><br /> ${test?html}<br /> ${test?upper_case?html}<br /> l果?Tom &amp; Jerry   TOM &amp; JERRY</p> <p><strong><span style="font-size: small;">3.10 I值处理运符</span></strong></p> <p>FreeMarker对空值的处理非常严格,FreeMarker的变量必L?没有被赋值的变量׃抛出异常,因ؓFreeMarker未赋值的变量强制出错可以杜绝很多潜在的错?如缺失潜在的变量命名,或者其他变量错?q里所说的I?实际上也包括那些q不存在的变?对于一个Java的nullD言,我们认ؓq个变量是存在的,只是它的gؓnull,但对于FreeMarker模板而言,它无法理解null?null值和不存在的变量完全相同.</p> <p>Z处理~失变量,FreeMarker提供了两个运符:<br /> !:指定~失变量的默认?br /> ??:判断某个变量是否存在</p> <p>其中,!q算W的用法有如下两U?<br /> variable!或variable!defaultValue,W一U用法不l缺q变量指定默认?表明默认值是I字W串,长度?的集?或者长度ؓ0的Map对象.</p> <p>使用!指定默认值时,q不要求默认值的cd和变量类型相?使用??q算W非常简?它Lq回一个布?用法?variable??,如果该变量存?q回true,否则q回false</p> <p><strong><span style="font-size: small;">3.11 q算W的优先U?/span></strong></p> <p>FreeMarker中的q算W优先如下(由高C排列):<br /> 1,一元运符:!<br /> 2,内徏函数:?<br /> 3,乘除?*, / , %<br /> 4,加减?- , +<br /> 5,比较:> , < , >= , <= (lt , lte , gt , gte)<br /> 6,相等:== , = , !=<br /> 7,逻辑?&&<br /> 8,逻辑?||<br /> 9,数字范围:..</p> <p>实际?我们在开发过E中应该使用括号来严格区?q样的可L好,出错?/p> <p><strong><span style="font-size: large;">4 FreeMarker的常用指?/span></strong></p> <p>FreeMarker的FTL指o也是模板的重要组成部?q些指o可实现对数据模型所包含数据的抚今P?分支控制.除此之外,q有一些重要的功能,也是通过FTL指o来实现的.</p> <p><strong><span style="font-size: small;">4.1 if指o</span></strong></p> <p>q是一个典型的分支控制指o,该指令的作用完全cM于Java语言中的if,if指o的语法格式如?<br /> <#if condition>...<br /> <#elseif condition>...<br /> <#elseif condition>...<br /> <#else> ...<br /> </#if></p> <p>例子如下:<br /> <#assign age=23><br /> <#if (age>60)>老年?br /> <#elseif (age>40)>中年?br /> <#elseif (age>20)>青年?br /> <#else> 年?br /> </#if><br /> 输出l果?青年?br /> 上面的代码中的逻辑表达式用括号括v来主要是因ؓ里面?gt;W号,׃FreeMarker会将>W号当成标签的结束字W?可能DE序出错,Z避免q种情况,我们应该在凡是出现这些符L地方都用括?</p> <p><strong><span style="font-size: small;">4.2 switch , case , default , break指o</span></strong></p> <p>q些指o昄是分支指?作用cM于Java的switch语句,switch指o的语法结构如?<br /> <#switch value><br /> <#case refValue>...<#break><br /> <#case refValue>...<#break><br /> <#default>...<br /> </#switch></p> <p><strong><span style="font-size: small;">4.3 list, break指o</span></strong></p> <p>list指o是一个P代输出指?用于q代输出数据模型中的集合,list指o的语法格式如?<br /> <#list sequence as item><br /> ...<br /> </#list><br /> 上面的语法格式中,sequence是一个集合对?也可以是一个表辑ּ,但该表达式将q回一个集合对?而item是一个Q意的名字,是被P代输出的集合元素.此外,q代集合对象?q包含两个特D的循环变量:<br /> item_index:当前变量的烦引?br /> item_has_next:是否存在下一个对?br /> 也可以?lt;#break>指o跛_q代</p> <p>例子如下:<br /> <#list ["星期一", "星期?, "星期?, "星期?, "星期?, "星期?, "星期?] as x><br /> ${x_index + 1}.${x}<#if x_has_next>,</if><br /> <#if x="星期?><#break></#if><br /> </#list></p> <p><strong><span style="font-size: small;">4.4 include指o</span></strong></p> <p>include指o的作用类gJSP的包含指?用于包含指定?include指o的语法格式如?<br /> <#include filename [options]><br /> 在上面的语法格式?两个参数的解释如?<br /> filename:该参数指定被包含的模板文?br /> options:该参数可以省?指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含面时所用的解码?而parse指定被包含文件是否作为FTL文g来解?如果省略了parse选项?则该选项默认是true.</p> <p><strong><span style="font-size: small;">4.5 import指o</span></strong></p> <p>该指令用于导入FreeMarker模板中的所有变?q将该变量放|在指定的Map对象?import指o的语法格式如?<br /> <#import "/lib/common.ftl" as com><br /> 上面的代码将导入/lib/common.ftl模板文g中的所有变?交将q些变量攄在一个名为com的Map对象?</p> <p><strong><span style="font-size: small;">4.6 noparse指o</span></strong></p> <p>noparse指o指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下:<br /> <#noparse>...</#noparse></p> <p>看如下的例子:<br /> <#noparse><br /> <#list books as book><br />    <tr><td>${book.name}<td>作?${book.author}<br /> </#list><br /> </#noparse><br /> 输出如下:<br /> <#list books as book><br />    <tr><td>${book.name}<td>作?${book.author}<br /> </#list></p> <p><strong><span style="font-size: small;">4.7 escape , noescape指o</span></strong></p> <p>escape指oDbody区的插值都会被自动加上escape表达?但不会媄响字W串内的插?只会影响到body内出现的插?使用escape指o的语法格式如?<br /> <#escape identifier as expression>...<br /> <#noescape>...</#noescape><br /> </#escape></p> <p>看如下的代码:<br /> <#escape x as x?html><br /> First name:${firstName}<br /> Last name:${lastName}<br /> Maiden name:${maidenName}<br /> </#escape><br /> 上面的代码等同于:<br /> First name:${firstName?html}<br /> Last name:${lastName?html}<br /> Maiden name:${maidenName?html}</p> <p>escape指o在解析模板时起作用而不是在q行时v作用,除此之外,escape指o也嵌套?子escapel承父escape的规?如下例子:<br /> <#escape x as x?html><br /> Customer Name:${customerName}<br /> Items to ship;<br /> <#escape x as itemCodeToNameMap[x]><br />    ${itemCode1}<br />    ${itemCode2}<br />    ${itemCode3}<br />    ${itemCode4}<br /> </#escape><br /> </#escape><br /> 上面的代码类g:<br /> Customer Name:${customerName?html}<br /> Items to ship;<br /> ${itemCodeToNameMap[itemCode1]?html}<br /> ${itemCodeToNameMap[itemCode2]?html}<br /> ${itemCodeToNameMap[itemCode3]?html}<br /> ${itemCodeToNameMap[itemCode4]?html}</p> <p>对于攑֜escape指o中所有的插D言,q此插值将被自动加上escape表达?如果需要指定escape指o中某些插值无需descape表达?则应该用noescape指o,攑֜noescape指o中的插值将不会descape表达?</p> <p><strong><span style="font-size: small;">4.8 assign指o</span></strong></p> <p>assign指o在前面已l用了多次,它用于ؓ该模杉K面创建或替换一个顶层变?assign指o的用法有多种,包含创徏或替换一个顶层变?或者创建或替换多个变量{?它的最单的语法如下:<#assign name=value [in namespacehash]>,q个用法用于指定一个名为name的变?该变量的gؓvalue,此外,FreeMarker允许在用assign指o里增加in子句,in子句用于创建的name变量攑օnamespacehash命名I间?</p> <p>assign指oq有如下用法:<#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]>,q个语法可以同时创徏或替换多个顶层变?此外,q有一U复杂的用法,如果需要创建或替换的变量值是一个复杂的表达?则可以用如下语法格?<#assign name [in namespacehash]>capture this</#assign>,在这个语法中,是指assign指o的内容赋值给name变量.如下例子:<br /> <#assign x><br /> <#list ["星期一", "星期?, "星期?, "星期?, "星期?, "星期?, "星期?] as n><br /> ${n}<br /> </#list><br /> </#assign><br /> ${x}<br /> 上面的代码将产生如下输出:星期一 星期?星期?星期?星期?星期?星期?/p> <p>虽然assign指定了这U复杂变量值的用法,但是我们也不要滥用这U用?如下例子:<#assign x>Hello ${user}!</#assign>,以上代码改ؓ如下写法更合?<#assign x="Hello ${user}!"></p> <p><strong><span style="font-size: small;">4.9 setting指o</span></strong></p> <p>该指令用于设|FreeMarker的运行环?该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取D围包含如下几?<br /> locale:该选项指定该模板所用的国家/语言选项<br /> number_format:指定格式化输出数字的格式<br /> boolean_format:指定两个布尔值的语法格式,默认值是true,false<br /> date_format,time_format,datetime_format:指定格式化输出日期的格式<br /> time_zone:讄格式化输出日期时所使用的时?/p> <p><strong><span style="font-size: small;">4.10 macro , nested , return指o</span></strong></p> <p>macro可以用于实现自定义指?通过使用自定义指?可以一D|板片D定义成一个用h?使用macro指o的语法格式如?<br /> <#macro name param1 param2 ... paramN><br /> ...<br /> <#nested loopvar1, loopvar2, ..., loopvarN><br /> ...<br /> <#return><br /> ...<br /> </#macro><br /> 在上面的格式片段?包含了如下几个部?<br /> name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数<br /> paramX:该属性就是指定用自定义指o时报参数,使用该自定义指o?必须些参C入?br /> nested指o:nested标签输出使用自定义指令时的中间部?br /> nested指o中的循环变量:q此循环变量由macro定义部分指定,传给使用标签的模?br /> return指o:该指令可用于随时l束该自定义指o.</p> <p>看如下的例子:<br /> <#macro book>   //定义一个自定义指o<br /> j2ee<br /> </#macro><br /> <@book />    //使用刚才定义的指?br /> 上面的代码输出结果ؓ:j2ee</p> <p>在上面的代码?可能很难看出自定义标{用处,因ؓ我们定义的book指o所包含的内定w常简?实际?自定义标{֏包含非常多的内容,从而可以实现更好的代码复用.此外,q可以在定义自定义指令时,定义指o指定参数,看如下代?<br /> <#macro book booklist>     //定义一个自定义指obooklist是参?br /> <#list booklist as book><br />    ${book}<br /> </#list><br /> </#macro><br /> <@book booklist=["spring","j2ee"] />   //使用刚刚定义的指?br /> 上面的代码ؓbook指o传入了一个参数?上面的代码的输出l果?spring j2ee</p> <p>不仅如此,q可以在自定义指令时使用nested指o来输定义指o的中间部?看如下例?<br /> <#macro page title><br /> <html><br /> <head><br />    <title>FreeMarkerCZ面 - ${title?html}</title><br /> </head><br /> <body><br />    <h1>${title?html}</h1><br />    <#nested>      //用于引入用户自定义指令的标签?br /> </body><br /> </html><br /> </#macro><br /> 上面的代码将一个HTML面模板定义成一个page指o,则可以在其他面中如此page指o:<br /> <#import "/common.ftl" as com>     //假设上面的模杉K面名为common.ftl,导入面<br /> <@com.page title="book list"><br /> <u1><br /> <li>spring</li><br /> <li>j2ee</li><br /> </ul><br /> <<a>/@com.page</a>></p> <p>从上面的例子可以看出,使用macro和nested指o可以非常Ҏ地实现页面装饰效?此外,q可以在使用nested指o?指定一个或多个循环变量,看如下代?<br /> <#macro book><br /> <#nested 1>      //使用book指o时指定了一个@环变量?br /> <#nested 2><br /> </#macro><br /> <@book ;x> ${x} .图书<<a>/@book</a>><br /> 当用nested指o传入变量值时,在用该自定义指令时,需要用一个占位符(如book指o后的;x).上面的代码输出文本如?<br /> 1 .图书    2 .图书</p> <p>在nested指o中用@环变量时,可以使用多个循环变量,看如下代?<br /> <#macro repeat count><br /> <#list 1..count as x>     //使用nested指o时指定了三个循环变量<br />    <#nested x, x/2, x==count><br /> </#list><br /> </#macro><br /> <@repeat count=4 ; c halfc last><br /> ${c}. ${halfc}<#if last> Last! </#if><br /> <<a>/@repeat</a>><br /> 上面的输出结果ؓ:<br /> 1. 0.5   2. 1   3. 1.5   4. 2 Last;</p> <p>return指o用于l束macro指o,一旦在macro指o中执行了return指o,则FreeMarker不会l箋处理macro指o里的内容,看如下代?<br /> <#macro book><br /> spring<br /> <#return><br /> j2ee<br /> </#macro><br /> <@book /><br /> 上面的代码输?spring,而j2ee位于return指o之后,不会输出.</p> </div> <img src ="http://www.tkk7.com/jzone/aggbug/284300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jzone/" target="_blank">Gavin.lee</a> 2009-06-26 15:59 <a href="http://www.tkk7.com/jzone/articles/284300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://yjszhukao.com" target="_blank">պɬɬҹ˽ӰԺ</a>| <a href="http://hmjx-tape.com" target="_blank">һ߲ѹۿİƵ </a>| <a href="http://6789311.com" target="_blank">һ</a>| <a href="http://zengzeyu.com" target="_blank">ձҹѸƵ</a>| <a href="http://s88s88.com" target="_blank">AVĻ</a>| <a href="http://chuguo65.com" target="_blank">ëɫëƬѹۿ</a>| <a href="http://516kd.com" target="_blank">һɫþۺ޾Ʒ</a>| <a href="http://zz1965.com" target="_blank">ֳִִֺƵ </a>| <a href="http://hsewx.com" target="_blank">һӰԺ</a>| <a href="http://ebuy668.com" target="_blank">ĻһƵ</a>| <a href="http://nit8.com" target="_blank">Ļ޾Ʒ</a>| <a href="http://chuguo65.com" target="_blank">Դ߹ۿ</a>| <a href="http://www-175345.com" target="_blank">avר߲</a>| <a href="http://yinyinai155.com" target="_blank">99þþùƷţţĴ</a>| <a href="http://zp0533.com" target="_blank">޾Ʒ˳ɵӰ</a>| <a href="http://xmmn77.com" target="_blank">ɫƵվ</a>| <a href="http://7788xxx.com" target="_blank">avר</a>| <a href="http://010youhua.com" target="_blank">߹ۿ</a>| <a href="http://gxshenquan.com" target="_blank">ƷһƵ߹ۿ </a>| <a href="http://hbqueena.com" target="_blank">ޱ龫Ʒһ</a>| <a href="http://52099jy.com" target="_blank">ձһ</a>| <a href="http://cc19123.com" target="_blank">ĻMVƵ3</a>| <a href="http://137499.com" target="_blank">޹Ʒһ</a>| <a href="http://jiujiujingpin.com" target="_blank">㽶žžþþƷ</a>| <a href="http://juytv.com" target="_blank">ŮվƵ</a>| <a href="http://8mav1007.com" target="_blank">޾Ʒպ?V </a>| <a href="http://ksyanhui.com" target="_blank">Ҹ</a>| <a href="http://www97544.com" target="_blank">avþþƷ</a>| <a href="http://mt181.com" target="_blank">һ234޿Ƶ һ3Ŀ </a>| <a href="http://tv886.com" target="_blank">պƷƵ</a>| <a href="http://cqtchtwq.com" target="_blank">˳ۺ߲</a>| <a href="http://61255555.com" target="_blank">ѹ˸Ƶվ</a>| <a href="http://www-095666.com" target="_blank">߲91</a>| <a href="http://653349.com" target="_blank">һ91</a>| <a href="http://juguanghr.com" target="_blank">һ</a>| <a href="http://tedegold.com" target="_blank">ѸƵ</a>| <a href="http://ytsp88.com" target="_blank">ɫ¸avվ</a>| <a href="http://0101av.com" target="_blank">˾Ʒvideos</a>| <a href="http://8833655.com" target="_blank">վ߹ۿ</a>| <a href="http://yctbhb.com" target="_blank">Ļ߹ۿƬ</a>| <a href="http://868664.com" target="_blank">޵һվ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>