`
蔡华江
  • 浏览: 106110 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Freemarker无法使用Session和Taglib

    博客分类:
  • JAVA
阅读更多

Freemarker中取Session中对象出现Expression Session is undefined异常,

还有在模板中无法使用jsp标签,出现Expression JspTaglibs is undefined异常。

 

其实两个原因是相同的,都是在ftl模板中没有找到对应的对象Session或 JspTaglibs ,通常我们使用freemarker有三种手段。

其一,是通过使用freemarker.ext.servlet.FreemarkerServlet。在web.xml中配置freemarkerServlet就可以通过*.ftl直接访问指定路径的freemarker模板,并生成对应的文件/流进行输出。我认为这种方式最简便的一种,然而其中生成的文件被限定为html或xml文件,编码之类都被统一处理,对于不同输出要进行多次配置。

第二种方式是使用页面框架,这些页面框架都是调用freemarker配置使用模板进行输出,最大好处是与现有框架集成,可以使用页面框架的一些特性,并且可以进行一定程序定制,如指定文件类型和编码等。

第三种方式是手动进行封装,直接调用配置使用模板生成指定的内容。其有个好处,是可以进行定制,如文件类型和编码都可以进行指定的配置,并且更多人是使用模板生成指定文件进行页面静态化,程序员通过将后台信息使用freemarker生成静态文件,再由用户进行调用。

 

通常前两种方式对一些数据对象封装使得使用模板时能进行调用,可以满足用户需求。而开始列出的两个错误通常出现在手工进行封装的时候。举代码为例:

    public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){
        Configuration freemarkerCfg = new Configuration();
        //加载模版
        freemarkerCfg.setServletContextForTemplateLoading(context, "/");
        freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
        try {
            //指定模版路径
            Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");
            template.setEncoding("UTF-8");
            //静态页面路径
            String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;
            File htmlFile = new File(htmlPath);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
            //处理模版  
            template.process(data, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 在以上代码中,就会出现问题,直接调用template进行输出时,并没有封装Session,JspTaglibs等对象,所以会报找不到对应对象的错误,也就不能使用Jsp标签了。

可以改为:

	public static void crateHTML(HttpServletRequest request, Map data,
			String templatePath, String targetHtmlPath) {
		Configuration freemarkerCfg = new Configuration();
		// 加载模版
		freemarkerCfg.setServletContextForTemplateLoading(request.getSession()
				.getServletContext(), "/");
		freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
		try {
			// 指定模版路径
			Template template = freemarkerCfg
					.getTemplate(templatePath, "UTF-8");
			template.setEncoding("UTF-8");
			// 静态页面路径
			String htmlPath = request.getSession().getServletContext()
					.getRealPath("/html")
					+ "/" + targetHtmlPath;
			File htmlFile = new File(htmlPath);
			Writer out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(htmlFile), "UTF-8"));
			// 处理模版

			data.put("Request", request);
			data.put("Session", request.getSession());
			data.put("JspTaglibs", new TaglibFactory(request.getSession()
					.getServletContext()));
			
			template.process(data, out);
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 这时,在ftl模板中就可以调用Request,Session,JspTaglibs等对象了。

 

注:在Struts2中封装的Freemarker视图也不能在ftl模板中使用JspTaglibs对象,可能通过在web.xml文件中配置:

	<servlet>
		<servlet-name>JSPSupportServlet</servlet-name>
		<servlet-class>
			org.apache.struts2.views.JspSupportServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

 这时,在ftl模板中可以使用Jsp标签了。

分享到:
评论
4 楼 Seanman 2015-03-09  
cuiyan3327 写道
你好,看了您的帖子,非常好!
我也正在使用freemarker,并且按你文章的方法进行了配置,JspTaglibs不报:Expression JspTaglibs is undefined这个错误了,但是还是报了以下异常
异常信息:
Could not find an instance of freemarker.ext.servlet.ServletContextHashModel in the data model under either the name __FreeMarkerServlet.Application__ or Application
能否帮我看看是什么原因么?

解决了么
3 楼 Seanman 2015-03-09  
Could not find an instance of freemarker.ext.servlet.ServletContextHashModel in the data model under either the name __FreeMarkerServlet.Application__ or Application
2 楼 zhfally520 2013-04-03  
感谢楼主啊,解决了Expression JspTaglibs is undefined的错误
1 楼 cuiyan3327 2010-04-30  
你好,看了您的帖子,非常好!
我也正在使用freemarker,并且按你文章的方法进行了配置,JspTaglibs不报:Expression JspTaglibs is undefined这个错误了,但是还是报了以下异常
异常信息:
Could not find an instance of freemarker.ext.servlet.ServletContextHashModel in the data model under either the name __FreeMarkerServlet.Application__ or Application
能否帮我看看是什么原因么?

相关推荐

    FreeMarker(使用方法)

    FreeMarker(使用方法)FreeMarker(使用方法)FreeMarker(使用方法)FreeMarker(使用方法)很好的pdf书

    freemarker 教程 使用手册

    freemarker 教程 使用手册 Freemarker 手册 用于 2.3.16

    freemarker常用使用文档

    freemarker常用使用文档......................................................................

    模板:velocity和freemarker的比较

    模板:velocity和freemarker的比较模板:velocity和freemarker的比较

    FreeMarker标签使用

    FreeMarker标签使用FreeMarker标签使用FreeMarker标签使用FreeMarker标签使用

    Velocity 和 FreeMarker区别

    Velocity 和 FreeMarker区别 对于大部分的应用来说,使用 FreeMarker 比 Velocity 更简单,因为 Velocity 还必须编写一些自定义的

    FreeMarker 使用

    使用 Freemarker 模板引擎创建一个简单的 Spring 工程。

    FreeMarker使用介绍

    FreeMarker使用介绍 FreeMarker使用介绍

    Freemarker使用指南_中文版文档

    FreeMarker 是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker 与 Web 容器无关,即在Web运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java ...

    FreeMarker使用Macro实例

    FreeMarker使用Macro实例,很好的学习资料。

    Struts2 和freemarker实例

    Struts2 和freemarker实例 简单STRUTS2的使用,和freeMarker的使用

    freemarker的jar包和代码

    关于freemarker的jar包和代码例子

    freemarker

    在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的. 1,开始标签:&lt;#directivename parameter&gt; 2,结束标签:&lt;/#directivename&gt; 3,空标签:&lt;#directivename parameter/&gt; 实际...

    freemarker-2.3.31-API文档-中文版.zip

    赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    freemarker-2.3.30-API文档-中文版.zip

    赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Freemarker2.3.16_带简单教程

    Freemarker Freemarker2 Freemarker2.3 Freemarker2.3.16 Freemarker教程 下载 _ 带简单教程

    Freemarker使用手册、api、中文版教程

     Reference(FreeMarker 的参考文档,语言使用介绍) 中文翻译之所以选择 Programmer's Guide 是因为个人觉得该部分对如何实现 FreeMarker 进行了比较深入的阐述。有助于读者很好的了解其运作机制,以及去理解...

    freemarker Demo 适用于freemarker初学

    freemarker的使用Demo,非常适用于freemarker初学,可与struts2结合使用。

    超强freemarker使用总结,有示例有讲解,可做快速查询手册!!

    在开发web项目的时候使用到的页面展现技术,它并...总体,该文档能够提供所有常用的freemarker操作,示例和简略的讲解可以让人一下子就能上手,效率极高。 适合做快速查阅册子,同时也非常适合初学者和骨灰开发者使用。

    freemarker语法

    freemarker freemarker freemarker freemarker freemarker freemarker freemarker freemarker

Global site tag (gtag.js) - Google Analytics