国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Java操作FreeMarker模板引擎的基本用法示例小結

2020-04-11 10:44:25
字體:
來源:轉載
供稿:網友

FreeMarker 是一個采用 Java 開發的模版引擎,是一個基于模版生成文本的通用工具。 它被設計用來生成 HTML Web 頁面,特別是基于 MVC 模式的應用程序。雖然使用FreeMarker需要具有一些編程的能力,但通常由 Java 程序準備要顯示的數據,由 FreeMarker 生成頁面,并通過模板顯示準備的數據。
http://freemarker.org/

public void process(String template, Map<String, ?> data) throws Exception {   Configuration cfg = new Configuration();   cfg.setDirectoryForTemplateLoading(new File("ftl"));   cfg.setObjectWrapper(new DefaultObjectWrapper());      //設置字符集   cfg.setDefaultEncoding("UTF-8");      //設置尖括號語法和方括號語法,默認是自動檢測語法   // 自動 AUTO_DETECT_TAG_SYNTAX   // 尖括號 ANGLE_BRACKET_TAG_SYNTAX   // 方括號 SQUARE_BRACKET_TAG_SYNTAX   cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);    Writer out = new OutputStreamWriter(new FileOutputStream(FILE_DIR + template + ".txt"),"UTF-8");   Template temp = cfg.getTemplate(template);   temp.process(data, out);   out.flush(); } 

0、使用freemarker制作HelloWord web頁面
新建一個WEB工程,并導入freemarker.jar,在WEB-INF下新建文件夾templates用于存放模版文件,在templates下新建test.ftl,這是示例模版文件。內容就是HTML內容,里面帶有一個標記符,用于將來進行變量替換,內容如下:

<html>  <head>     <title>freemarker測試</title>   </head>   <body>     <h1>${message},${name}</h1>   </body> </html> 

 
新建一個Servlet,用于請求設置變量,并處理模版的輸出:

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 {   // 負責管理FreeMarker模板的Configuration實例   private Configuration cfg = null;   public void init() throws ServletException {     // 創建一個FreeMarker實例     cfg = new Configuration();     // 指定FreeMarker模板文件的位置     cfg.setServletContextForTemplateLoading(getServletContext(),         "/WEB-INF/templates");   }   @SuppressWarnings("unchecked")   public void doPost(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {     // 建立數據模型     Map root = new HashMap();     root.put("message", "hello world");     root.put("name", "java小強");     // 獲取模板文件     Template t = cfg.getTemplate("test.ftl");     // 使用模板文件的Charset作為本頁面的charset     // 使用text/html MIME-type     response.setContentType("text/html; charset=" + t.getEncoding());     Writer out = response.getWriter();     // 合并數據模型和模板,并將結果輸出到out中     try {       t.process(root, out); // 往模板里寫數據     } 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> 

 
為了方便測試,訪問工程直接跳轉到Servlet,對主頁index.jsp做一個簡單修改:

<%@ 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> 

 
部署工程到Tomcat,啟動并訪問http://localhost:8080/f ,這里我建立的工程名稱就是 f 。

1、計算式

<#-- 1、算術運算 -->[BR] ${3 + 4} <#-- 2、內建函數 -->[BR] ${"rensanning"?upper_case} 


2、輸出一個值

HashMap t2root = new HashMap<String, String>(); t2root.put("user", "RenSanNing"); ${user}, Welcome!


3、輸出一個列表

Map<String, Object> t3root = new HashMap<String, Object>(); List<Food> menu = new ArrayList<Food>(); menu.add(new Food("iText in Action", 98)); menu.add(new Food("iBATIS in Action", 118)); menu.add(new Food("Lucene in Action", 69)); t3root.put("menu", menu); <#list menu as food> ${food.name} ${food.price?string.currency} </#list> 


4、邏輯判斷(IF,SWITCH)

Map<String, Object> t4root = new HashMap<String, Object>(); t4root.put("x", 2); t4root.put("y", "medium"); 
<1>if, else, elseif: <#if x == 1>  x is 1 <#elseif x == 2>  x is 2 <#elseif x == 3>  x is 3 <#elseif x == 4>  x is 4 <#else>  x is not 1 nor 2 nor 3 nor 4 </#if> <2>switch, case, default, break: <#switch y>  <#case "small">    This will be processed if it is small    <#break>  <#case "medium">    This will be processed if it is medium    <#break>  <#case "large">    This will be processed if it is large    <#break>  <#default>    This will be processed if it is neither </#switch> <3>list, break: <#assign seq = ["winter", "spring", "summer", "autumn"]> <#list seq as x>  ${x_index + 1}. ${x}<#if x_has_next>,</#if> </#list> 


5、自定義函數

<#function fact n>  <#if n == 0>   <#return 1 />  <#else>   <#return fact(n - 1) * n />  </#if> </#function> <#list 0..10 as i>  ${i}! => ${fact(i)} </#list> 


6、定義變量

<#-- 1、本地變量 -->[BR] <#function partg n lst>  <#local ans = []>  <#list lst as x>   <#if (x >= n)>    <#local ans = ans + [x]>   </#if>  </#list>  <#return ans> </#function> <#assign ls = [10, 2, 4, 5, 8, 1, 3]> <#list partg(4, ls) as x>${x} </#list> <#-- 2、變量域測試 -->[BR] <#macro test>   03. ${x}   <#global x = "global2">   04. ${x}   <#assign x = "assign2">   05. ${x}   <#local x = "local1">   06. ${x}   <#list ["循環1"] as x>     07. ${x}     <#local x = "local2">     08. ${x}     <#assign x = "assign3">     09. ${x}   </#list>   10. ${x} </#macro> <#global x = "global1" /> 01. ${x} <#assign x = "assign1" /> 02. ${x} <@test /> 11. ${x} 


7、定義宏macro

<#-- 1、無參數 -->[BR] <#macro greet> Welcome! </#macro> <@greet /> <#-- 2、有參數 -->[BR] <#macro greet user> ${user}, Welcome! </#macro> <@greet user="RenSanNing"/> <#-- 3、有多個參數 -->[BR] <#macro table cols rows>  <table>   <#list 1..rows as row>    <tr>     <#list 1..cols as col>      <td>${row}, ${col}</td>     </#list>    </tr>   </#list>  </table> </#macro> <@table cols=3 rows=2 /> <#-- 4、中間跳出 -->[BR] <#macro out>  顯示文字  <#return>  不顯示文字 </#macro> <@out /> <#-- 5、嵌套 -->[BR] <#macro lprint lst>  <#list lst as item>  ・${item}<#nested item />  </#list> </#macro> <@lprint 1..3; x>^2 = ${x * x}</@lprint> <@lprint 1..3; x>^3 = ${x * x * x}</@lprint> <@lprint ["Let's go", "to the", "land of Medetai"] /> 


8、include

<#include "T108include.ftl"> ${url} <@greet name="rensanning" /> 

T108include.ftl
<#macro greet name> ${name}, Welcome! </#macro> <#assign url="http://www.baidu.com/"> 


9、名字空間

<#import "T109include.ftl" as my> <#assign url="http://www.google.com/"> ${my.url} <@my.greet name="rensanning" /> ${url} 

T109include.ftl

<#macro greet name> ${name}, Welcome! </#macro> <#assign url="http://www.baidu.com/"> 


10、自定義指令Directive

public class SystemDateDirective implements TemplateDirectiveModel {      public void execute(Environment env, Map params, TemplateModel[] loopVars,       TemplateDirectiveBody body) throws TemplateException, IOException {     Calendar cal = Calendar.getInstance();     SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");     env.getOut().append(sdf.format(cal.getTime()));   }  } public class TextCutDirective implements TemplateDirectiveModel {   public static final String PARAM_S = "s";   public static final String PARAM_LEN = "len";   public static final String PARAM_APPEND = "append";    @SuppressWarnings("unchecked")   public void execute(Environment env, Map params, TemplateModel[] loopVars,       TemplateDirectiveBody body) throws TemplateException, IOException {     String s = getString(PARAM_S, params);     Integer len = getInt(PARAM_LEN, params);     String append = getString(PARAM_APPEND, params);     if (s != null) {       Writer out = env.getOut();       if (len != null) {         out.append(textCut(s, len, append));       } else {         out.append(s);       }     }   } 

        
        .... 

Map<String, Object> t10root = new HashMap<String, Object>(); t10root.put("systemdate", new SystemDateDirective()); t10root.put("text_cut", new TextCutDirective()); 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南宁市| 永定县| 威信县| 新和县| 呼和浩特市| 柳林县| 东阳市| 临朐县| 宾阳县| 湘乡市| 蒲江县| 马公市| 且末县| 新乡县| 肇庆市| 开平市| 炎陵县| 通许县| 微山县| 固安县| 习水县| 普宁市| 长阳| 伽师县| 溧阳市| 临夏市| 江陵县| 贡嘎县| 普陀区| 全椒县| 阆中市| 洛浦县| 孟村| 正宁县| 柳河县| 交口县| 台山市| 万全县| 陕西省| 乌鲁木齐县| 扎赉特旗|