freemarker之调用JAVA静态方法和静态属性

本文知识来自:http://www.cnblogs.com/yqweber/p/3992513.html


首先,经过本人的测试,freemarker只能调用JAVA的Public static 方法及属性。


背景说明:框架使用的是spring+springmvc+freemarker

package com.zxsd.test.util;

import java.util.HashMap;
import java.util.Map;

public class UrlUtil {
	private static final Map urls = new HashMap();
	static {
		urls.put("Nwenzhang.css", "/css/Nwenzhang.css");
		urls.put("Guang.css", "/css/Guang.css");
		urls.put("bootstrap.min.css", "/bootstrap/css/bootstrap.min.css");
		urls.put("Nwenzhang.css", "/css/Nwenzhang.css");
	}

	public static String getUrl(String key) {
		return urls.get(key);
	}
}


调用JAVA静态方法及属性的方法有三种


第一种:

直接将类的实例通过ModelMap传递到前端

Controller中的代码:

map.put("urlUtil", new UrlUtil());

HTML页面中的代码:

<#assign name=urlUtl.getUrl("Nwenzhang.css")>${name}


第二种:
定义BaseController 如下:

package com.zxsd.test.action.base;

import org.springframework.stereotype.Controller;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModelException;

@Controller
public class BaseController {
	private final static BeansWrapper wrapper = BeansWrapper
			.getDefaultInstance();
	private final static TemplateHashModel staticModels = wrapper
			.getStaticModels();

	protected static TemplateHashModel useStaticPacker(String packname) {
		TemplateHashModel fileStatics = null;
		try {
			fileStatics = (TemplateHashModel) staticModels.get(packname);
		} catch (TemplateModelException e) {
			e.printStackTrace();
		}
		return fileStatics;
	};

}

其他controller 继承 BaseController ,需要返回静态类时候 如下:

map.put("urlUtil", useStaticPacker("com.zxsd.test.util.UrlUtil"));
在页面中调用:

${UrlUtil.getUrl("Nwenzhang.css")!}

第三种:

定义FreemarkerStaticModels.java  如下:

package com.zxsd.test.util;

import java.util.HashMap;
import java.util.Properties;
import java.util.Set;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.TemplateHashModel;
/**
 *   处理freeMarker  访问静态类静态方法
 * @author Administrator
 *
 */
public class FreemarkerStaticModels extends HashMap{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static FreemarkerStaticModels FREEMARKER_STATIC_MODELS;
    private Properties staticModels;

    private FreemarkerStaticModels(){
       
    }

    public static FreemarkerStaticModels getInstance(){
        if(FREEMARKER_STATIC_MODELS==null){
            FREEMARKER_STATIC_MODELS=new FreemarkerStaticModels();
        }
        return FREEMARKER_STATIC_MODELS;
    }
   
    public Properties getStaticModels() {
        return staticModels;
    }

    public void setStaticModels(Properties staticModels) {
        if(this.staticModels==null&&staticModels!=null){
            this.staticModels = staticModels;
            Set keys=this.staticModels.stringPropertyNames();
            for (String key : keys) {
                FREEMARKER_STATIC_MODELS.put(key, useStaticPackage(this.staticModels.getProperty(key)));
            }
        }
    }

    public static TemplateHashModel useStaticPackage(String packageName){
        try
        {
          BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
          TemplateHashModel staticModels = wrapper.getStaticModels();
          TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName);
          return fileStatics;
        }
        catch (Exception e)
        {
           e.printStackTrace(); 
        }
        return null;
    }

}

定义staticClass.properties 

UrlUtil=com.zxsd.test.util.UrlUtil
在springmvc.xml 配置文件中


    
        
    
    
    
        
    

	
		
		
		
		
		
		
		  
         	
	

最后说下三种的选择: 

第一种后端最简便,什么支持都不用,但是前端比较麻烦。

第一种和第二种是用哪些类就加入哪些类。

第三种是直接返回所有配置的类到页面。


网上还有一些其他的方法:

http://blog.csdn.net/tanguang_honesty/article/details/38554069

http://blog.csdn.net/quzishen/article/details/6044615

另外stauts中对freemarker调用JAVA方法和类有特殊的支持

http://blog.csdn.net/iamfafa/article/details/44302709

本人在这里就没有研究了。







你可能感兴趣的:(JAVA,freemarker)