1. 模板文件 test303.ftl
<#assign x = >
${indexOf(, x)}
${indexOf(, x)}
2. 自定义方法 IndexOfMethod.java
ps: 返回第一个字符串在第二个字符串第一次出现时的索引位置,如果第二个字符串中不包含第一个字符串。
package com.freemarker.test03.Method;
import java.util.List;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
public class IndexOfMethod implements TemplateMethodModelEx {
@Override
public Object exec(List args) throws TemplateModelException {
String s1 = "";
String s2 = "";
if (args.size() != 2) {
throw new TemplateModelException(
"Error: Expecting 2 string arguments here");
}
try {
TemplateScalarModel tsm = (TemplateScalarModel) args.get(0);
s1 = tsm.getAsString();
TemplateScalarModel tsm2 = (TemplateScalarModel) args.get(1);
s2 = tsm2.getAsString();
} catch (ClassCastException cce) {
String mess = "Error: Expecting string argument here";
throw new TemplateModelException(mess);
}
return new SimpleScalar(getStrPosition(s1, s2));
}
/**
*
* deception: 返回第一个字符串在第二个字符串第一次出现时的索引位置, 如果第二个字符串中不包含第一个字符串,则返回“-1”
* function: author:hsl data:Jul 13, 2015
*
* @param s1
* @param s2
* @return String
*/
private String getStrPosition(String s1, String s2) {
return String.valueOf(s2.indexOf(s1));
}
}
3. 测试类文件 Test.java
package com.freemarker.test03.Method;
import freemarker.template.*;
import java.util.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
cfg.setDirectoryForTemplateLoading(new File("templates"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Map root = new HashMap();
root.put("indexOf", new IndexOfMethod());
Template temp = cfg.getTemplate("test03.ftl");
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
out.close();
}
}
运行结果
2
-1