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生成静态文件,再由用户进行调用。
通常前两种方式对一些数据对象封装使得使用模板时能进行调用,可以满足用户需求。而开始列出的两个错误通常出现在手工进行封装的时候。举代码为例:
Java代码
1.public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){
2. Configuration freemarkerCfg = new Configuration();
3. //加载模版
4. freemarkerCfg.setServletContextForTemplateLoading(context, "/");
5. freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
6. try {
7. //指定模版路径
8. Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");
9. template.setEncoding("UTF-8");
10. //静态页面路径
11. String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;
12. File htmlFile = new File(htmlPath);
13. Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
14. //处理模版
15. template.process(data, out);
16. out.flush();
17. out.close();
18. } catch (Exception e) {
19. e.printStackTrace();
20. }
21.}
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标签了。
可以改为:
Java代码
1.public static void crateHTML(HttpServletRequest request, Map data,
2. String templatePath, String targetHtmlPath) {
3. Configuration freemarkerCfg = new Configuration();
4. // 加载模版
5. freemarkerCfg.setServletContextForTemplateLoading(request.getSession()
6. .getServletContext(), "/");
7. freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
8. try {
9. // 指定模版路径
10. Template template = freemarkerCfg
11. .getTemplate(templatePath, "UTF-8");
12. template.setEncoding("UTF-8");
13. // 静态页面路径
14. String htmlPath = request.getSession().getServletContext()
15. .getRealPath("/html")
16. + "/" + targetHtmlPath;
17. File htmlFile = new File(htmlPath);
18. Writer out = new BufferedWriter(new OutputStreamWriter(
19. new FileOutputStream(htmlFile), "UTF-8"));
20. // 处理模版
21.
22. data.put("Request", request);
23. data.put("Session", request.getSession());
24. data.put("JspTaglibs", new TaglibFactory(request.getSession()
25. .getServletContext()));
26.
27. template.process(data, out);
28. out.flush();
29. out.close();
30. } catch (Exception e) {
31. e.printStackTrace();
32. }
33.}
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文件中配置:
Xml代码
1.<servlet>
2. <servlet-name>JSPSupportServlet</servlet-name>
3. <servlet-class>
4. org.apache.struts2.views.JspSupportServlet
5. </servlet-class>
6. <load-on-startup>1</load-on-startup>
7.</servlet>
<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标签了。
分享到:
相关推荐
本篇将深入探讨如何自定义FreeMarker标签,以扩展其功能并适应特定项目需求。 首先,理解FreeMarker的默认标签语法至关重要。FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件...
同时,由于默认情况下FreeMarker不支持JspTaglibs,因此还需要在`web.xml`中配置一个名为`JspSupportServlet`的Servlet来启用这一功能: ```xml <servlet-name>JspSupportServlet <servlet-class>org.apache....
3. **控制结构**:Freemarker提供了丰富的控制结构,如条件语句(`<#if>`、`<#else>`、`<#elseif>`)、循环(`<#foreach>`)、以及异常处理(`<#try>`、`<#catch>`)等,使得模板具有一定的逻辑处理能力。...
### Freemarker语法完整版知识点详解 #### A. 概念 **1. Scalars(标量)** - **字符串**: 由单引号或双引号括起来的文本。 - **数字**: 直接使用数值。 - **日期**: 通常从数据模型中获取。 - **布尔值**: `...
这些变量和指令是用特定的FreeMarker语法表示的,例如`${expression}`用于输出变量值,`<#if>`、`<#foreach>`等用于控制流程。 1. **变量和表达式**:在FreeMarker模板中,`${}`内的内容是表达式,用于获取Java对象...
Freemarker是一款强大的模板引擎,用于将数据模型与表示层分离,从而实现在Web开发中的动态页面生成。根据所提供的文件信息,我们可以详细探讨以下几个关键的知识点: ### 1. 创建配置实例 在Freemarker中,`...
Freemarker是一个强大的模板引擎,常用于JavaEE应用中的视图层处理,尤其与Struts2等MVC框架配合使用,能实现灵活的动态页面渲染。这个"freemarker Demo"是一个适合初学者的示例项目,旨在帮助新接触Freemarker的...
6. **处理异常**:在上述过程中,务必捕获并处理可能出现的异常,确保程序的健壮性。 7. **优化与扩展**:根据需求,你可能需要添加更多的样式、布局或复杂的逻辑。Freemarker支持条件语句(`<#if>`、`<#else>`)、...
FreeMarker提供了丰富的错误处理机制,包括模板错误报告、异常堆栈跟踪以及模板调试模式。通过设置,可以在模板出错时获取详细信息,帮助开发者定位问题。 9. **性能优化** 为了提高性能,FreeMarker支持预编译...
- 错误处理:捕获和处理Freemarker执行时的异常。 - 调试:开启调试模式,查看模板变量的值和执行过程。 9. **集成到Java Web应用** - 使用Servlet容器的Freemarker配置。 - 创建和解析模板的Java代码示例。 -...
camel-freemarker-1.6.4.jar, camel-freemarker-2.8.1.jar, com.springsource.freemarker-2.3.15.jar, com.springsource.freemarker-sources-2.3.15.jar, freemarker-1.4.1.jar, freemarker-2-3-18.jar, freemarker-...
这个"freemarker-2.3.28.jar"是Freemarker库的一个具体版本,版本号为2.3.28,它是Java的一个可执行的JAR(Java Archive)文件,用于在Eclipse集成开发环境中作为插件使用。 在Freemarker的2.3.28版本中,我们可以...
标题:Freemarker 描述:孔浩的Freemarker视频笔记,值得一看! 根据给定的文件信息,我们可以深入探讨Freemarker的相关知识点,包括其基本概念、工作流程以及具体的代码实现。 ### Freemarker基本概念 ...
而Freemarker则是一种轻量级的、基于模板的Java模板引擎,常用于Web应用中的动态内容生成,比如JSP替代技术。它允许开发者将业务逻辑与页面展示分离,提高代码的可维护性和可读性。 "eclipse的freemarker插件"是指...
1. **模板文件的编码**:如果模板文件的编码与Freemarker期望的编码不一致,就可能出现乱码。 2. **数据模型的编码**:当数据模型中的中文字符编码与模板引擎的默认编码不匹配时,也会导致乱码。 3. **页面输出的...
赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.30.pom; 包含翻译后的API文档:...
赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...
Freemarker-IDE是一款专为开发人员设计的Eclipse插件,它主要针对Freemarker模板语言提供了强大的支持。在Eclipse这样的集成开发环境中,这款插件能够显著提升开发人员编写和调试`.ftl`(FreeMarker Template ...
g) 退出Eclipse再重启,在window --> Preferences 左边的树形栏里出现FreeMarker Editor一项新的内容。在General --> Editors --> File Associations下,为*.html和*.htm文件添加(add)FreeMarker Editor 作他们...
1. **数据更新问题**:当使用 FreeMarker 生成静态 HTML 页面时,可能会出现数据更新不及时的问题。 2. **学习成本**:虽然 FTL 相对简单,但仍然需要学习新的模板语言。此外,FreeMarker 对变量赋值的要求可能导致...