當前位置:首頁 » 編程語言 » javafreemarkerif

javafreemarkerif

發布時間: 2023-04-04 21:06:35

java-freemarker怎麼判斷變數不存在

以下是方法:

Ⅱ 如何在freemarker中調用java的方法

1 要想使用Freemarker支持的自定義方法,需要實現freemarker.template.TemplateMethodModel介面或 TemplateMethodModelEx介面
參散攜跡考示例如下:
java 代碼:
public class Object2HashMap implements TemplateMethodModelEx {
private static final Logger logger = LoggerFactory.getLogger(Object2HashMap.class);

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Object exec(List arguments) throws TemplateModelException {
Collection collection = (Collection) DeepUnwrap.unwrap((TemplateModel) arguments.get(0));
String keyProperty = arguments.get(1).toString();
String valueProperty = arguments.get(2).toString();

HashMap result = new HashMap();
if (collection == null) return result;
for (Object object: collection) {
try {
Object key = PropertyUtils.getProperty(object, keyProperty);
Object value = PropertyUtils.getProperty(object, valueProperty);
result.put(key, value);
} catch (Exception e) {
logger.error("處理沖並異常", e);
}
}
return result;
}
}

freemarker使用示例,通過new()創建該對象。參隱埋考示例是 將wsdl的擴展欄位 key,value值放到HashMap中。
<#assign
chineseAmount = "com.ccic.gateway.core.freemarker.encoder.ChineseAmountEncoder"?new()
object2hash = "com.ccic.gateway.core.freemarker.encoder.Object2HashMap"?new()
insuredExtendHash = object2hash(payload.responseBody.policy.extend, "key", "value")
>
取值:${(insuredExtendHash.ApproverCName)!}

Ⅲ Java-freemarker怎麼判斷變數不存在

freemarker,判斷對象存在
假設java傳遞user對象,user對象可能為空,freemarker要將user姓洞掘名顯示在頁面上
<#if user?exists>
${user.name}
<#else>
找不到用戶
</#if>

exists還有一種簡寫方法
<納稿核#if user??>敬正

Ⅳ freemarker for循環怎麼寫

代碼如下:

<#if totalPage gt 10>
<#list 1..10 as t>
<#if pageNo==t> <li class="thisclass">${t}</li>
<#else> <li><a href="${menu.address}/list_${t}.html">${t}</a></li>
</#if>
</#list>
<#else>
<#list 1..totalPage as t>
<#if pageNo==t> <li class="thisclass">${t}</li>
<#else> <li><a href="${menu.address}/list_${t}.html">${t}</a></li>
</#if>
</#list>
</#if>

(4)javafreemarkerif擴展閱讀

Freemarker 3種循環模式

1、map循環

舉例握如:

<#if vo.urlMap??>

<#list vo.urlMap?keys as key>

<li>

<a href="${vo.urlMap[key]!''}">${key!''}</a>

</li>

</#list>

</#if>

vo.urlMap?keys: 將map中的key循環(類似keySet迭代器)

循環中通過map[key]來取的key對應的value

如果需要當前循環下標, 使用循環對象_index取即可, 如: key_index

2、list循環

舉例:

<#list vo.valueList as value>消皮鋒

<td>${value!''}</td>

</#list>

3、自定義次數循環

舉例:

<!-- 動態長度 -->

<#list 0..(nums?number)!0 as i>

<td>${vo.valueList[i]!''}</td>

</#list>

<!-- 固定長度拿晌 -->

<#list 1..100 as i>

<td>${vo.valueList[i]!''}</td>

</#list>

Ⅳ 「Freemarker中<#if (A) && A == 0>」判斷是什麼意思

這句話意思是:

A?? 判斷A是不是存在,A==0 判斷 A是否等於0。

Ⅵ freemarker判斷含有幾個數字

eMarker中的<#if>標簽除了裡面直接判斷 boolean 類型的變數外,也可以進行表達式判斷,有幾個細節記錄一下

1. 判斷對象是否存在(null)

經常會用到,如族咐羨果對象 != null 則xxxx,在freemarker中表達比較奇怪,兆拍例如判斷 target 是否為null,如果不為 nll 則做xxx動作

<#if target??>

xxxx

</#if>

(目標變數後面連續兩個??)

2. 字元串或數字比較

java里標准字元串比較需要 .equals() 方法,在freemarkder中進行了簡化,字元串的比較方法和數字做到完全一樣

<簡塵#if str == "success">

xxx

</#if>

<#if str !== "error">

xxx

</#if>

Ⅶ 如何使用Freemarker生成java代碼

