1、java freemarkerJava FreeMarker 资料整理和收集(一) 资料编号NO101Freemarker 简介FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序虽然FreeMarker具有一些编程的能力,但通常由Ja
2、va程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库Freemarker 开发配置原本对freemarker了解不多,只知道是一种模板语言,我的个人网站设计时都没有考虑到使用freemarker,而是直接JSP展示。在网站上线推广过程中了解到,各个搜索引擎对动态
3、的链接不够友好,就是说对于网站中XXX.action?name= 这种格式的链接,搜索引擎不予收录,网络蜘蛛更亲奈.html的静态链接,为了便于更方便的网站推广,所以将网站集成URLREWRITER+FREEMARKER 技术改写了全站链接。大家可以去网站看下效果, 细心的人还是可以看见.action的痕迹的。现在网站中有两套链接,.action的动态链接,.html的静态链接。链接的改写纯粹是为了便于网站的推广,URLREWRITER过滤器的使用,FREEMARKER模板语言开发,这两块本人将在后续文章中做详细讲解,本文将结合网站详细介绍STRUTS2+FREEMARKER的开发配置。1、
4、准备相应的JAR包,struts2-core- 2.0.11.2.jar,xwork-2.0.5.jar,ognl-2.6.11.jar,freemarker- 2.3.8.jar,commons-logging-1.0.4.jar2、 解压缩struts2-core-2.0.11.2.jar复制META-INF/struts-tags.tld复制到工程WEB-INF目录下,FREEMARKER中默认是不支持struts2标签的,所以需将标签库导入模板中。3、 修改WEB.XML文件,添加STRUTS2过滤器Java代码 struts2 org.apacher.sturts2.dispatch
5、er.FilterDispatcher struts2 /*注意:对于网络上所说的要想在Freemarker中使用Struts2标签必须配置一个新SERVLETJava代码 JspSupportServlet org.apache.struts2.views.JspSupportServlet 1在本人的实践中发现这步并非必须的,此处有待深入研究4、 接下来这步应该是最重要的,配置struts.xml文件Java代码 /secondPage.jsp以上ACTIN配置为正常使用STRUTS2的配置,但在结合FREEMARKER中则需做如下改变Java代码 /WEB-INF/template/se
6、condPage.ftl注意:元素的type 属性必须设置为freemarker,这是因为Freemarker模板文件必须由Freemarker模板引擎来解析,而Struts2内部实现了 Freemarker模板引擎,但我们必须声明返回结果类型为freemarker才可以经过以上四步,STRUTS2+FREEMARKER配置完成,可以进行开发应用,下面展示一个简单的实例Java代码IndexAction.java private Log log=LogFactory.getLog(IndexAction.class); private String username; private Stri
7、ng password; /* * 登录处理 * return * throws Exception */ public String getVediosByCategory() throws Exception log.info(执行了登录方法getVediosByCategory(); return SUCCESS; 省略相应(getter,setter方法) 创建登录页面index.jsp Java代码 登录名: 密码: 创建结果页面:user.ftl Java代码#- - 欢迎登录! 注意: 1、Struts2标签在JSP 页面中的写法与在Freemarker模板文件中的写法不同。Fr
8、eemarker模板文件是以开始,以结束 2、Freemarker模板文件的处理,通过Web容器是无法直接处理的,因此不要让用户直接访问模板 文件。在开发过程中,我们可以将Freemarker文件直接放到Web工程的 WEB-INF目录或其子目录下(用户无法访问WEB-INF目录下文件),并在相应的struts-*.xml文件中配置type=freemarker 来输出模板FREEMARKER接触不深,如有不足之处请大虾们多多指正(二) 资料编号NO102FreeMarker也是与Web容器无关的,也就是FreeMarker并不一定需要运行在Web容器中:FreeMarker同样可以应用于非W
9、eb应用程序环境.而且,FreeMarker并不是只能生成HTML页面,它也可以生成各种文本,如XML,RTF,Java源代码等。Struts2默认采用FreeMarker作为其模板文件,而Struts2所有的主题模板文件都是采用FreeMarker编写的,eclipse中的JSP,Java等模板文件也是采用FreeMarker技术.一、 在struts2中使用freemarker以一个简单的添加用户信息为例:当用户点击首页中的“添加用户”连接时,这时会发出一个添加用户页面的请求(addInput.action),然后通过我们的返回一个添加页面,下面是我们普通的struts2配置文件一般是这么
10、配置的:/addInput.jspaddInput.jsp文件:Insert title here添加用户:username:password: 或者采用struts2标签:Insert title here添加用户:在action返回的view是一个jsp页面,也可以改成是一个freemarker模板页面:/addInput.ftl addInput.ftl模板文件 当然我们希望能在addInput.ftl上也能够使用struts2的标签,需要在addInput.ftl页面最开始添加对struts2标签的引用: 注意:struts2在freemarker页面中标签写法和jsp页面的写法不同,
11、freemarker里是,jsp里是,一定不要写错了! 使用时发现对中文的支持不好,显示时中文出现乱码,这里修改下struts.xml配置文件: 现在就可以在struts2中正常使用freemarker了!二、 在java程序中使用FreeMarker FreeMarker的模板就是一个.ftl文本文件,在该文件中使用了一些FreeMarker的特别标记,这些标记会动态显示,或者控制程序输出,如下面的模板文件代码:$name,你好!$msg 这里类似于$的就是动态的内容,称作插值. 为了使用FreeMarker来将数据模型中的值合并到模板文件中,可按如下步骤进行: 1,创建Configurat
12、ion实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例 2,使用Configuration实例来生成Template实例,同进需要指定使用的模板文件 3,填充数据模型,数据模型就是一个Map对象 4,调用Template实例的process方法完成合并. 下面来看看几个测试实例,以加深我们的对模板语言的认识: 实例一:Freemarker基本使用方法: 我们下面就用一个使用FreeMarker来创建一个java测试程序,将模板中的内容输出的指定的文件中,来简单了解一下其基本语法,程序源代码如下:public void testFreemarker01() throws
13、Exception/指定模板文件路径(在项目下,你可以修改此路径)String dir = E:/workspace/freemarker/src/com/freemarker/test;/创建一个Configuration对象:该实例负责管理FreeMarker的模板加载路径,负责生成模板实例Configuration cfg = new Configuration();/配置freemarker从什么地方加载模板文件,通过创建的Configuration对象加载模板文件cfg.setDirectoryForTemplateLoading(new File(dir);/加载模板,生成模板实例
14、对象,同时制定所使用的模板文件Template template = cfg.getTemplate(test01.ftl);/定义数据模型(Map对象),并填充数据Map root = new HashMap();root.put(strvalue, 世界,你好);/定义输出,将其输出到指定文件中去Writer out = new FileWriter(dir+/test01_out.txt);/处理 执行,将模板与数据进行合并template.process(root, out);test01.ftl模板文件如下:第一个测试程序:$strvalue test01_out.txt文件内容结果
15、: 第一个测试程序:世界,你好 实例二:Freemarker中关于空值的处理问题: 当在模板文件中取值,拿不到,为空值时,freemaker默认会将错误信息打印在页面中或输出到指定文件中,为了将错误信息隐藏到后台,而不要现在前台页面中,需要设置setTemplateExceptionHandler 来忽略异常信息,具体代码如下:/关于空值的处理问题public void testFreemarker02() throws ExceptionString dir = E:/workspace/freemarker/src/com/freemarker/test;Configuration cfg
16、 = new Configuration();/配置freemarker从什么地方加载模板文件cfg.setDirectoryForTemplateLoading(new File(dir);color=red/增加设置忽略异常cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);/color/加载模板Template template = cfg.getTemplate(test02.ftl);/定义数据Map root = new HashMap();/root.put(strvalue, 世界,你
17、好);root.put(boolvalue, true);root.put(today, new Date();/定义输出Writer out = new FileWriter(dir+/test02_out.txt);template.process(root, out); 贴出模板文件test02.ftl:$strvalue$boolvalue?string(是,否)$today?string(yyyy年MM月dd日) 文件test02_out.txt显示结果: 是 2010年04月11日 如果上面的不设置忽略异常的话,则在模板文件中的$strvalue将取不到值而在页面显示错误,当然可以
18、在模板文件中可以使用条件判断将空值情况排除 。实例三:关于集合处理的问题 在模板中显示数据模型中集合列表信息, 显示集合列表信息: 条件判断: 条件$?string(1,0)关于这些还是去看实例吧,我就不在这里描述了。从实例中去学习其语法。 具体代码如下:/关于集合的处理public void testFreemarker03() throws ExceptionString dir = E:/workspace/freemarker/src/com/freemarker/test;Configuration cfg = new Configuration();/配置freemarker从什么
19、地方加载模板文件cfg.setDirectoryForTemplateLoading(new File(dir);/忽略异常cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);/加载模板Template template = cfg.getTemplate(test03.ftl);/定义数据Map root = new HashMap();List list = new ArrayList();for(int i=0; i10; i+)list.add(listvalue+i);root.put(li
20、st, list);/定义输出Writer out = new FileWriter(dir+/test03_out.txt);template.process(root, out); test03.ftl模板文件如下:listvalue:$v - $v_index $v_has_next?string(y,n) test03_out.txt显示结果如下: listvalue: listvalue0 - 0 y listvalue1 - 1 y listvalue2 - 2 y listvalue3 - 3 y listvalue4 - 4 y listvalue5 - 5 y listval
21、ue6 - 6 y listvalue7 - 7 y listvalue8 - 8 y listvalue9 - 9 n实例四:关于宏定义的应用/关于freemarker的宏定义public void testFreemarker04() throws ExceptionString dir = E:/workspace/freemarker/src/com/freemarker/test;Configuration cfg = new Configuration();/配置freemarker从什么地方加载模板文件cfg.setDirectoryForTemplateLoading(new
22、File(dir);/忽略异常cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);/加载模板Template template = cfg.getTemplate(test04.ftl);/定义数据Map root = new HashMap();root.put(name, 李四);/定义输出Writer out = new FileWriter(dir+/test04_out.txt);template.process(root, out); 来看看模板文件test04.ftl:Hello,$p
23、来看看输出文件的结果: Hello,张三 Hello,李四实例五:关于auto-import特性的使用,自动引入模板文件/关于auto-import特性public void testFreemarker05() throws ExceptionString dir = E:/workspace/freemarker/src/com/freemarker/test;Configuration cfg = new Configuration();/配置freemarker从什么地方加载模板文件cfg.setDirectoryForTemplateLoading(new File(dir);/忽略异常cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);/添加auto-importcfg.addAutoImport(my, common.ftl);/加载模板Template template = cfg.getTemplate(test05.ftl)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1