freemarker快速上手+空值的多种处理方法

作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:FreeMarker

前言:

      为什么要用模板?有了JSTL,还需要freemarker吗?

      模板技术与容器无关,同样可以应用于非Web应用程序环境。ftl文件改动之后是不需要编译的,这点不同于Jsp 。JSTL只能用在jsp中,修改了jsp,需要重新编译,从而使用模板更有效率。

一、上手实例

  1. 在WEB-INF/lib中放置freemarker.jar,新建一个Servlet,Hello.java

 

 

 

 

二、空值处理

 

 

${empty}
如果empty标签没有在servlet中添加key或者值为null,会报错 empty Value Expression newTag is undefined。
有人说这是个好的控制错误的机制,但本人不这么认为,因为空值太常见了,谁知道什么时候里面就成空值了?每个变量理论上都有可能。
难道每个变量都要加入一个判断?就像struts中丑陋的<empty>标签?既然是模板引擎,就要灵活,何必来那么多限制?
还好,freemarker至少提供了解决办法,否则我只好选择其它引擎了。
freemarker中空值的多种处理方法:
1.按照freemarker的规范,老老实实的判断是否有空值,有空值怎么处理。这在某种时候是有用的。格式:${empty!"EmptyValue of fbysss"}
比如值为空时,你可以给出一个友好的说明,但是很多的变量都要这么说明,未免太麻烦了。
2.<#escape x as x!""></#escape>可以对所有的变量进行空值处理,这里是全部替换为空字符串。当然也可以替换为其它字符串。
如果其中某些变量不需要这种替换,可以加入<#noescape></#noescape>标签。
3.属性配置方法:
配置classic_compatible=true可以满足一般需要。默认情况变量为null则替换为空字符串,如果需要自定义,写上${empty!"EmptyValue of fbysss"}的形式即可
a.通过Configuration设置。Configuration cfg = new Configuration(); cfg.setClassicCompatible(true);//设置属性
b.通过Eviroment设置。
   Environment env = template.createProcessingEnvironment(root, out);
   env.setClassicCompatible(true);
c.通过ftl设置:在ftl前加入<!--#setting classic_compatible=true-->,
d.通过Spring配置文件设置
<bean id="freemarkerConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="freemarkerSettings">
    <props>
      <prop key="classic_compatible">true</prop>
    </props>
  </property>
</bean>
e.class目录下添加freemarker.properties文件:加入classic_compatible=true
(需要struts2或spring)

举一反三,其他属性也可以用类似方法进行设置。

补充:

    我们在开发中,还经常发现这样的问题:

   页面中代码为${user.memo}但可能出现这样的情况:

   a.user == null

   b.user.memo == null

   上述简化方法也鞭长莫及了。

   也就是说,必须对上述两种情况都进行一下判断,才能保证页面不会报错。   
   这么简单的一个需求,代码却如此复杂,实在令人难以接受。

    还好,freemarker本身提供了这样的方法:

    将${user.memo}改写成 ${(user.memo}!}或者${(user.memo}?if_exists}即可。

  1. package com.fbysss.test.servlet;
  2. import java.io.IOException;
  3. import java.io.Writer;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import freemarker.core.Environment;
  10. import freemarker.template.Configuration;
  11. import freemarker.template.Template;
  12. import freemarker.template.TemplateException;
  13. /**
  14.  * Servlet implementation class for Servlet: hello
  15.  *
  16.  */
  17.  public class Hello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
  18.    static final long serialVersionUID = 1L;
  19.    private Configuration cfg;
  20.     /* (non-Java-doc)
  21.      * @see javax.servlet.http.HttpServlet#HttpServlet()
  22.      */
  23.     public Hello() {
  24.         super();
  25.     }       
  26.     
  27.     /* (non-Java-doc)
  28.      * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  29.      */
  30.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31.         Map root = new HashMap();
  32.         
  33.         root.put("msg","你好,freemarker!");
  34.         root.put("intValue"10);
  35.         root.put("nullTag""n");
  36.         
  37.         Template template = cfg.getTemplate("test.ftl");
  38.         //response.setContentType("text/html;charset=gbk");//设定字符集,否则有汉字乱码
  39.         Writer out = response.getWriter();
  40.         try {
  41.             //1.用Enviroment
  42.             Environment env = template.createProcessingEnvironment(root, out);
  43.             env.setClassicCompatible(true);
  44.             env.process();
  45.             //2.template.process(root, out);//两种方法都可以
  46.             //out.flush();//清除缓冲区
  47.         } catch (TemplateException e) {
  48.             // TODO Auto-generated catch block
  49.             e.printStackTrace();
  50.         }
  51.         
  52.     }   
  53.     
  54.     /* (non-Java-doc)
  55.      * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  56.      */
  57.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  58.         // TODO Auto-generated method stub
  59.     }       
  60.     
  61.     /* (non-Javadoc)
  62.      * @see javax.servlet.GenericServlet#init()
  63.      */
  64.     public void init() throws ServletException {
  65.         // TODO Auto-generated method stub
  66.         super.init();
  67.         cfg = new Configuration();
  68.         
  69.         cfg.setServletContextForTemplateLoading(getServletContext(),"WEB-INF/templates");
  70.         //cfg.setClassicCompatible(true);//处理空值为空字符串
  71.         
  72.     }   
  73. }

2.在WEB-INF/templates/下建立test.ftl文件

 

  1. <!--#escape x as x!""-->
  2. <!--#setting classic_compatible=true-->
  3. <html>
  4. <head>
  5.   <title>FreeMarker Example </title>
  6. </head>
  7. <body>
  8.   ${msg}
  9.   ${intValue}
  10.   ${empty?default("empty Value")}
  11.   ${empty!}
  12.   ${newTag}
  13.   ${nullTag}
  14. </body>
  15. </html>
  16. <!--/#escape--> 

3.测试servlet,看到结果了,这里主要要注意乱码和空值的处理。乱码问题,把//response.setContentType("text/html;charset=gbk");注释去掉即可。下面重点说说空值的处理。

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
快速上手Freemarker,你可以按照以下步骤进行: 1. 安装:首先,确保你的项目中已经引入了Freemarker的依赖包。你可以从Freemarker的官方网站下载最新的JAR文件,并将其添加到你的项目中。 2. 配置:在你的项目配置文件中,配置Freemarker的相关设置,比如模板文件的路径、编码方式等。你可以使用`Configuration`类进行配置,示例如下: ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); cfg.setDirectoryForTemplateLoading(new File("path/to/templates")); cfg.setDefaultEncoding("UTF-8"); ``` 3. 创建模板:在指定的模板文件夹中创建你的模板文件,使用Freemarker的语法编写动态内容。 4. 准备数据:准备要插入到模板中的数据。你可以创建一个`Map`或一个Java对象,并将数据存入其中。 5. 处理模板:使用`Template`类加载指定的模板文件,并将数据与模板进行合并。示例如下: ```java Template template = cfg.getTemplate("template.ftl"); Writer out = new OutputStreamWriter(System.out); // 将输出写入到控制台 Map<String, Object> data = new HashMap<>(); data.put("name", "John Doe"); template.process(data, out); ``` 6. 运行程序:运行你的程序,观察控制台输出或生成的结果文件,查看模板与数据合并后的动态内容。 通过这些步骤,你可以快速上手Freemarker,并开始在你的Web应用程序中生成动态内容。记得参考Freemarker的官方文档和示例代码,以了解更多高级特性和最佳实践。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值