freemarker的使用心得,freemarker使用心得
来源:互联网 发布:2016零售业数据 编辑:程序博客网 时间:2024/05/17 04:15
freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。
一 第一个freemarker程序
freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了
freemarker的运行原理总结起来就是如下四点:
(1)初始化freemarker配置实例
(2)创建数据模型
(3)加载模板文件
(4)显示生成后的数据
如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下面这段程序
package org.lxh;import java.io.*;import java.util.*;import freemarker.template.Configuration;import freemarker.template.Template;public class FirstFreemarker {public static void main(String[] args) throws Exception {//创建freemarker配置实例 Configuration config=new Configuration(); config.setDirectoryForTemplateLoading(new File("template")); //创建数据模型 Map<String,String> m=new HashMap<String,String>(); m.put("name", "cry"); //加载模板文件 Template t=config.getTemplate("index.ftl"); //显示生成后的数据 Writer w=new OutputStreamWriter(System.out); t.process(m, w); w.close();}}运行效果如下所示:
二 freemarker进阶
如果觉得freemarker的能力就这么点那就错了,freemarker还包含数据类型、条件判断、数据遍历、内建函数等,这些功能对日常开发已经足够,看下面这段程序
package org.lxh;import java.io.File;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import freemarker.template.Configuration;import freemarker.template.Template;public class UseIf {public static void main(String[] args) throws Exception {//创建freemarker配置实例 Configuration config=new Configuration(); config.setDirectoryForTemplateLoading(new File("template")); //创建数据模型 Map<String,Object> m=new HashMap<String,Object>(); m.put("score", new Random().nextInt(100)); UserInfo u1=new UserInfo(); u1.setName("仓木麻衣"); u1.setPassword("123456"); UserInfo u2=new UserInfo(); u2.setName("柯南"); u2.setPassword("654321"); List<UserInfo> all=new ArrayList<UserInfo>(); all.add(u2); all.add(u1); m.put("userList", all); m.put("time", new Date()); m.put("str", "北京,上海,杭州"); //加载模板文件 Template t=config.getTemplate("useif.ftl"); //显示生成后的数据 Writer w=new OutputStreamWriter(System.out); t.process(m, w); w.close();}}
看下模板文件的内容:
--------------if语句的使用----------------<#if score gte 60> 及格<#elseif score gte 80&&score lte 90>良好<#else>高材生</#if>--------------空值判断、默认值---------------${name!"未定义"}--------------判断值是否存在------------<#if name??> name存在<#else> name不存在</#if>-------------使用list遍历数据--------------<#list userList as user><#if user_has_next> 最后一组:${user.name}-${user.password}<#else>${user.name}-${user.password}</#if></#list>-------------其他内建函数-----------------(1)日期格式化${time?string("yyyy-MM-dd")}(2)截取字符串${str?substring(0,2)}(2)indexof的使用${str?last_index_of(",")}(2)split的使用<#list "12,13,14,15"?split(",") as item>${item}</#list>
对于list的遍历有两个隐含变量用的比较多分别是_index _has_next ,详细的使用可以百度一下,真的很简单
三 freemarker宏指令
宏指令可以简单理解成在freemarker可以自己定义的公共方法,具体用途主要用于分页,来看下面的这个最简单的例子
package org.lxh;import java.io.File;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.HashMap;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.Template;public class UseMacro {public static void main(String[] args) throws Exception {//创建freemarker配置实例 Configuration config=new Configuration(); config.setDirectoryForTemplateLoading(new File("template")); //创建数据模型 Map<String,Object> m=new HashMap<String,Object>(); m.put("type", "other"); m.put("num1", 2); m.put("num2", 3); //加载模板文件 Template t=config.getTemplate("macro.ftl"); //显示生成后的数据 Writer w=new OutputStreamWriter(System.out); t.process(m, w); w.close();}}
模板文件的内容如下:
----------------------宏指令的使用 m1可以看成是方法的名称,num1、num2为入参----------------------<#macro m1 num1 num2><#assign result=num1+num2><h3>${result}</h3></#macro><@m1 5 6/>----------------------宏指令(嵌入式)-----------------<#macro m2><h3><#nested></h3></#macro><@m2>hello world</@m2>
运行效果如下:
四 其他指令
包含指令:<#include "test.txt" />
import指令:<#import "b.ftl" as bb />
<#macro copyright date> <p>Copyright (C) ${date}.</p> </#macro>
当ftl文件比较多的时候,而且这些ftl有引用关系,这个时候import就可以大展拳脚了,如<@bb.copyright date="2010-2011" />
五 struts2中使用freemarker
struts2是不能直接使用freemarker的,如果一定要用可以:
(1)解压struts2-core-X.X.X.jar文件,把在META-INF文件夹下面的struts-tags.tld文件复制到WEB-INF文件夹下。 将freemark的jar导入到工程中
(2)在web.xml文件中配置freemark同时启动JSPSupportServlet.代码如下
<servlet> <servlet-name>freemarker</servlet-name> <servlet-class> freemarker.ext.servlet.FreemarkerServlet </servlet-class> <!--下面的配置freemarke的ftl文件的位置 --> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <!-- 是否和服务器(tommcat)一起启动。--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>freemarker</servlet-name> <url-pattern>*.ftl</url-pattern> </servlet-mapping><servlet> <!-- define a JspSupportServlet Object --> <servlet-name>JspSupportServlet</servlet-name> <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> <!-- setting JspSupportServlet auto start --> <load-on-startup>1</load-on-startup> </servlet>
(3).在FreeMarker模板中使用assign指令导入标签库,这样在freemarker中就可以使用struts2的标签了
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:这里我把struts-tags.tld放在WEB-INF下面
(4)在FreeMarker模板中使用struts标签
<@s;property value=""/>
注:struts使用freemarker要在result的节点加上type="freemarker"
对于这种做法有些时候不好用,freemarker也提供了在jsp页面使用freemarker的方法,同样的还是需要把freemarker的tld文件放在WEB-INF下面,这个文件如果找不到可以建一个叫fmtag.tld的文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd"><taglib> <tlibversion>2.0</tlibversion> <jspversion>1.1</jspversion> <shortname>FreeMarker JSP Support</shortname> <tag> <name>template</name> <tagclass>freemarker.ext.jsp.FreemarkerTag</tagclass> <bodycontent>tagdependent</bodycontent> <info>Allows evaluation of FreeMarker templates inside JSP</info> <attribute> <name>caching</name> <required>false</required> </attribute> </tag></taglib>
接下来看看在jsp中怎么使用freemarker
(1)jsp页面引入freemarker标签库
<%@ taglib prefix="fm" uri="/WEB-INF/fmtag.tld" %>
(2)嵌入freemarker
<fm:template> freemarker语句</fm:template>
综合前面的情况无论怎么用是不是都很简单呢
六 扩充freemarker内建函数
freemarker虽然提供很多内建函数,但仍然有需要自定义的时候,freemarker也运行用户写自定义函数,如下所示:
public class MyFmTag implements TemplateMethodModel {public Object exec(List param) throws TemplateModelException {Object result=null;if("save".equals(param.get(0).toString())){//调用保存方法}return result;}//保存方法................}使用的时候就像下面这样就ok了
<#assign check= "org.lxh.util.MyFmTag"?new()/>
<#assign result=check('save','xxx')/>
指教下freemarker怎使用?
1.在lib中加入freemarker的包
2.在文件templates创建一个文件 test.ftl
内容为:
${name},你好,${msg}
3.创建类4个步骤,具体看类中的使用
package abin;
import java.io.File;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* 模板文件(hello,${name})+数据模型(name="******")----------经过FreeMarker整合----输出(hello,******)
* 经过4个步骤,见下面
* @author chenhaibin
*
*/
public class HelloFreeMarker
{
private Configuration conf;
//1 创建Configuration实例,该实例负责管理FreeMarker的模板加载路径
public void first() throws Exception
{
conf=new Configuration();
//放置test.fsl文件的路径
conf.setDirectoryForTemplateLoading(new File("templates"));
}
private Template t;
//2 使用Configuration实例生成Template实例,同时加载指定的模板文件
public void second() throws Exception
{
t=conf.getTemplate("test.ftl");
}
private Map datamap;
//3 填充数据模型
public void third()
{
datamap=new HashMap();
datamap.put("name", "chenhaibin");
datamap.put("msg", "欢迎使用FreeMarker!");
}
//4 合并处理
public void four() throws Exception
{
t.process(datamap, new OutputStreamWriter(System.out));
}
public static void main(String[] args) throws Exception
{
HelloFreeMarker hfm=new HelloFreeMarker();
hfm.first();
hfm.second();
hfm.third();
hfm.four();
}
}
4.结果是:
chenhaibin,你好,欢迎使用FreeMarker!...余下全文>>
freemarker集群问题
数据库建议还是使用Mysql做集群吧,或者用Oracle,一台就搞定,不过服务器配置要好一点。
前端可以使用Lighttpd+Squid+Apache的配置,减少服务器的压力,使用负载均衡;业务逻辑和数据库之间可以使用membercached+hibernate来实现对数据的缓存。
对静态资源实施FastCDN加速,把图片、CSS文件、JS文件等存放在静态资源服务器上。
前端的话使用Java或者PHP并不是那么重要了。
推荐适用于大型应用的Java框架:
Struts2(Webwork) + Spring + Hibernate(include membercached) + Freemarker or JSP(推荐使用Freemarker,页面执行速度接近Html静态页面了)
Hibernate 可以换成 ibatis3.0,然后根据需要自己开发与Membercached的集成。
优点:
1、开发速度明显优于Struts1,目前本人正在使用Struts2,深有体会;
2、维护成本降低,比较适应需求的不断变更;
3、学习曲线较短,比较适合小团队快速上手;
4、现成的成熟的插件丰富,很多组件不需要自己开发;
缺点:
1、团队里必须有人对其要有深入的理解,否则优化它的效果甚微;
2、前期的准备工作比较繁重,但是后期会比较轻松;
3、部份重要功能成为鸡肋,如自带的Ajax、JSON插件(根本无法使用,慢到死,要么就功能不完善,还要有很棒的代替品:jQuery、Gson等)
前端甚至可以使用Membercache对页面内容进行缓存,可以达到动态静态的快速转换。
服务器的优化及选择:
Sun的技术,当然配合Sun的服务器才会达到质的飞跃(注:我不是Sun的托,只是Sun公司到我们公司做过服务器的对比测试而已)。
同配置下性能对比:
Sun Solaris > Linux(Windows)
- freemarker的使用心得,freemarker使用心得
- freemarker的使用心得
- freemarker的使用心得
- freemarker使用心得
- FreeMarker的一些使用心得和技巧
- Struts2 Freemarker Jmesa(表格、分页) 使用的一点心得
- 使用FreeMarker生成Word出错的一点心得
- 使用freemarker中的小数点处理的一点心得!
- FreeMarker的基础语法使用 && 心得和技巧
- Freemarker的使用
- freemarker的初步使用
- freemarker 的使用
- freemarker的TemplateExceptionHandler使用
- FreeMarker的简单使用
- Freemarker的使用
- Freemarker的使用
- freemarker的使用总结
- freemarker的使用
- r语言学习日记(一)
- 缓冲管理
- L2-004. 这是二叉搜索树吗?
- NB-IoT:归一化网络,多样化应用
- Servlet 生命周期、工作原理
- freemarker的使用心得,freemarker使用心得
- hibernate xml配置方式
- #include <sys/types.h>的作用
- Yii2之资源配置$jsOptions与$cssOptions
- XHR 实例 GET 和 POST 异步和同步
- Node.js进程通信模块child_process
- 用代码展开 select 下拉菜单
- C++ 编程题练习-priority queue练习题(9-6)
- 【JZOJ4594】Dynamic len