Freemarker是一個模板框架。我們可以通過Freemarker進行代碼生成或頁面的靜態生成。 現在簡單的說一下怎樣使用Freemarker Freemarker的主要生成類
public boolean generate(String templateFileName, Map data,

String fileName) {

try {

//取得模板的位置

String templateFileDir=templateFileName.substring(0, templateFileName.lastIndexOf("/"));

//取得模板的名字

String templateFile=templateFileName.substring(templateFileName.lastIndexOf("/"), templateFileName.length());

//取得生成文件的路徑

String genFileDir=fileName.substring(0, fileName.lastIndexOf("/"));

Template template = ConfigurationHelper.getConfiguration(templateFileDir).getTemplate(templateFile);

File fileDir=new File(genFileDir);

org.apache.commons.io.FileUtils.forceMkdir(fileDir);

File output = new File(fileName);

if(output.exists()){

//如何代碼已存在不重復生成

return false;

}

Writer writer = new FileWriter(output);

template.process(data, writer);

writer.close();

} catch (TemplateException e) {

e.printStackTrace();

return false;

} catch (IOException e) {

e.printStackTrace();

return false;

}

return true;

}

代碼中的Map 是模板所需要的數據,我們可以通過面向對像的方法把數據存在模板埋睜中public boolean genDaoInterface(String fileName){

DaoModel Model=new DaoModel();

//設置Dao實現類的包名

Model.setPackageName(DaoConstant.PACKAGE);

//取得介面名

String className=StringUtils.substringBefore(fileName,".");

//設置介面名彎散歲

Model.setClassName(className);

Map<String, Object> data = new HashMap<String, Object>();

data.put("model", Model);

//設掘基置生成的位置

String filePath=new String("src/"+package2path(DaoConstant.PACKAGE)+"/"+fileName);

//代碼生成

return super.generate(DaoConstant.INTERFACE_TEMPLATE, data, filePath);

}

data.put("model", Model);由這句代碼可看出我們將可以在模板中直接調用這些數據package ${model.packageName};

public interface ${model.className} extends BaseHibernateDao {

}

Ⅷ java 用freemark的好處

freemark的好處有以下幾點:

  1. 可以徹底的分離表現層和業務邏輯。

  2. 可以提高開發效率。

  3. 使得開發過程中的人員分工更加明確。


同時也有些缺點:

  1. 應用FreeMarker模板技術,在修改模板後,可能會看到已經過期的數緩高首據。如:生成靜態的HTML頁面後,如果一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,用戶看到的就是過期的數據。

  2. FreeMarker模板技術在應用過程中,FreeMarker中的變數必須要賦值,如果念桐不賦值,那麼就會拋出異常。想避免錯誤就要應用if/elseif/else指令進行判段,如果對每一個變數都判斷的話,那麼則反而增加了編程的麻煩。

  3. FreeMarker的map限定key必須是string,其他擾數數據類型無法操作。

  4. FreeMarker不支持集群應用。為了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程中確實方便,但如果將應用放到集群中,就會出現錯誤。

Ⅸ freemarker

官網原文 https://freemarker.apache.org/
看不進去,所以就自己翻譯一下官網原文,但是感覺速度太慢啦!!!

apache freemarker 是一個模板引擎,一個基於模板和變化的數據去生成輸出文本(HTML 網站頁面,郵箱,配置文件,源代碼等等)的java庫。模板是用freeMarker 模板語言(FTL)(並不是一個像PHP那樣的成熟語言),一個簡單特殊的語言去寫的。通常情況下,一個通用編程語言如java去准備數據(查詢db,做業務計算),然後Apache freemarker去使用模板展示數據。在模板中你關注的是怎樣呈現數據,在模板之外,你要掘含關注的是呈現的是哪些數據
image.png image.png
這種方法被稱為MVC模式(model View Controller),並且在動態網頁中特別受歡迎。並且對前後端分離非常有幫助,派散悄前端頁面的設計者在使用模板中不用面對復雜的後台邏輯,並且可以在不修改工程或者重新編譯的情況下,去改變前端頁面的樣式
freemarker最初是為了在MVC框架模式中生成HTML頁面所創造的,但它並不非得綁定到servlets 或者 HTML或者與web關聯,它是可以用在非web應用環境中的

一些freemarker的優勢
1.強大的模板語言,Conditional blocks(條件塊), iterations(迭代), assignments, string and arithmetic operations(算術運算) and formatting(格式化), macros(宏) and functions(函數),可以引入其他模板語言,默認下是此功能時關閉的
2.多用途和輕量級的:0依賴,任何的輸出格式,能夠從任何地方載入模板(插入),有許多配置選項
3.國際化/根據語言塵渣環境而變化:可以根據語言環境使其數字,數據/時間格式變化,也可以局部模板發生變化
4.處理XML功能:可以刪除xml DOM-S,也可以遍歷它們,甚至可以聲明它們
5.通用數據模板:通過插入適配器,在模板中的java對象可以作為變數樹,決定模板如何看待它們

