1、实现自定义FreemarkerManager

 
  
  1. import freemarker.template.Configuration; 
  2. import freemarker.template.TemplateDirectiveModel; 
  3. import freemarker.template.TemplateException; 
  4. import org.apache.struts2.views.freemarker.FreemarkerManager; 
  5. import org.springframework.context.ApplicationContext; 
  6. import org.springframework.web.context.support.WebApplicationContextUtils; 
  7.  
  8. import javax.servlet.ServletContext; 
  9. import java.util.Map; 
  10.  
  11. /** 
  12.  * @author: jetyou@foxmail.com 
  13.  * @date: 2011-8-22 
  14.  * @time: 16:53:43 
  15.  * @desc: 增加自定义业务标签,此list中的string必须继承于TemplateDirectiveModel,并且配置在SPRING上下文中 
  16.  */ 
  17. public class CustomFreemarkerManager extends FreemarkerManager { 
  18.  
  19.     protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException { 
  20.         Configuration cfg = super.createConfiguration(servletContext); 
  21.        ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 
  22.        Map<String,Object> beans=(Map<String,Object>)ctx.getBeansOfType(TemplateDirectiveModel.class); 
  23.         for (String key : beans.keySet()) { 
  24.             Object bean = beans.get(key); 
  25.             if (bean != null && bean instanceof TemplateDirectiveModel) 
  26.                 cfg.setSharedVariable(key, bean); 
  27.         } 
  28.         return cfg; 
  29.     } 
  30.  
  31.  

 2、在struts.properties中配置你的自定义管理类

 
  
  1. struts.freemarker.manager.classname=com.kms.framework.core.view.support.KmsFreemarkerManager 

 3、自定义TemplateDirectiveModel

 

 
  
  1. import static freemarker.template.ObjectWrapper.DEFAULT_WRAPPER;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Map.Entry;  
  9.   
  10. import javax.servlet.http.HttpSession;  
  11.   
  12. import org.apache.struts2.ServletActionContext;  
  13.   
  14. import com.newyulong.bcp.product.domain.TypeInfo;  
  15. import com.newyulong.bcp.product.service.ITypeService;  
  16. import com.newyulong.bcp.user.vo.Loginer;  
  17.   
  18. import freemarker.core.Environment;  
  19. import freemarker.template.TemplateDirectiveBody;  
  20. import freemarker.template.TemplateDirectiveModel;  
  21. import freemarker.template.TemplateException;  
  22. import freemarker.template.TemplateModel;  
  23. import freemarker.template.TemplateModelException;  
  24. import freemarker.template.TemplateNumberModel;  
  25.   
  26. /**  
  27.  * @author: jetyou@foxmail.com  
  28.  * @date: 2011-9-19  
  29.  * @time: 9:55:05  
  30.  * @desc: 产品类别自定义标签  
  31.  */  
  32. public class ProductTypeTemplateDirectiveModel implements TemplateDirectiveModel {  
  33.     //产品分类服务 
  34.     private ITypeService typeService;  
  35.     // 展示产品类别数目  
  36.     private static final String PARAM_COUNT = "count";  
  37.   
  38.   
  39.     // 默认  
  40.     private static final int DEAFAULT_COUNT = 5;  
  41.   
  42.   
  43.   
  44.     public void execute(Environment environment, Map map,  
  45.             TemplateModel[] templateModels, TemplateDirectiveBody body)  
  46.             throws TemplateException, IOException {  
  47.         int count = 0hot = 0;  
  48.         boolean countParamSet = false;  
  49.         // 获取传递进来的参数  
  50.         Iterator it = map.entrySet().iterator();  
  51.         while (it.hasNext()) {  
  52.             Map.Entry entry = (Entry) it.next();  
  53.             String paramName = entry.getKey().toString();  
  54.             TemplateModel paramValue = (TemplateModel) entry.getValue();  
  55.             if (paramName.equals(PARAM_COUNT)) {  
  56.                 if (!(paramValue instanceof TemplateNumberModel)) {  
  57.                     throw new TemplateModelException("The \"" + PARAM_COUNT  
  58.                             + "\" parameter " + "must be a number.");  
  59.                 }  
  60.                 count = ((TemplateNumberModel) paramValue).getAsNumber()  
  61.                         .intValue();  
  62.                 countParamSet = true;  
  63.                 if (count < 0) {  
  64.                     throw new TemplateModelException("The \"" + PARAM_COUNT  
  65.                             + "\" parameter " + "can't be negative.");  
  66.                 }  
  67.             } else {  
  68.                 throw new TemplateModelException("Unsupported parameter: "  
  69.                         + paramName);  
  70.             }  
  71.   
  72.         }  
  73.         // 参数为空时候设置默认值  
  74.         if (!countParamSet)  
  75.             count = DEAFAULT_COUNT;  
  76.            
  77.   
  78.         Map<String, Object> maps = getTypeList(String.valueOf(count));  
  79.   
  80.         if (body != null) {  
  81.   
  82.             environment.setVariable("typelist",  
  83.                     DEFAULT_WRAPPER.wrap(maps.get("typeList")));  
  84.             // 真正开始处理输出内容  
  85.             body.render(environment.getOut());  
  86.         } else {  
  87.             throw new RuntimeException("missing body");  
  88.         }  
  89.     }  
  90.   
  91.     /**  
  92.      *   
  93.      * @function 产品类别查询列表  
  94.      * @param count  
  95.      * @param hot  
  96.      * @return  
  97.      *   
  98.      */  
  99.     public Map<String, Object> getTypeList(String count) {  
  100.         Map<String, Object> maps = new HashMap<String, Object>();  
  101.         // 1.获取产品列表  
  102.         List<TypeInfo> list = typeService.getPreTypeList(count);  
  103.         maps.put("typeList", list);  
  104.         return maps;  
  105.   
  106.     }  
  107.     // 获得用户信息 
  108.     private Loginer getLoginer() {  
  109.         HttpSession session = ServletActionContext.getRequest().getSession();  
  110.         return (Loginer) session.getAttribute(Loginer.USER_IN_SESSION);  
  111.     }  
  112.   
  113.     public void setTypeService(ITypeService typeService) {  
  114.         this.typeService = typeService;  
  115.     }