当前位置:首页 » 编程语言 » 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,都显示为空。

热点内容
安卓手机在哪里进抖音直播间 发布:2024-11-02 12:31:59 浏览:219
android让状态栏透明 发布:2024-11-02 12:20:09 浏览:180
java反射使用 发布:2024-11-02 12:09:03 浏览:921
赚钱游戏挂机脚本链接 发布:2024-11-02 12:08:22 浏览:810
windowsxp用户名和密码是什么啊 发布:2024-11-02 12:03:13 浏览:950
工行解压码 发布:2024-11-02 12:03:07 浏览:118
本田冠道出厂配置什么牌子轮胎 发布:2024-11-02 12:03:07 浏览:470
怎么打开被gcc编译过的软件 发布:2024-11-02 12:00:52 浏览:435
新时达as380原始密码是多少 发布:2024-11-02 11:51:27 浏览:810
导航网站源码下载 发布:2024-11-02 11:49:55 浏览:976