Apache FreeMarker is Free software, licensed under the Apache License, Version 2.0. See the license here... .

Note that the project is owned by the Apache Software Foundation since 2.3.24-pre01 (2015-09-02). Earlier releases, such as 2.3.23, has a different right owner.

假設你需要一個網站的前端頁面,和下面的類似

但是用戶的名字是根據登錄者的不同去變化的,最新的數據來自db中,由於這個數據是變化的,所以無法使用靜態HTML,此時可以使用要求輸出模板,模板和靜態HTML相同,只是它會包含一些freemarker指令使其變為動態

這個模板存儲在web伺服器,和靜態HTML頁面相同,當有人來訪問這個頁面,freemarker會介入,將html中的模板${...}動態替換成最新的內容,並且將結果返回用戶瀏覽的瀏覽器。用戶的web瀏覽器會接受到一個和第一個實例代碼類似的html頁面(不含有freemarker指令),並且伺服器中的模板不會被改變,替換只是出現在web 服務的相應中

注意。模板當中不含有查找當前訪問者是誰的邏輯,或者去查詢資料庫獲取最新數據的邏輯,被顯示的數據是在freemarker之外事先准備的,通常是由java等編程語言去獲取的。模板的使用者不需要知道這些值是如何計算的。事實上,這些值可以被修改,但是模板完全不變,頁面樣式可以被改變,模板也不改變,當前後端分離時,freemarker是非常有用的。保證模板專注於顯示問題(視覺設計,布局和格式化)是高效使用模板引擎的關鍵

為模板准備的全部數據被稱為數據-模型,模板作者要關心的是,數據模型是一個樹形結構(像在硬碟上的文件夾和文件),這些數據模型可以看做下面的結構
image.png image.png
注意:上面僅僅是一個形象化的描述,數據模型不是文本格式,它來自java對象,對於java程序員來說,root 也許是一個有getUser和getLastesProce方法的java對象,或者是一個帶有user 和 latestProdects key的java Map,同樣的,latestProdect 也許是一個java對象帶有getUrl 和 getName方法

早期時候,可以通過user,lastProdect.name獲取數據,如果我們繼續類比,數據模型就像一個文件系統,root 和 latestProdect就像是文件夾,user,url 和 name是這些目錄中的文件

概括來說,在freemarker中使用模板+數據模型完成數據輸出

Template + data-model = output

如下圖所見,數據模型就像是一個基本的樹,這個樹結構可以越來越復雜,有更深的深度
image.png image.png
這些扮演文件夾的變數(root,animals,mouse,elephant,python,misc)被稱為hashes,hashes存儲其他變數(子變數),可以通過名字查找他們
這些存儲數值的變數被稱為scalars

當想在模板中使用子變數,你需要從根指定它的路徑,並且用點去分割。想訪問price 或者 mouse,應該寫為animals.mouse.price

另一個重要的變數是序列(sequences),他們想hashes一樣存儲子節點,但是子節點沒有名字,他們僅僅在一個list當中,在這個數據模型中,animals和misc,fruits是序列
image.png image.png
可以使用方括弧加數字索引去訪問一個序列,索引從0開始,獲取animal的第一個名字就寫成animals[0].name(實際中,一般只會按順序遍歷數據,而不是關心索引).
Scalars可以分為以下類別
1.字元串
2.數字
3.時間
4.布爾
總結:
1.數據模型可以看出樹形
2.scalars存儲一個值,這個值可以是字元串,數字,時間,布爾
3.hashes是一個存儲變數的容器,可以通過名字查找他們
4.序列是一個順序存儲遍歷的容器,索引從0開始

其他不是FTL標簽或者interpolation或者注釋的都會被認作靜態文本,並輸出到頁面

FTL標簽也被稱為指令,和html標簽和html元素相似

通過if指令,可以選擇性跳過模板

讓我們詳細說說condition:==是一個基本的操作如果左側的值與右側的值相等,並且結果是一個布爾值,等號左側是引用的變數,這種語法結構我們已經很熟悉了。這個變數值將會被等號右側所替代。總結來說,沒有被引號標注的都會被視為變數。
右側是字元串,在模板中的字元串只能放在引號內

如果需要把數據列出來,舉例如果想這個模板與數據模型合並,要像下面這樣

如果用list,如果list中為0,還是會執行一下循環中的值,所以可以用item

其他比較頻繁使用的list:
<p>Fruits: <#list misc.fruits as fruit> {fruits?join(", ", "None")}*
所有指令( (list, items, sep, else))可以一起使用

