前言:
为什么要用模板?有了JSTL,还需要freemarker吗?
模板技术与容器无关,同样可以应用于非Web应用程序环境。ftl文件改动之后是不需要编译的,这点不同于Jsp 。JSTL只能用在jsp中,修改了jsp,需要重新编译,从而使用模板更有效率。
一、上手实例
1. 在WEB-INF/lib中放置freemarker.jar,新建一个Servlet,Hello.java
- package com.fbysss.test.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;
-
-
import freemarker.core.Environment;
-
import freemarker.template.Configuration;
-
import freemarker.template.Template;
-
import freemarker.template.TemplateException;
-
-
-
-
-
-
public class Hello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
-
static final long serialVersionUID = 1L;
-
private Configuration cfg;
-
-
-
-
public Hello() {
-
super();
- }
-
-
-
-
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
Map root = new HashMap();
-
-
root.put("msg","你好,freemarker!");
-
root.put("intValue", 10);
-
root.put("nullTag", "n");
-
-
Template template = cfg.getTemplate("test.ftl");
-
- Writer out = response.getWriter();
-
-
try {
-
- Environment env = template.createProcessingEnvironment(root, out);
-
env.setClassicCompatible(true);
- env.process();
-
-
-
-
} catch (TemplateException e) {
-
- e.printStackTrace();
- }
-
- }
-
-
-
-
-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
- }
-
-
-
-
-
-
public void init() throws ServletException {
-
-
super.init();
-
cfg = new Configuration();
-
-
cfg.setServletContextForTemplateLoading(getServletContext(),"WEB-INF/templates");
-
-
- }
- }
package com.fbysss.test.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;
import freemarker.core.Environment;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.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);
root.put("nullTag", "n");
Template template = cfg.getTemplate("test.ftl");
//response.setContentType("text/html;charset=gbk");//设定字符集,否则有汉字乱码
Writer out = response.getWriter();
try {
//1.用Enviroment
Environment env = template.createProcessingEnvironment(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文件
- <!--#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-->
<!--#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 = 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>
<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)
举一反三,其他属性也可以用类似方法进行设置。
分享到:
相关推荐
基于SpringBoot+FreeMarker+MyBatis+ExtJs实现的一个通用后台管理系统,界面美观,适合快速迭代开发 项目说明 技术栈: SpringBoot MyBatis Redis MySQL FreeMarker ExtJs 基于SpringBoot+FreeMarker+MyBatis+...
1、基于SpringBoot+FreeMarker+MyBatis+ExtJs实现的一个通用后台管理系统源码(适合快速迭代开发).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计...
一、项目运行 环境配置: Jdk1.8 + Tomcat8.0 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) ...Springboot + SpringMVC + MyBatis + FreeMarker + JavaScript + JQuery + Ajax + maven等等。
在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...
本系统是基于FreeMarker+SpringBoot+Mybatis实现的大学教室管理系统。主要实现对教室的预约、教学楼管理、教室管理、教室上课时间管理、班级管理、学生,老师,辅导员,楼长管理。 管理员登录页面:...
这个"springboot+freemarker+druid+mysql"的项目提供了一个完整的Web应用示例,涵盖了从数据存储、视图渲染到后台任务处理等多个方面,对于学习和理解SpringBoot的实战应用具有很高的参考价值。开发者可以通过分析这...
实现的功能有: 管理员:系统管理、请假管理、公告管理、档案资料管理、通讯录管理、日常办公管理、邮箱管理消息管理等。 员工:登录、修改个人信息、请假(申请请假)、日常办公(工作日志、任务管理、日常管理)、...
个关于freemarker+webwork+spring+ibatis的demo文档
springmvc+mybatis+redis+shiro+bootstrap+freemarker+jsp+logback框架,几乎集合了所有企业开发技术,可以下载下来直接使用,任务调度,登陆拦截应有尽有
4. **编写Controller**:在Java源代码中创建一个控制器类,使用`@Controller`注解标记,并添加处理请求的方法,例如: ```java @Controller public class IndexController { @RequestMapping("/index") public ...
标题 "大型商城网站springmvc+freemarker+velocity+ibatis" 暗示了这是一个基于SpringMVC、Freemarker、Velocity和iBatis框架构建的电子商务平台。这个项目可能是一个B2C(Business-to-Consumer)类型的商城,允许...
本项目“s2sh+freemarker+jquery+jquery-treeview 无限级树形菜单”就是这样一个解决方案,它整合了多种技术来实现这一功能。 首先,我们来看“s2sh”。这是Struts2、Spring和Hibernate三者的简称,它们分别是MVC...
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。...基于SpringBoot+FreeMarker+MyBatis+ExtJs实现的一个通用后台管理系统源码(适合快速迭代开发).zip
SSM(Spring、SpringMVC、...以上就是"freemarker+ssm+maven整合"项目的主要知识点。这个项目不仅展示了如何将这些组件整合在一起,还提供了实际操作的参考,对于学习和理解Java Web开发的SSM架构有着重要的实践意义。
总结起来,`Freemarker+Action+Word`的组合在Web开发中提供了动态生成Word文档的能力,尤其适用于需要根据用户输入自定义报告的情况。这种技术方案能够提高效率,简化复杂的文档生成流程,使得开发人员可以专注于...
基于SpringBoot + FreeMarker + Mybatis + shrio + redis + MySQLOracle等开发多模块化后台管理系统ZGC后台员工管理系统,本项目设计相对简单,具体业务逻辑与数据存储相对保守只用作学习。系统实现的功能模块有员工...
搭建项demo(maven项目[freemarker+easyui+spring+springmvc+mybatic]) ,包括各种功能,技术简介,要自己运行才行 有搭建的整个项目,1,有发短信验证码功能,paypal支付功能,登陆验证功能,excel导入导出功能 ...
"freemarker+fckeditor+struts+hibernate" 这个标题揭示了一个基于Java的Web开发项目,它整合了四个关键的技术组件:FreeMarker模板引擎,FCKeditor富文本编辑器,Struts MVC框架,以及Hibernate持久化框架。...
springboot-weixin-alipay是基于(springboot2.0+freemarker+thymeleaf+mybatis+druid)实现了支付宝,微信支付功能,用户列表,商品列表,选择购买,提交订单,扫码支付,订单表单提交支付的通用商城项目.
spring4.0+hibernate4.3+freemarker+jquery+extjs4.2 在实现了漂亮的首页,图表拖拉都实现了,这里重点是spring4.0和freemarker的搭建,注意其中的包的变化以及配置的不同 main.view为spring的入口,ext的节目为main...