- 浏览: 513831 次
- 性别:
- 来自: 南京
最新评论
-
usenrong:
转载 http://www.ijiandao.com/safe ...
DDOS及CC攻击防护经验 -
usenrong:
/sbin/iptables -I INPUT -p tcp ...
CentOS_6.5配置iptables防火墙策略 -
usenrong:
http://maven.aliyun.com/nexus/
aliyun阿里云Maven仓库镜像地址——加速你的maven构建 -
buxin_2008:
qkjava 写道安装了 boot2dockerhttps:/ ...
Docker介绍以及其相关术语、底层原理和技术 -
usenrong:
1.查找文件find / -name filename.txt ...
Java 开发必会的 Linux 命令
1,截取字符串 有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度 < lt. <= lte. > gt. >= gte <#if jstbqkVO.gzdd?length lt 8> 意思就是如果这个字符串的长度小于8,那么就正常显示,反之则取4位 2.连接字符串 ${"Hello," + user + "!"} //输出结果为:hello,gs! 3,日期格式和boolean 类型,转化为string类型 例子2: ${lastUpdate?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdate?string("EEE,MMM d, ''yy")} ${.................("EEEE,MMM dd,yyyy, hh:mm:ss a '('zzz')'")} 输出结果如下: 2003-04-08 21:24:44 Pacific Daylight Time Tue,Apr 8,'03 Tuesday,April 08,2003,09:24:44 PM (PDT) 例子3: <#assign foo=true/> ${foo?string("yes","no")} //输出结果:yes 4,排序: 1.升序.sort_by() <#list list?sort_by("字段") as x> 2.降序.sort_by()?reverse <#list list?sort_by("字段")?reverse as x> 5去空格: ${xx?trim} 6数值精度控制 mX:小数部分最小X位。 MX:小数部分最大X位。 例子: <#assign x=2.582/> <#assign y=4/> #{x; M2} //2.58 #{y; M2} //4 #{x; m1M2} //2.58 #{y; m1M2} //4.0 7特殊字符串的转义 \":双引号 \\:反斜杠 \r:回车 \b:退格键 \':单引号 \n:换行 \t:Tab \f:Form feed \l:< \g:> \a:& \{:{ \xCode:直接通过4位的十六进制数来指定Unicode码 ,输出改Unicode对应的字符。 * 所谓顶层变量就是直接放在数据模型中的值。 Map root = new HashMap(); root.put("name","yeeku"); //name是一个顶层对象 * 对于顶层变量,直接使用${variableName}来输出变量值 * 集合连接运算是将两个集合连接成一个新的集合,连接集合的运算符是'+'. <#list ["一","二","三"] + ["四","五","六"] as x> ${x} </#list> //输出结果如下: 一二三四五六 * 取整运算 <#assign x=5> ${(x/2)?>int} //2 ${1.1?int} //1 ${1.999?int} //1 ${-1.1?int} //-1 =(==) :判断两个值是否相等 != :............不相等 >(gt) :判断左边是否大于右边 >=(gte) :..... <(lt) :..... <=(lte) :..... 12 逻辑运算符 * 逻辑运算符只能作用于布尔值,否则将产生错误. 逻辑与:&& 逻辑或:|| 逻辑非:! 13 内置函数 html:字符串中所有的特殊HTML字符都需要用实体引用来代替(比如<代替<) 序列使用的内建函数: length:字符串的长度 string :把其他格式的数据,转化为string类型 例: ${test?html} 假设字符串test存储”Tom & Jerry”,那么输出为: Tom & Jerry ${seasons?size} ${"horse"?cap_first} 假设seasons存储了序列"winter", "spring", "summer", "autumn",那么上面的输出将会是: 4 14.运算符优先级 * 推荐使用括号来决定运算优先级. 1>.一元运算符: ! 2>.内建函数 : ? 3>.乘除法 : *,/,% 4>.加减法 : +,- 5>.比较 : <,>,<=,>=(lt,lte,gt,gte) 6>.相等 : ==(=),!= 7>.逻辑与 : && 8>.逻辑或 : || 9>.数字范围 : .. 15,freemarker判断返回值是否为空,null的方法 对于null,或者miss value,freemarker会报错 FreeMarker的常用指令 <#if condifition> ... <#elseif condifition> ... <#else> ... </#if> <#switch value> <#case refValue1> ... <#break> <#case refValue2> ... <#break> <#default> ... </#switch> <#list sequence as item> ... </#list> * item_index :当前变量的索引值. * item_has_next :是否存在下一个对象. 例子: <#list ["星期一","星期二","星期三","星期四","星期五","星期六"] as x> ${x_index + 1}.${x} <#if x_has_next>,</#if> <#if x="星期四"><#break></#if> </#list> 输出结果: 1.星期一, 2.星期二, 3.星期三, 4.兴趣四, 4>.include指令 :用于指定包含指定页面. <#include filename [options]> * filename: 该参数指定被包含的模板文件. * options : 该参数可以被省略,指定包含时的选项,包含encoding和parase两个选项. <#import path as mapObject> * path :指定要被导入的模板文件. * mapObject :是一个Map对象. 意思:将path路径中的变量都放在mapObject中. 例子:<#import "/lib/common.ftl" as com> noparse指令指定FreeMarker不处理该指令里包含的内容. <#noparse>...</#noparse> * escape:该指令导致body区的插值都会被自动加上escape表达式. * escape指令解析模板时起作用,而不是在运行时起作用. * escape指令也嵌套使用,子escape继承父escape的规则. * 如果需要指定某些插值无需添加escape表达式,则应该使用noescape指令. <#escape identifier as expression> ... <#noescape>...</#noescape> ... </#escape> * 它用于为该模板页面创建或替换一个(顶层)或多个变量. 第一种用法:<#assign name="value" [in namespacehash]> in子句用于将创建的name变量放入namespacehash命名空间中. 第二种用法:<#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]> 第三种用法: 是指将assign指令的内容赋值给name变量. <#assign name [in namespacehash]> capture this </#assign> 例子: <#assign x> <#list ["一","二","三"] as n> ${n} </#list> </#assign> ${x} 补充.global指令,全局变量赋值 :该指令用于设置FreeMarker的运行环境. <#setting name=value> name的取值范围如下: locale:该指令指定该模板所使用的国家语言/语言选项. number_format:该指令指定格式化输出数字的选项. boolean_format:该指令指令两个布尔值的语法格式,默认值是"false". date_format、time_format、datetime_format:格式化输出日期的格式. time_zone: 设置格式化输出日期时所使用的时区. 宏和变换器变量是两种不同类型的用户自定义指令,他们的区别是: . 编写函数 2.注册与使用 有两种方式: (1).在模板文件中注册,在模板中使用 <#assign getSysdate= package com.freemarker.test.SqlGetSysdateMethod?new()> <#assign curdate= getSysdate(yyyy-MM-ddt)/> <#macro pagination totalCount pageSize> <#--声明一个函数transform 转换uri,在新的uri上pager_offset参数 --> <#assign transform = "util.TransformURI"?new()> <#--声明一个函数,得到当前页码--> <#assign pagerOffset = "util.PagerOffset"?new()> <#--声明一个函数,根据传入的totalCount,pageSize得到总页数--> <#assign pagerCount = "util.PageCount"?new()> <#assign pageCount=pagerCount(totalCount,pageSize)> <#--得到当前的URI和请求参数,得到当前的页码--> <#if request.queryString?exists> <#assign uri=request.requestURI+"?"+request.queryString> <#assign pageIndex=pagerOffset(uri)> <#assign new_uri=transform(uri)> <#else> <#assign uri=request.requestURI> <#assign pageIndex=pagerOffset(uri)> <#assign new_uri=transform(uri)> </#if> <#if (pageIndex>pageCount)> <#assign pageIndex=pageCount> </#if> <#if (pageIndex>1)> <a href="${new_uri+1}" title="首页"><<</a> </#if> <#--如果前面页数过多,显示"..."--> <#if (pageIndex>5)> <#assign prevPages=pageIndex-9> <#if prevPages lt 1> <#assign prevPages=1> </#if> <#assign start=pageIndex-4> <a href="${new_uri+prevPages}" title="向前5页">...</a> <#else> <#assign start=1> </#if> <#-- 显示当前页附近的页--> <#assign end=pageIndex+4> <#if (end>pageCount)> <#assign end=pageCount> </#if> <#list start..end as index> <#if pageIndex==index> <b>${index}</b> <#else> <a href="${new_uri+index}">${index}</a> </#if> </#list> <#--如果后面页数过多,显示"...":--> <#if (end lt pageCount)> <#assign endend=end+5> <#if (end>pageCount)> <#assign end=pageCount> </#if> <a href="${new_uri+end}" title="向后5页">...</a> </#if> <#-- 显示"下一页":--> <#if (pageIndex lt pageCount)> <a href="${new_uri+pageCount}" title="末页">>></a> </#if> </#macro> 自定义了三个方法: PageCount.java package util; import java.util.List; import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateModelException; /** * 根据传入的参数,计算出所有的页数 * @author legolas */ public class PageCount implements TemplateMethodModel { @Override public Object exec(List args) throws TemplateModelException { Integer totalCount = 0; Integer pageSize = 0; try { totalCount = Integer.parseInt((String) args.get(0)); pageSize = Integer.parseInt((String) args.get(1)); } catch (NumberFormatException e) { throw new TemplateModelException("请输入正确的总记录数和页面记录数"); } Integer pageCount = totalCount / pageSize + (totalCount % pageSize == 0 ? 0 : 1); return pageCount; } } TransformURI.java package util; import java.util.List; import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateModelException; /** * 根据传入的uri,在uri后面加上分页参数 * @author legolas * */ public class TransformURI implements TemplateMethodModel{ @Override public Object exec(List args) throws TemplateModelException { String uri = (String) args.get(0); int n = uri.lastIndexOf("?"); if (n == -1) { return uri + "?pager_offset="; } if (uri.lastIndexOf("?pager_offset") != -1) { uri = uri.substring(0, uri.lastIndexOf("=") + 1); return uri; } String queryString = uri.substring(n + 1, uri.length()); String suburi = uri.substring(0, n + 1); String[] strings = queryString.split("&"); for (int i = 0; i < strings.length; i++) { if (strings[i].startsWith("pager_offset")) { continue; } suburi += strings[i]; suburi += "&pager_offset="; } return suburi; } } PagerOffset.java package util; import java.util.List; import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateModelException; /** * 得到当前的页码 * @author legolas * */ public class PagerOffset implements TemplateMethodModel { @Override public Object exec(List args) throws TemplateModelException { String uri = (String) args.get(0); String[] string = uri.split("pager_offset="); if (string.length == 1) { return 1; } else { Integer pager_offset = 1; try { pager_offset = Integer.parseInt(string[1]); } catch (NumberFormatException e) { pager_offset = 1; } return pager_offset; } } } * FreeMarker作为视图组件是由Servlet负责加载该模板,并使用数据模型填充该模板,并且将填充后 的标准HTML响应输出给浏览者. * 在Struts2框架的支持下,Struts2框架充当了之前的Servlet角色. * 为了使所有的用户请求都经过Struts2框架处理,我们将所有的FreeMarker模板放在WEB-INF/ftl路径下. * 放在WEB-INF/路径下可以提供更好的安全性,因为Web容器会保证浏览者无法访问到WEB-INF/路径下的资源. 1>.FreeMarker模板内建的变量 2>.ValueStack中的变量. 3>.ActionContext中的变量. 4>.HttpServletRequest范围的属性. 5>.HttpSession范围的属性. 6>.ServletContext范围的属性. stack:代表ValueStack本身,可这样访问其中变量:${stack.findString('ognl expr')} action:代表刚刚执行过的Action实例. response:代表HttpServletResponse实例. request:代表HttpServletRequest实例. res:代表HttpServletRequest实例. session:代表HttpSession实例. application:代表ServletContext实例. base:代表用户请求的上下文路径. <#if Application.attributeName?exists> ${Application.attributeName} </#if> 使用struts2标签输出:<@s.property value="%{Application.attributeName}"/> <#if Parameter.parameter?exists> ${Parameter.parameter} </#if>
<a href>${jstbqkVO.gzdd?default("")}</a>
<#else>
<a href title="${jstbqkVO.gzdd}">${jstbqkVO.gzdd[0..3]?default("")}...</a>
</#if>
</#list>
</#list>8.顶层变量
9.集合连接运算符
10 算术运算符
11 比较运算符
cap_first:字符串的第一个字母变为大写形式
lower_case:字符串的小写形式
upper_case:字符串的大写形式
trim:去掉字符串首尾的空格
size:序列中元素的个数
数字使用的内建函数:
int:数字的整数部分(比如-1.9?int就是-1)9>.空值运算符
${test?upper_case?html}
TOM & JERRY
${seasons[1]?cap_first}
Spring
Horse
!:default value operator,语法结构为:unsafe_expr!default_expr,比如 ${mouse!"No mouse."} 当mouse不存在时,返回default value;
(product.color)!"red" 这种方式,能够处理product或者color为miss value的情况;
而product.color!"red"将只处理color为miss value的情况
??: Missing value test operator ,测试是否为missing value
unsafe_expr?? :product.color??将只测试color是否为null
(unsafe_expr)??:(product.color)??将测试product和color是否存在null
?exists:旧版本的用法
比如:<#if mouse??>
Mouse found
<#else>
No mouse found
</#if>
Creating mouse...
<#assign mouse = "Jerry">
<#if mouse??>
Mouse found
<#else>
No mouse found
</#if>1>.if指令
2>.switch、case、default、break指令
3>.list、break指令
5>.import指令
6>.noparser指令
7>.escape指令
8>.assign指令
9>.setting指令
10>.macro、nested、return指令
宏可以在模板中用macro指令来定义
变换器是在模板外由程序定义
1、宏:和某个变量关联的模板片段,以便在模板中通过用户自定义指令使用该变量
1-1、基本用法:
例如:
<#macro greet>
<font size="+2"> Hello JOE!</font>
</#macro>
使用时:
<@greet></@greet>
如果没有体内容也可以用
<@greet />
1-2、变量:
1)、可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义中有效。如:
<#macro greet person>
<font size="+2"> Hello ${person}!</font>
</#macro>
使用时:
<@greet person="emma"> and <@greet person="LEO">
输出为:
<font size="+2"> Hello emma!</font>
<font size="+2"> Hello LEO!</font>
注意:宏的参数是FTL表达式,所以,person=emma和上面的例子中具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意一种数据类型,甚至是一个复杂的表达式。
宏可以有多个参数,使用时参数的次序是无关的,但是只能使用宏中定义的参数,并且对所有参数赋值。如:
<#macro greet person color>
<font size="+2" color="${color}"> Hello ${person}!</font>
</#macro>
使用时:
<@greet color="black" person="emma" />正确
<@greet person="emma" />错误,color没有赋值,此时,如果在定义宏时为color定义缺省值<#macro greet person color="black">这样的话,这个使用方法就是正确的。
<@greet color="black" person="emma" bgcolor="yellow" />错误,宏greet定义中未指定bgcolor这个参数11>自定义函数的使用
package com.freemarker.test; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateModelException; public class SqlGetSysdateMethod implements TemplateMethodModel { public Object exec( List args ) throws TemplateModelException { //得到函数第一个参数,得到的字符串两头会有引号,所以replace String datePattern=(args.get( 0 ).toString()).replace( , ); Date date = new Date(); SimpleDateFormat sdf =new SimpleDateFormat(datePattern); return sdf.format( date ); } }
(2).处理模板文件时注册关键代码:
Map<String,Object> root=new HashMap<String, Object>();
root.put(getSysdate, new StringLengthMethod());
Configuration config=new Configuration();
File file=new File(templatePath);
//并加载模板文件
config.setDirectoryForTemplateLoading(file);
//设置包装器,并将对象包装为数据模型
config.setObjectWrapper(new DefaultObjectWrapper());
//获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
Template template=config.getTemplate(templateName,templateEncoding);
//合并数据模型与模板
template.process(root, out); 12>使用宏写一个简单的分页实例
7>.关于在FreeMarker中使用Struts2标签
8>.解析模板中的变量
* Struts2解析FreeMarker模板中变量的顺序如下:
* FreeMarker模板的内建变量如下:
9>.访问Servlet/JSp范围对象
1.访问Application范围内的属性.
2.访问HttpServletRequest中的参数
发表评论
-
对Java意义重大的7个性能指标
2015-11-17 15:05 4927个最有影响的衡量标 ... -
使用四种框架分别实现1百万websocket常连接的服务器
2015-07-11 22:06 1496目录 [−] 服务器的参数调优 -
微观SOA:服务设计原则及其实践方式(上篇)
2015-06-05 08:46 843大量互联网公司都 ... -
分布式RPC框架
2015-05-25 20:25 1234分布式RPC框架:Polaris 在长期的业务发展过程中,对 ... -
关于Java集合
2015-04-22 16:59 708在尽可能短的篇幅里, ... -
微信卡券卡包支付及红包发放系统HTTPS双向认证
2015-03-11 17:18 2874现在邮件发出的文件有四个,分别是apiclient_ ... -
tomcat基于域名的多应用部署及共享jar资源
2015-02-13 15:21 1038最近帮公司开 ... -
Hibernate Search 的常用注解
2015-02-10 19:05 7101. @Indexed -> index 指定索引名 ... -
如何构建高性能服务端程序
2014-12-01 10:52 918接触过很多编程语言, ... -
如何构建高性能服务端程序
2014-12-01 10:52 2接触过很多编程语言, ... -
如何构建高性能服务端程序
2014-12-01 10:50 2接触过很多编程语言, ... -
如何构建高性能服务端程序
2014-12-01 10:47 2接触过很多编程语言, ... -
Java应用的负载均衡、集群、高可用(HA)解决方案
2014-11-24 16:47 32031、熟悉几个组件1.1、apache —— ... -
Criteria 和 DetachedCriteria的区别与使用
2014-08-26 20:14 878Criteria 和 DetachedCriteria ... -
IntelliJ IDEA常用 快捷键
2013-10-08 10:17 1450代码提示 KEYMAP->Main m ... -
Intellij IDEA快捷键及其使用技巧
2013-08-27 14:09 11651. IDEA内存优化 先看看你机器本身的配置而配置. \I ... -
CKFinder 2.3 for java 破解使用
2013-06-26 14:39 1867CKFinder 2.3整合 for java 破解篇ckf ... -
SSH网上商城 基于Struts2 Hibernate Spring J2EE框架结构的电子商务网站
2013-01-31 11:15 2946一个基于Struts2 Hibernate Spring框架 ... -
. System.exit(0)和System.exit(1) 和return 区别
2013-01-30 08:38 30191、System.exit(0)和System.exit(1 ... -
解决MySQL错误reading initial communication packet
2013-01-06 15:51 3700使用navicat远程访问VPS云主机 出现如题rea ...
相关推荐
#### FreeMarker常用技巧 1. **条件判断**:使用 `<#if>` 和 `<#else>` 结构来根据条件显示或隐藏内容。 2. **循环**:通过 `<#list>` 循环遍历集合或数组。 3. **自定义指令**:除了宏之外,还可以定义其他类型的...
### Freemarker语法完整版知识点详解 #### A....通过以上详细解释,读者可以更好地理解Freemarker的核心概念、指令用法以及一些常见的技巧和注意事项,从而更高效地使用Freemarker进行模板渲染工作。
### Freemarker 中文手册知识点详解 #### 一、Freemarker 概述 - **定义与功能**:Freemarker 是一款用纯 Java 编写的...通过上述知识点的介绍,希望能够帮助读者更好地理解和掌握 Freemarker 的基本概念和使用技巧。
SSM框架,全称为Spring、SpringMVC和MyBatis的组合,是Java Web开发中常用的三大组件。在这个"SSM框架freemarker的demo...通过学习和实践这个示例,开发者可以更好地理解和应用SSM框架,并掌握FreeMarker的使用技巧。
- **必要的XML处理**:常用XML处理技巧。 - **声明的XML处理**:高级XML处理技巧。 #### 五、参考文档 - **内建函数参考文档**:详细介绍FreeMarker提供的内置函数。 - **指令参考文档**:详细列出FreeMarker支持...
4. **Freemarker的常用技巧**: - 使用`?default`处理空值,如`${variable?default("default value")}`。 - `?string`转换为字符串,避免输出null。 - `?html`防止XSS攻击,自动转义特殊字符。 - `?eval`执行...
内建函数部分涵盖了处理字符串、数字、日期、布尔值、序列、哈希表和XML节点的内建函数,以及一些不常用或者专家级的内建函数。指令参考文档则包含了if、else、elseif、switch、case、default、break、list、include...
二、常用Freemarker标签 1. `${...}`:这是Freemarker的表达式标签,用于输出变量的值。例如`${user.name}`将输出用户对象的name属性。 2. `<#if ...>` 和 `<#else>`:条件判断语句,用来根据条件决定是否渲染某个块...
以下是一些基于JSP和Java的网页常用技巧,这些技巧涵盖了从优化性能到提升交互性等多个方面: 1. **使用JSP标签库**:JSTL(JavaServer Pages Standard Tag Library)和EL(Expression Language)能让你的代码更...
Freemarker是一个强大的Java模板引擎,它允许开发者将业务逻辑与视图层分离,使得HTML、XML等静态页面可以通过模板动态生成。以下是关于Freemarker语法...实际开发中,熟练掌握这些技巧将大大提高工作效率和代码质量。
Freemarker是一个强大的模板引擎,常用于Web应用中的视图层开发,特别是在Java环境中。...开发者可以通过阅读这些文档,掌握Freemarker的全部特性和使用技巧,从而更高效地开发出高性能的Web应用。
掌握常用的指令对于编写复杂模板非常重要。 3. **表达式**:表达式用于获取数据模型中的数据并将其插入到模板中。熟悉表达式的语法可以提高模板的灵活性和可维护性。 4. **插值**:即如何在模板中插入变量值的过程...
以上只是FreeMarker的一部分内容,实际使用中还需要根据具体需求学习和掌握更多特性和技巧。FreeMarker的灵活性和强大功能使其成为Java Web开发中不可或缺的一部分,熟练掌握它能帮助开发者更高效地构建动态网页。在...
SpringBoot是由Pivotal团队开发的,旨在简化Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库配置,如JPA、Thymeleaf、RabbitMQ等,极大地提高了开发效率。 本项目的核心知识点包括以下几个方面: 1...
Freemarker是一款强大的Java模板引擎,它允许开发者将HTML页面设计和业务逻辑分离,从而让开发者专注于业务逻辑的实现,而...通过实践和不断学习,开发者可以掌握Freemarker的高级技巧,提升Web应用的开发效率和质量。
总结,"springboot-integration-examples"是一个非常实用的学习资源,无论你是初识SpringBoot,还是希望进一步提升SpringBoot的使用技巧,都能从中受益匪浅。通过深入研究和实践,你将能够熟练掌握SpringBoot与各类...
Freemarker是Struts2常用的一个模板引擎,用于生成动态HTML或其他类型的输出。它是基于Java的,非Java代码的模板语言,允许开发者将视图与控制逻辑分离。freeMarker_total.rar可能包含了完整的Freemarker教程,包括...
3. "Struts+Hibernate+Spring集成开发宝典.pdf":这可能是一本详细指南,专注于SSH框架的集成,包含了从基础到高级的集成技巧和最佳实践。 4. "struts.hibernate.spring整合.pdf":这个PDF文件可能是关于如何整合...
其对于Spring Boot的最常用的第一个小程序、JavaConfig和常见注解、启动改变、热部署、Springboot整合Thymeleaf/freemarker/JSP、异常处理、配置文件、日志、国际化等都使用案例进行了说明,并且在最后通过一个贯穿...
本章节将详细介绍Freemaker的基础概念、核心指令以及一些实用技巧,帮助开发者更好地理解和应用这一工具。 #### 二、核心概念与指令 ##### 1. 核心概念 - **Sequence (序列)**:对应于Java中的List或数组等非键值...