使用include指令你可以將其他文件的內容放入模板

被引用的文件right_footer.html

注意freemarker並不解析FTL 標簽,interpolations 和FTL 注釋以外的其他文本,注釋,和interpolations
使用內建函數
內建函數很像子變數(或者更像java中的方法),並不來自數據-模型,但是通過freemarker添加的。為了獲知自變數是從哪裡來的,你需要用?去代替.
1.user?upper_case給出user的大寫形式
2.animal.name?cap_first使其首字母大寫
3.user?length給出user的字元數量
4.animals?size給出animals序列中項目的個數
5.如果在<#list animals as animals>和</#list>中
1.animal?index 提供基於0的所有數
2.animal?counter 很像索引,但是是基於1的索引
3.animal?item_parity 基於當前計數的奇偶,給出字元串"odd"或者"even",這個在給行著色的時候特別有用,比如"<td class="${animal?item_parity}Row">"
一些內建函數需要參數來指定行為
1.animal.protected?string("Y","N")根據animal.protected去返回Y或者N
2.animal?item_cycle('lightRow','darkRow')是之前itme_parity更常見的變體
3.fruits?join(","):將list 轉換為string,並且用分隔符的參數去連接它們(like "orange, banana")
4.user?starts_with("J")根據user的首字元是否是J給出true或者false
5.animal?filter(it -> it.protected)展示受保護的元素
animals?filter(it -> it.protected) gives the list of protected animals.
<#list animals?filter(it -> it.protected) as animal>...</#list>.

數據模型經常有變數是不存在的,除了一些特殊的人為錯誤,freemarker是無法忍受不存在的變數的,以下是最常用的兩種處理方法
當指向一個變數,你可以在變數名後面加!去指定一個默認值當變數缺失,像下面的情況,當user在數據模型中缺失,模板將顯示"visitor".(當user沒有丟失,模板將顯示數據)

也可以在名字後面加??來詢問變數是否缺失,如果這個user缺失,那麼你可以跳過此訪問

轉義其他的HTML,XML和其他的markup
如果 {name}會輸出"Someone & Co."
使用ftlh,freemarker將自動轉義Html中的所有帶有${...}

(如果生成的是XML,則使用XML代替HTML)
此方法需要版本在2.3.24以上

理解數值和類型的概念是理解數據類型的基礎,但是數據和類型並不局限於數據模型

我們說user變數值為"Big Joe",today值為Jul 6, 2007,,,,lotteryNumbers裡面有很多值,並且包含很多值,這就像一個盒子包含其他一些東西(容器),整個盒子會被看成一個獨立的主題,最後還有一個數值cargo,他是一個hash值,所以,一個值有時可以存儲在一個變數中,但是不需要存儲在變數中的數值也可以成為數值

數值有一個很重要的方面,他們的類型
一個數值可以同時包含很多類型
image.png image.png
看了不同的數據模型實例可能會意識到:被root標識的內容,僅僅是一種類型hash的值,但編寫類似user,那就意味著想要將user存儲到root hash上,這里沒有名為root的變數,就起不到任何作用

Ⅹ freemarker中表達式 ${(user.name)!""}當user為空時,直接報錯,咋回事

FreeMarker是一個用Java語言編寫的模板引擎,它寬廳肢基於模板來生成文本輸出,用FreeMarker判斷對象是否為空的方法。

  1. 一般數據在後端判斷, 前端不管邏輯只管顯示。

  2. freemarker中顯示慎世某對象使用${name}.
    但如果name為null,freemarker就會報錯。如果需要判斷對象是否為空:<#if name??>……</#if>。當然也可以通過設置默認值${name!""}來避免對象為空的錯誤。如果name為空,就以默認值(「!」後的字元)顯示。

  3. 對象user,name為user的屬性,這時user,name都有可能為空,可以伏談寫成${(user.name)!""},表示user或者name為null,都顯示為空。

熱點內容
linux下載gcc 發布:2024-11-02 14:13:47 瀏覽:344
寫演算法交易 發布:2024-11-02 13:57:09 瀏覽:208
安卓怎麼下載鴻蒙 發布:2024-11-02 13:36:13 瀏覽:663
加密狗rsa 發布:2024-11-02 13:20:44 瀏覽:560
實用java教程 發布:2024-11-02 13:07:39 瀏覽:930
ide文件夾 發布:2024-11-02 12:51:37 瀏覽:559
python中字典的用法 發布:2024-11-02 12:40:42 瀏覽:28
安卓怎麼下載zine 發布:2024-11-02 12:40:38 瀏覽:793
深入理解java虛擬 發布:2024-11-02 12:40:36 瀏覽:557
延吉麻將源碼 發布:2024-11-02 12:39:36 瀏覽:226