020_程序方法
1. 方法變量在存于實現了TemplateMethodModel接口的模板中。這個接口包含一個方法: TemplateModel exec(java.util.List arguments)。
2. 當使用FTL方法調用表達式時, exec方法將會被調用。形參將會包含FTL方法調用形參的值。exec方法的返回值給出了FTL方法調用表達式的返回值。
3. TemplateMethodModelEx接口擴展了TemplateMethodModel接口。它沒有添加任何新方法。事實上這個對象實現這個標記接口是給FTL引擎暗示, 形式參數應該直接以TemplateModel的形式放進java.util.List。否則將會以String形式放入list。
4. 例子
4.1. 新建一個名為FMProgrammingMethod的動態Web工程, 同時添加相關jar包。
4.2. 編寫FMFactory.java
package com.fm.util;import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import freemarker.template.Configuration; import freemarker.template.TemplateExceptionHandler;public class FMFactory {private final static FMFactory instance = new FMFactory();private FMFactory() {}public static FMFactory getInstance() {return instance;}private Map<String, Configuration> map = new ConcurrentHashMap<String, Configuration>();// 創建單個Configuration實例public synchronized Configuration getCfg(Object servletContext, String path) {if(null != map.get(path)) {return map.get(path);}Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);cfg.setServletContextForTemplateLoading(servletContext, path);cfg.setDefaultEncoding("utf-8");cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);map.put(path, cfg);return cfg;}}4.3. 編寫IndexOfMethod.java
package com.fm.action;import java.util.List; import freemarker.template.SimpleNumber; import freemarker.template.SimpleScalar; import freemarker.template.TemplateMethodModelEx; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException;/*** 返回第一個字符串在第二個字符串第一次出現時的索引位置, 如果第二個字符串中不包含第一個字符串, 則返回-1。*/ public class IndexOfMethod implements TemplateMethodModelEx {public TemplateModel exec(List args) throws TemplateModelException {if (args.size() != 2) {throw new TemplateModelException("Wrong arguments");}return new SimpleNumber(((SimpleScalar) args.get(1)).getAsString().indexOf(((SimpleScalar) args.get(0)).getAsString()));} }4.4. 編寫ProgrammingMethod.java
package com.fm.action;import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.fm.util.FMFactory; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;public class ProgrammingMethod extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Configuration cfg = FMFactory.getInstance().getCfg(req.getServletContext(), "/WEB-INF/templates");Template template = cfg.getTemplate("programmingmethod.html");Map<String, Object> root = new HashMap<String, Object>();root.put("indexOf", new IndexOfMethod());Writer out = new OutputStreamWriter(resp.getOutputStream());try {template.process(root, out);} catch (TemplateException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }4.5. 修改web.xml
4.6. 在/WEB-INF/templates目錄下編寫programmingmethod.html
<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>程序方法</title></head><body><h2>返回第一個字符串在第二個字符串第一次出現時的索引位置</h2>"met"在"something"第${indexOf("met", "something")}個位置<br /><#assign idx = indexOf("foo", "something") /><#if idx == -1>"foo"在"something"中沒有找到。<#else>"foo"在"something"第${idx}個位置</#if></body> </html>4.7. 運行項目
?
總結