在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"/>
Global site tag (gtag.js) - Google Analytics