freemarker快速上⼿+空值+三元运算的多种处理⽅法
前⾔:
为什么要⽤模板?有了JSTL,还需要freemarker吗?
模板技术与容器⽆关,同样可以应⽤于⾮Web应⽤程序环境。ftl⽂件改动之后是不需要编译的,这点不同于Jsp 。JSTL只能⽤在jsp中,修改了jsp,需要重新编译,从⽽使⽤模板更有效率。
⼀、上⼿实例
1. 在WEB-INF/lib中放置freemarker.jar,新建⼀个Servlet,Hello.java
Java代码
package st.servlet;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Environment;
plate.Configuration;
plate.Template;
plate.TemplateException;
/**
* Servlet implementation class for Servlet: hello
*
*/
public class Hello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
private Configuration cfg;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public Hello() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map root = new HashMap();
root.put("msg","你好,freemarker!");
root.put("intValue", 10);
createprocessaroot.put("nullTag", "n");
Template template = Template("test.ftl");
//response.setContentType("text/html;charset=gbk");//设定字符集,否则有汉字乱码
Writer out = Writer();
try {
//1.⽤Enviroment
Environment env = ateProcessingEnvironment(root, out);
env.setClassicCompatible(true);
env.process();
//2.template.process(root, out);//两种⽅法都可以
//out.flush();//清除缓冲区
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init()
*/
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
cfg = new Configuration();
cfg.setServletContextForTemplateLoading(getServletContext(),"WEB-INF/templates");
//cfg.setClassicCompatible(true);//处理空值为空字符串
}
}
2.在WEB-INF/templates/下建⽴test.ftl⽂件
Freemarker代码
<!--#escape x as x!""-->
<!--#setting classic_compatible=true-->
<html>
<head>
<title>FreeMarker Example </title>
</head>
<body>
${msg}
${intValue}
${empty?default("empty Value")}
${empty!}
${newTag}
${nullTag}
</body>
</html>
<!--/#escape-->
3.测试servlet,看到结果了,这⾥主要要注意乱码和空值的处理。乱码问题,把//response.setContentType("text/html;charset=gbk");注释去掉即可。下⾯重点说说空值的处理。
⼆、空值处理
${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 = ateProcessingEnvironment(root, out);
env.setClassicCompatible(true);
c.通过ftl设置:在ftl前加⼊<!--#setting classic_compatible=true-->,
d.通过Spring配置⽂件设置
Xml代码
<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)
freemarker三⽬运算:
${ (type == 'SPOT') ?string('热点词','热点搜索')}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论