在Freemarker模板中能定义方法吗?
hacxer
2012-08-21
在Freemarker模板中能定义方法吗?,我看网上的在Java文件中自定义后,需要
在root中添加就可以直接在模板中调用: root.put("upper", new com.example.UpperDirective()); 也可如下方法初始化后也同样可以在模板中调用: 请问这个代码写在哪里? 先说明,我们是使用freemarker+fmpp做代码生成器,没有跟框架集合,不需要依赖tomcat运行! |
|
jun_fx
2012-08-22
可以的。我使用的是spring管理freemaker,故给你贴下我的代码:
自定义Freemarker函数描述 url重写规则 /** * <@urlRW g=base+"goods" a="goods" m="getGoodsContent" p="id=1905&street=GROUPBUY_STREET"/> * * * 重写URL地址的拼写 * @author chengjun * */ public class ReWriteDirective implements TemplateDirectiveModel { //也可以 implements freemarker.template.TemplateMethodModel; /**空间分组*/ public static final String namespace = "g"; /**action名字*/ public static final String action = "a"; /**action方法*/ public static final String method = "m"; /**参数*/ public static final String param = "p"; public static final String rewrite_html = "html"; public static final String rewrite_action = "action"; public void execute(Environment env, Map map, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { String g = TemplateUtil.parseToString(namespace, map); String a = TemplateUtil.parseToString(action , map); String m = TemplateUtil.parseToString(method , map); String p = TemplateUtil.parseToString(param , map); StringBuffer sb = new StringBuffer(); //重写 if(StringUtils.equalsIgnoreCase(rewrite_html, SettingConfig.getRewrite())){ if(StringUtils.isNotBlank(g)) sb.append("/").append(g); if(StringUtils.isNotBlank(a)) sb.append(a); if(StringUtils.isNotBlank(m)) sb.append("_").append(m); sb.append(".").append(rewrite_html); }//原样输出 else{ if(StringUtils.isNotBlank(g)) sb.append("/").append(g); if(StringUtils.isNotBlank(a)) sb.append("/").append(a); if(StringUtils.isNotBlank(m)) sb.append("!").append(m); sb.append(".").append(rewrite_action); } if(StringUtils.isNotBlank(p)){ if(StringUtils.startsWith("?", p)){ sb.append(p); }else{ sb.append("?").append(p); } } Writer writer = env.getOut(); writer.write(sb.toString()); } } 这里还可以实现import freemarker.template.TemplateMethodModel。 <bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean"> <property name="templateLoaderPaths" > <list> <value>classpath:/email</value> <value>WEB-INF/template</value> </list> </property> <property name="freemarkerVariables"> <map> <entry key="urlRW" value-ref="urlRWSpringId"/> </map> </property> </bean> <bean id="urlRWSpringId" class="[b]ReWriteDirective [/b]" /> 然后在页面上就可以使用 <@urlRW g=base+"goods" a="goods" m="getGoodsContent" p="1=1&2=2"/> |