FreeMarker
常用语法servlet
中使用freeMarker
数据 + 模板 = 结果
模板引擎将数据与展现有效的解耦
JSP
FreeMarker
Beetl
: Beetl
是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎, 而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎。而且还易学易用。FreeMarker
Freemarker
是免费开源的模板弓|擎技术
Freemarker
提供 了大量内建函数来简化开发
JSP
与Freemarker
的区别
FreeMarker
快速上手安装freemarker
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>2.3.30version>
dependency>
freemarker
示例Java文件:
public static void main(String[] args) throws IOException, TemplateException {
//1.加载模板
//创建核心配置对象
Configuration config = new Configuration(Configuration.VERSION_2_3_30);
//设置加载日志
config.setClassForTemplateLoading(FreeMarkerSample01.class, "");
//得到模板对象
Template template = config.getTemplate("sample01.ftl");
//2.创建数据
Map<String, Object> data = new HashMap<String, Object>();
data.put("site", "百度");
data.put("url", "http://www.baidu.com");
//3.产生输出
template.process( data, new OutputStreamWriter(System.out));
}
ftl
文件:
${site} : ${url}
输出结果:
百度 : http://www.baidu.com
FTL
取值<#-- Freemarker取值 -->
${site} : ${url}
<#-- 当属性存在时,并且没使用默认值,则报错 :${author} -->
<#-- !默认值} -->
${author ! "不存在的属性"}
<#-- ?格式化} -->
${date?string("yyyy年MM月dd日 HH:mm:ss SSS")}
${number}
${number?string("0.00")}
javabean
的数据取值Computer
SN:${computer.sn}
型号:${computer.model}
采购时间:${computer.dop?string("yyyy年MM月dd日 HH:mm")}
采购价格:${computer.price?string("0.00")}
配置信息(javabean中map集合取值)
Cpu:${computer.info["cpu"]}
内存:${computer.info["memory"]!"无内存信息"}
<#if computer.state == 1>
状态:正在使用
<#elseif computer.state == 2>
状态:闲置
<#elseif computer.state == 3>
状态:已作废
#if>
<#-- ??代表:判断对象是否为空 -->
<#if computer.user??>
用户:${computer.user}
#if>
<#switch computer.state>
<#case 1>
状态:正在使用
<#break>
<#case 2>
状态:闲置
<#break>
<#case 3>
状态:已作废
<#break>
<#default>
状态:无效状态
#switch>
<#list students as stu>
${stu_index} - ${stu.name}
#list>
<#list map?keys as key>
${key} : ${map[key].属性名}
#list>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Arv0i0Cg-1594655985174)(C:%5CUsers%5Cleevmh%5CDesktop%5CJavaWEB%5Cimages%5Cimage-20200713195117907.png)]
servlet
中使用freeMarker
作为基础了解,在web应用程序范畴内使用 FreeMarker
和其它并没有什么不同; FreeMarker
将它的输出写入传递给 Template.process
方法的 Writer
对象,它不关心 Writer
将输出写入控制台,文件或是 HttpServletResponse
的输出流。
FreeMarker
并不知道什么是servlet
和web
;它仅仅是使用模板文件来合并Java
对象, 之后从它们中间生成输出文本。
许多框架依照HTTP请求转发给用户自定义的"action"类,将数据作为属性放在 ServletContext
, HttpSession
和 HttpServletRequest
对象中,之后请求被框架派发到一个JSP
页面中(视图层),使用属性传递过来的数据来生成HTML页面,这样的策略通常就是所指的Model 2模型。
servlet
中如何配置使用这样的框架,你就可以非常容易地用FTL
文件来代替JSP
文件。 但是,因为你的Servlet
容器(Web应用程序服务器),不像JSP
文件,它可能并不知道如何处理FTL
文件,那么就需要对Web应用程序进行一些额外的配置:
<servlet>
<servlet-name>freemarkerservlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServletservlet-class>
<init-param>
<param-name>TemplatePathparam-name>
<param-value>/param-value>
init-param>
<init-param>
<param-name>NoCacheparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>ContentTypeparam-name>
<param-value>text/html; charset=UTF-8param-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>freemarkerservlet-name>
<url-pattern>*.ftlurl-pattern>
servlet-mapping>
它是怎么工作的?
让我们先来看看
JSP
是怎么工作的。许多
servlet
容器处理JSP
时使用一个映射为*.jsp
的servlet
请求URL格式。这样servlet
就会接收所有URL是以.jsp
结尾的请求,查找请求URL地址中的JSP
文件, 内部编译后生成Servlet
,然后调用生成好的serlvet
来生成页面。这里为URL类型是
*.ftl
映射的FreemarkerServlet
也是相同功能,只是FTL
文件不会编译成Servlet
,而是给Template
对象, 之后Template
对象的 ``process` 方法就会被调用来生成页面。
比如,代替这个JSP
页面 (注意它使用了Struts标签库来保存设计,而不是嵌入可怕的Java代码):
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html>
<head><title>Acmee Products Internationaltitle>
<body>
<h1>Hello <bean:write name="user"/>!h1>
<p>These are our latest offers:
<ul>
<logic:iterate name="latestProducts" id="prod">
<li><bean:write name="prod" property="name"/>
for <bean:write name="prod" property="price"/> Credits.
logic:iterate>
ul>
body>
html>
你可以使用这个FTL
文件(使用 .ftl
扩展名而不是 .jsp
):
<html>
<head><title>Acmee Products Internationaltitle>
<body>
<h1>Hello ${user}!h1>
<p>These are our latest offers:
<ul>
<#list latestProducts as prod>
<li>${prod.name} for ${prod.price} Credits.
#list>
ul>
body>
html>
在这两个模板中,当你要引用 user
和 latestProduct
时,首先它会尝试去查找已经在模板中创建的同名变量 (比如 prod
;如果你使用JSP:这是一个page范围内的属性)。如果那样做不行,它会尝试在 HttpServletRequest
对象中查找那个名字的属性,如果没有找到就在 HttpSession
中找,如果还没有找到那就在ServletContext
中找。FTL按这种情况工作是因为 FreemarkerServlet
创建数据模型由上面提到的3个对象中的属性而来。 那也就是说,
这种情况下根哈希表root不是 java.util.Map
(正如本手册中的一些例子那样),而是ServletContext
+HttpSession
+HttpServletRequest
;
FreemarkerServlet
也会在数据模型中放置3个哈希表,这样你就可以直接访问3个对象中的属性了。这些哈希表变量是:Request
,Session
,Application
(和ServletContext
对应)。它还会暴露另外一个名为 RequestParameters
的哈希表,这个哈希表提供访问HTTP请求中的参数。
你可以使用由 FreemarkerServlet
提供的客户化标签
s
<@include_page path="..."/>
来包含另一个Web应用资源的内容到输出内容中;
<@include_page path="path/to/some.jsp"/>
和在JSP
中使用该标签是相同的: