今天项目中要用到自定义标签,发现下面的问题
1 .freemarker里面获取HttpServletRequest没有办法获取,最后还是通过spring的一个listener解决的
在web.xml里面添加下面的配置:
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>
java代码通过下面方式获取request:
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = attr.getRequest();
2. 标签必须有空格,否则body为空,如下:
页面中的写法:
<@head> </@head>
中间必须有一个空格,否则body就为空
@Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { Writer out = env.getOut(); String locale = this.getParam(params, "locale"); if(StringUtils.isBlank(locale)){ locale = resolveLocale(); } String template = TemplateFactory.generateHtmlFromFtl(getTempateName(), locale, specificMap(params)); out.write(template); if (body != null) { body.render(env.getOut()); } else { throw new RuntimeException("标签内部至少要加一个空格"); } }
3. 在freemarker的标签里面无法定义像jsptag那样那些参数是必填项,那些是非必填项,也就意味着所有的参数都必须做好default处理,比如下面的:
Writer out = env.getOut(); String locale = this.getParam(params, "locale"); if(StringUtils.isBlank(locale)){ locale = resolveLocale(); }
无法定义locale是必须得,这样在页面渲染的时候像jsptag那样就报错。
最后分享下我的TemplateFactory,可以直接用奥。
import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class TemplateFactory { // 日志记录对象 private final static Logger log = LoggerFactory.getLogger(TemplateFactory.class); // 模板文件路径 private final static String templatePath = "/config/template"; // 模板文件内容编码 private final static String ENCODING = "utf-8"; private final static String SUFFIX = ".ftl"; // 模板生成配置 private static Configuration conf = new Configuration(); // 邮件模板缓存池 private static Map<String, Template> tempMap = new HashMap<String, Template>(); static { // 设置模板文件路径 conf.setClassForTemplateLoading(TemplateFactory.class, templatePath); conf.setDefaultEncoding(ENCODING); } /** * 通过模板文件名称获取指定模板 * * @Date:2014年4月26日 下午3:09:05 * @author * @param name * 模板文件名称 * @return Template 模板对象 * @throws IOException * @Description: * @return Template */ private static Template getTemplateByName(String name,String locale) throws IOException { name = name + "_" + locale + SUFFIX; if (tempMap.containsKey(name)) { log.debug("the template is already exist in the map,template name :" + name); // 缓存中有该模板直接返回 return tempMap.get(name); } // 缓存中没有该模板时,生成新模板并放入缓存中 Template temp = conf.getTemplate(name); tempMap.put(name, temp); log.debug("the template is not found in the map,template name :" + name); return temp; } /** * 根据指定模板将内容输出到控制台 * * @Date:2014年4月26日 下午3:14:18 * @author * @param name * 模板文件名称 * @param map * 与模板内容转换对象 * @Description: * @return void */ public static void outputToConsole(String name,String locale,Map<String, String> map) { try { // 通过Template可以将模板文件输出到相应的流 Template temp = getTemplateByName(name,locale); temp.setEncoding(ENCODING); temp.process(map, new PrintWriter(System.out)); } catch (TemplateException e) { log.error(e.toString(), e); } catch (IOException e) { log.error(e.toString(), e); } } /** * * @Date:2014年4月26日 下午3:24:37 * @author * @param name * 模板文件的名称 * @param map * 与模板内容转换对象 * @return * @throws IOException * @throws TemplateException * @Description: * @return String */ public static String generateHtmlFromFtl(String name,String locale, Map<String, String> map) throws IOException, TemplateException { Writer out = new StringWriter(2048); Template temp = getTemplateByName(name,locale); temp.setEncoding(ENCODING); temp.process(map, out); return out.toString(); } }
相关推荐
里面 集合了 一个 简单的 Freemarker demo 代码 和一个 freemarker 自定义标签代码
spring mvc freemarker 自定义标签demo spring mvc 通过自定义的标签在jsp页面调用,初学,记录下做个备忘
NULL 博文链接:https://zhenghuazhi.iteye.com/blog/1923544
NULL 博文链接:https://renxin-327666062-qq-com.iteye.com/blog/1532731
在jfinal的基础上,实现freemarker自定义标签的自动扫描和注册,本资源包不含jfinal框架,需在已有框架的基础上添加包中的代码,如需jfinal框架请自行到官网下载
一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx
NULL 博文链接:https://asialee.iteye.com/blog/2062313
springMVC3.2+Hibernate4+freemarker 代码框架采用springMVC3.2.4+hibernate4.2.8+freemarker2.3.16 功能方面只是一个简单的注册登录,前台使用freemarker渲染,使用了freemarker自定义标签。
freemarker文档两个,有助于理解和学习freemarker。jeecms标签文档能够帮助你理解模板总的自定义标签。更加方便学习
jsp,jstl,freemarker
主要介绍了spring-boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面,需要的朋友可以参考下
freemarker实现自动补...通过ftl模版文件(ftl文件为freemarker模版文件)的自定义标签实现自动补齐字符串。代码稍作修改便可左补齐右补齐左右补齐,可自定义设置补齐的字符串。测试通过java文件调用ftl文件显示结果。
众所周知,struts2宣称freemarker模板中不再支持自定义标签,但如果工程UI仅用freemarker模板可以通过扩展struts标签简单实现,不是采用官方不推荐的配置JspSupportServlet实现的!内付详细说明及范例,此方法仅为团队...
Freemarker页面语法 A 概念 最常用的 3 个概念 sequence 序列,对应java 里的list 、数组等非键值对的集合 hash 键值对的集合 namespace 对一个ftl 文件的引用, 利用这个名字可以访问到该ftl 文件的资源 ...
Java根据word 模板,生成自定义内容的word 文件案列使用的工具文件
springMVC+freemarker 简单的整合加自定义标签
因为现在一般都用strut2,为了有很好的通用性,首先想到的自然是strut2的自定义标签。于是马上google一下。果然,一大堆。不过由于小弟资历浅薄,也没心思看,主要是strut2的标签本来我就觉得不大习惯,另外上个月...
强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 采用伪静态页面技术,可自定义路径结构,无需urlrewrite 轻松建设大规模网站,可通过次级域名建立子...
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......
• 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好性 • 采用伪静态结合页面缓存技术,可自定义路径结构,无需urlrewrite • 轻松建设大规模网站,可...