`
蔡华江
  • 浏览: 107618 次
  • 性别: 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
能否帮我看看是什么原因么?

相关推荐

    从jsp到freemarker2.3.23

    在Freemarker中,我们可以通过`&lt;#assign&gt;`来模拟JSP中的`&lt;%@ taglib %&gt;`语法,但更推荐的方式是使用`&lt;#import&gt;`来引入自定义的功能。此外,还可以考虑使用Spring MVC提供的标签库来替代部分JSTL的功能。 #### 调用...

    JSTL常用标签总结

    比如,若想移除名为"username"的session范围内的变量,可以使用&lt;c:remove var="username" scope="session"/&gt;。 接下来是标签,它用于进行条件判断,根据条件的真假决定是否输出标签体中的内容。例如,如果一个...

    java web标签大全

    内置对象如request、response、session等可以直接在页面中使用,指令标签如page、include、taglib用于配置页面属性或引入自定义标签库,动作标签如jsp:include、jsp:forward用于控制页面流程。 2. JSTL(JavaServer...

    struts2的View组件,最新 PPT教程

    3. **对模板技术的支持**:Struts2不仅支持JSP,还支持FreeMarker和Velocity等模板引擎,这使得视图的创建更加灵活和高效,且与业务逻辑解耦合。 4. **EL隐含对象**:EL提供了11个隐含对象,如`param`、`session`、...

    jsp网络日记本源码

    8. **模板技术**:为了提高代码复用性和页面设计的灵活性,项目可能使用了JSP包含(jsp:include)或者第三方模板引擎(如FreeMarker、Velocity),以便于分离视图和逻辑。 9. **CSS和JavaScript**:为了提供良好的...

    J2EE考试复习试题2.pdf

    Struts 2的表单标签库在JSP页面中使用,需要引入taglib指令,如`&lt;%@ uri="/struts-tags" prefix="s"%&gt;`,并在页面中使用`s:form`标签定义表单。 校验错误信息通常通过控制器类中的`validate`方法输出。在Struts 2...

    JSP技术文档

    JSP提供了若干内置对象,如`request`、`response`、`session`、`application`、`pageContext`、`out`、`config`、`page`和`exception`。这些对象简化了与HTTP请求、响应、会话管理、应用范围内的共享数据和异常处理...

    刘树全的J2EE培训教程

    定制标签部分涉及JSTL、Apache Jarkarta Taglib和Oracle Taglib。模板技术如WebMacro、Velocity和FreeMarker用于生成动态内容。AJAX技术,如DWR,可以提升用户体验。MVC和框架部分,包括Struts、Expresso、Webwork、...

    SSH2面试试题

    5. 在JSP中使用Struts 2标签库,需要在页面头部引入taglib指令,如`&lt;%@taglib prefix="s" uri="/struts-tags"%&gt;`。 6. Struts 2的表单标签 `&lt;s:form&gt;`用于创建HTML表单,它是Struts 2表单标签库的一部分。 7. `...

    Servlet JSP Spring MVC初学指南(alin书签).pdf

    2. **JSP语法**:学习JSP指令(page, include, taglib)、脚本元素(声明、表达式、脚本let)以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的使用。 3. **Spring MVC入门**:理解...

    JSP核心技术和电子商务应用实例源代码分析

    4. **模板和布局**:为了保持一致的界面设计,可以使用自定义标签库(如JSTL的fmt和fn标签)或第三方框架(如FreeMarker、Velocity)来实现页面模板和布局。 5. **错误和异常处理**:通过设置错误页面和异常处理器...

    JAVAEE SSH分页

    在视图层,通常使用JSP或FreeMarker等模板引擎来展示分页结果。可以创建一个通用的分页标签库(TagLib),用于处理分页链接的生成,如“上一页”,“下一页”和页码列表。这些链接的生成需要结合请求参数(当前页和...

    小米电商网站源码

    7. **Session和Cookie管理**:为了维持用户的会话状态,项目可能使用了Session或Cookie技术,例如跟踪用户的购物车信息。 8. **安全机制**:一个完整的电商系统需要考虑安全性,源码可能涉及到用户认证、授权、防止...

    struts2 学习例子

    4. **自定义组件**:Struts2允许在页面中使用自定义组件,以满足复杂和多变的页面显示需求。 **Struts2标签库分类:** 1. **UI标签**:主要用于生成HTML元素,分为表单标签和非表单标签。表单标签用于处理用户输入...

    JSP网络开发技术与整合应用1

    6. 模板技术和MVC设计模式:可能会讲解如何使用JSP配合FreeMarker或Velocity等模板引擎,以及如何实现Model-View-Controller架构来组织代码。 7. 数据库连接与操作:JDBC的使用,包括连接数据库、执行SQL语句、处理...

    ssh面试题及框架集合

    3. **Spring MVC**: 类似于Struts,但提供了更灵活的MVC实现,支持更多的视图技术,如FreeMarker和Thymeleaf。 4. **事务管理**: 提供声明式和编程式的事务管理服务。 5. **数据访问集成**: 包括对JDBC、ORM(如...

    struts2面试题(个人四处搜集,吐血推荐)

    要在JSP页面中使用Struts2的标签库,需要在页面中导入标签库,使用`&lt;%@ taglib %&gt;`指令。Struts2的表单标签通常用于创建HTML表单,如`&lt;s:form&gt;`。`ActionSupport`类实现了`Action`接口和`ValidationAware`等接口,...

    企业宣传网站实例企业宣传网站实例

    同时,合理使用JSP的include指令或taglib,可以降低页面的复杂性,提高加载速度。 6. **调试与开发工具**:如压缩包中的"ZendStudio调试功能使用说明.doc"所示,使用专业IDE如Zend Studio能有效提高开发效率。它...

    JSPGenCMS3_20110918.zip.zip

    1. **用户管理**:登录、注册、权限控制等,可能使用了session和cookie进行会话管理。 2. **内容发布**:支持文章创建、编辑、删除,可能有分类、标签系统。 3. **模板引擎**:用于生成页面布局,可能采用FreeMarker...

Global site tag (gtag.js) - Google Analytics