freemarker簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫(xiě)
FreeMarker被設(shè)計(jì)用來(lái)生成HTML Web頁(yè)面,特別是基于MVC模式的應(yīng)用程序
雖然FreeMarker具有一些編程的能力,但通常由Java程序準(zhǔn)備要顯示的數(shù)據(jù),由FreeMarker生成頁(yè)面,通過(guò)模板顯示準(zhǔn)備的數(shù)據(jù)。
FreeMarker不是一個(gè)Web應(yīng)用框架,而適合作為Web應(yīng)用框架一個(gè)組件
FreeMarker與容器無(wú)關(guān),因?yàn)樗⒉恢繦TTP或Servlet;FreeMarker同樣可以應(yīng)用于非Web應(yīng)用程序環(huán)境
FreeMarker更適合作為Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標(biāo)記庫(kù)
FreeMarker是免費(fèi)的
1、通用目標(biāo)
能夠生成各種文本:HTML、XML、RTF、Java源代碼等等
易于嵌入到你的產(chǎn)品中:輕量級(jí);不需要Servlet環(huán)境
插件式模板載入器:可以從任何源載入模板,如本地文件、數(shù)據(jù)庫(kù)等等
你可以按你所需生成文本:保存到本地文件;作為Email發(fā)送;從Web應(yīng)用程序發(fā)送它返回給Web瀏覽器
2、強(qiáng)大的模板語(yǔ)言
所有常用的指令:include、if/elseif/else、循環(huán)結(jié)構(gòu)
在模板中創(chuàng)建和改變變量
幾乎在任何地方都可以使用復(fù)雜表達(dá)式來(lái)指定值
命名的宏,可以具有位置參數(shù)和嵌套內(nèi)容
名字空間有助于建立和維護(hù)可重用的宏庫(kù),或者將一個(gè)大工程分成模塊,而不必?fù)?dān)心名字沖突
輸出轉(zhuǎn)換塊:在嵌套模板片段生成輸出時(shí),轉(zhuǎn)換HTML轉(zhuǎn)義、壓縮、語(yǔ)法高亮等等;你可以定義自己的轉(zhuǎn)換
3、通用數(shù)據(jù)模型
freeMarker不是直接反射到Java對(duì)象,Java對(duì)象通過(guò)插件式對(duì)象封裝,以變量方式在模板中顯示
你可以使用抽象(接口)方式表示對(duì)象(JavaBean、XML文檔、SQL查詢結(jié)果集等等),告訴模板開(kāi)發(fā)者使用方法,使其不受技術(shù)細(xì)節(jié)的打擾
4、為Web準(zhǔn)備
- 在模板語(yǔ)言中內(nèi)建處理典型Web相關(guān)任務(wù)(如HTML轉(zhuǎn)義)的結(jié)構(gòu)
- 能夠集成到Model2 Web應(yīng)用框架中作為JSP的替代
- 支持JSP標(biāo)記庫(kù)
- 為MVC模式設(shè)計(jì):分離可視化設(shè)計(jì)和應(yīng)用程序邏輯;分離頁(yè)面設(shè)計(jì)員和程序員
5、智能的國(guó)際化和本地化
- 字符集智能化(內(nèi)部使用UNICODE)
- 數(shù)字格式本地化敏感
- 日期和時(shí)間格式本地化敏感
- 非US字符集可以用作標(biāo)識(shí)(如變量名)
- 多種不同語(yǔ)言的相同模板
6、強(qiáng)大的XML處理能力
<#recurse> 和<#visit>指令(2.3版本)用于遞歸遍歷XML樹(shù)
在模板中清楚和直覺(jué)的訪問(wèn)XML對(duì)象模型
Helloworld
新建一個(gè)WEB工程,下載(我使用的是freemarker-2.3.20)freemarker并導(dǎo)入freemarker.jar,在WEB-INF下新建文件夾templates用于存放模版文件
在templates下新建test.ftl,這是示例模版文件。內(nèi)容就是HTML內(nèi)容,里面帶有一個(gè)標(biāo)記符,用于將來(lái)進(jìn)行變量替換,內(nèi)容如下:
<html>
<head>
<title>freemarker測(cè)試</title>
</head>
<body>
<h1>${message},${name}</h1>
</body>
</html>
新建一個(gè)Servlet,用于請(qǐng)求設(shè)置變量,并處理模版的輸出:
package com.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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@SuppressWarnings("serial")
public class HelloFreeMarkerServlet extends HttpServlet {
// 負(fù)責(zé)管理FreeMarker模板的Configuration實(shí)例
private Configuration cfg = null;
public void init() throws ServletException {
// 創(chuàng)建一個(gè)FreeMarker實(shí)例
cfg = new Configuration();
// 指定FreeMarker模板文件的位置
cfgsetServletContextForTemplateLoading(getServletContext(),
"/WEB-INF/templates");
}
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 建立數(shù)據(jù)模型
Map root = new HashMap();
root.put("message", "hello world");
root.put("name", "java小強(qiáng)");
// 獲取模板文件
Template t = cfg.getTemplate("test.ftl");
// 使用模板文件的Charset作為本頁(yè)面的charset
// 使用text/html MIME-type
responsesetContentType("text/html; charset=" + tgetEncoding());
Writer out = response.getWriter();
// 合并數(shù)據(jù)模型和模板,并將結(jié)果輸出到out中
try {
tprocess(root, out); // 往模板里寫(xiě)數(shù)據(jù)
} catch (TemplateException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void destroy() {
super.destroy();
}
}
注意要在你的web.xml中配置該Servlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>
com.test.servlet.HelloFreeMarkerServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
為了方便測(cè)試,訪問(wèn)工程直接跳轉(zhuǎn)到Servlet,對(duì)主頁(yè)index.jsp做一個(gè)簡(jiǎn)單修改:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName() +":"+request.getServerPort()+path+"/"; %> <html> <body> <% String mypath = "hello"; response.sendRedirect(basePath + mypath); %> </body> </html>
相關(guān)文章
SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解
這篇文章主要介紹了SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解,因?yàn)榘咐a用到了hutool提供的DesensitizedUtil數(shù)據(jù)脫敏工具類,這里要引入hutool的依賴,如果你需要自定義 數(shù)據(jù)脫敏的邏輯,可以不引入這個(gè)依賴,需要的朋友可以參考下2024-01-01
SpringMVC4+MyBatis+SQL Server2014實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離
這篇文章主要介紹了SpringMVC4+MyBatis+SQL Server2014實(shí)現(xiàn)讀寫(xiě)分離,需要的朋友可以參考下2017-04-04
多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼
這篇文章主要介紹了多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼,涉及算法背景,原理,構(gòu)建過(guò)程簡(jiǎn)單介紹幾Java代碼實(shí)現(xiàn)等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Mybatis與Jpa的區(qū)別和性能對(duì)比總結(jié)
mybatis和jpa兩個(gè)持久層框架,從底層到用法都不同,但是實(shí)現(xiàn)的功能是一樣的,所以說(shuō)一直以來(lái)頗有爭(zhēng)議,所以下面這篇文章主要給大家介紹了關(guān)于Mybatis與Jpa的區(qū)別和性能對(duì)比的相關(guān)資料,需要的朋友可以參考下2021-06-06
mybatis項(xiàng)目兼容mybatis-plus問(wèn)題
這篇文章主要介紹了mybatis項(xiàng)目兼容mybatis-plus問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
劍指Offer之Java算法習(xí)題精講數(shù)組與二叉樹(shù)
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
SpringBoot整合RabbitMQ實(shí)現(xiàn)流量消峰
RabbitMQ 即一個(gè)消息隊(duì)列,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用,消息中間件在互聯(lián)網(wǎng)公司的使用中越來(lái)越多,本文給大家介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)流量消峰,需要的朋友可以參考下2024-12-12
Java中實(shí)例初始化和靜態(tài)初始化的過(guò)程詳解
Java代碼初始化塊是Java語(yǔ)言中的一個(gè)非常重要的概念。初始化塊負(fù)責(zé)在創(chuàng)建對(duì)象時(shí)進(jìn)行一些必要的操作,例如設(shè)置對(duì)象的初始狀態(tài)、初始化成員變量等。初始化塊被分為實(shí)例初始化塊和靜態(tài)初始化塊兩種類型。本文詳細(xì)介紹了初始化的過(guò)程,需要的朋友可以參考下2023-05-05
Idea2020.2創(chuàng)建JavaWeb項(xiàng)目(部署Tomcat)方法詳解
這篇文章主要介紹了Idea2020.2創(chuàng)建JavaWeb項(xiàng)目(部署Tomcat)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08

