java freemarker.docx
- 文档编号:8065250
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:16
- 大小:27.08KB
java freemarker.docx
《java freemarker.docx》由会员分享,可在线阅读,更多相关《java freemarker.docx(16页珍藏版)》请在冰豆网上搜索。
javafreemarker
JavaFreeMarker资料整理和收集
(一)资料编号NO101
Freemarker简介
FreeMarker允许Javaservlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。
模板用servlet提供的数据动态地生成HTML。
模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据
FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件
FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境
FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库
Freemarker开发配置
原本对freemarker了解不多,只知道是一种模板语言,我的个人网站设计时都没有考虑到使用freemarker,而是直接JSP展示。
在网站上线推广过程中了解到,各个搜索引擎对动态的链接不够友好,就是说对于网站中XXX.action?
name=这种格式的链接,搜索引擎不予收录,网络蜘蛛更亲奈.html的静态链接,为了便于更方便的网站推广,所以将网站集成URLREWRITER+FREEMARKER技术改写了全站链接。
大家可以去网站看下效果,细心的人还是可以看见.action的痕迹的。
现在网站中有两套链接,.action的动态链接,.html的静态链接。
链接的改写纯粹是为了便于网站的推广,URLREWRITER过滤器的使用,FREEMARKER模板语言开发,这两块本人将在后续文章中做详细讲解,本文将结合网站详细介绍STRUTS2+FREEMARKER的开发配置。
1、准备相应的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.jar
2、解压缩struts2-core-2.0.11.2.jar复制META-INF/struts-tags.tld复制到工程WEB-INF目录下,FREEMARKER中默认是不支持struts2标签的,所以需将标签库导入模板中。
3、修改WEB.XML文件,添加STRUTS2过滤器
Java代码
org.apacher.sturts2.dispatcher.FilterDispatcher
注意:
对于网络上所说的要想在Freemarker中使用Struts2标签必须配置一个新SERVLET
Java代码
org.apache.struts2.views.JspSupportServlet
在本人的实践中发现这步并非必须的,此处有待深入研究
4、接下来这步应该是最重要的,配置struts.xml文件
Java代码
以上ACTIN配置为正常使用STRUTS2的配置,但在结合FREEMARKER中则需做如下改变
Java代码
注意:
经过以上四步,STRUTS2+FREEMARKER配置完成,可以进行开发应用,下面展示一个简单的实例
Java代码
IndexAction.java
……
privateLoglog=LogFactory.getLog(IndexAction.class);
privateStringusername;
privateStringpassword;
/**
*登录处理
*@return
*@throwsException
*/
publicStringgetVediosByCategory()throwsException{
log.info("执行了登录方法getVediosByCategory()");
returnSUCCESS;
}
省略相应(getter,setter方法)
…
创建登录页面index.jsp
Java代码
formaction="getVediosByCategory"> 登录名: textfieldname="username"/> 密码: textfieldname="password"/> submitvalue="登录"/> form> 创建结果页面: user.ftl Java代码 <#-- <#assigns=JspTaglibs["/WEB-INF/struts-tags.tld"]> --> 欢迎<@s.propertyvalue="username"/>登录! 注意: 1、Struts2标签在JSP页面中的写法与在Freemarker模板文件中的写法不同。 Freemarker模板文件是以<@s.tag>开始,以@s.tag>结束 2、Freemarker模板文件的处理,通过Web容器是无法直接处理的,因此不要让用户直接访问模板文件。 在开发过程中,我们可以将Freemarker文件直接放到Web工程的WEB-INF目录或其子目录下(用户无法访问WEB-INF目录下文件),并在相应的struts-*.xml文件中配置type="freemarker"来输出模板 FREEMARKER接触不深,如有不足之处请大虾们多多指正 (二)资料编号NO102 FreeMarker也是与Web容器无关的,也就是FreeMarker并不一定需要运行在Web容器中: FreeMarker同样可以应用于非Web应用程序环境.而且,FreeMarker并不是只能生成HTML页面,它也可以生成各种文本,如XML,RTF,Java源代码等。 Struts2默认采用FreeMarker作为其模板文件,而Struts2所有的主题模板文件都是采用FreeMarker编写的,eclipse中的JSP,Java等模板文件也是采用FreeMarker技术. 一、在struts2中使用freemarker 以一个简单的添加用户信息为例: 当用户点击首页中的“添加用户”连接时,这时会发出一个添加用户页面的请求(addInput.action),然后通过我们的返回一个添加页面,下面是我们普通的struts2配置文件一般是这么配置的: addInput.jsp文件: <%@pagelanguage="java"import="java.util.*"pageEncoding="ISO-8859-1"%>
添加用户:
username:
password:
或者采用struts2标签:
<%@pagelanguage="java"import="java.util.*"pageEncoding="ISO-8859-1"%>
<%@taglibprefix="s"uri="/struts-tags"%>
添加用户:
formaction="add"method="post"> textfieldlabel="username: "name="username"/> passwordlabel="password: "name="password"/> submitvalue="add"/> form> 在action返回的view是一个jsp页面,也可以改成是一个freemarker模板页面: addInput.ftl模板文件 当然我们希望能在addInput.ftl上也能够使用struts2的标签,需要在addInput.ftl页面最开始添加对struts2标签的引用: <%@taglibprefix="s"uri="/struts-tags"%> 注意: struts2在freemarker页面中标签写法和jsp页面的写法不同,freemarker里是<@s.form>,jsp里是 form>,一定不要写错了! 使用时发现对中文的支持不好,显示时中文出现乱码,这里修改下struts.xml配置文件: 现在就可以在struts2中正常使用freemarker了! 二、在java程序中使用FreeMarker FreeMarker的模板就是一个.ftl文本文件,在该文件中使用了一些FreeMarker的特别标记,这些标记会动态显示,或者控制程序输出,如下面的模板文件代码: ${name},你好! ${msg} 这里类似于${}的就是动态的内容,称作"插值". 为了使用FreeMarker来将数据模型中的值合并到模板文件中,可按如下步骤进行: 1,创建Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例 2,使用Configuration实例来生成Template实例,同进需要指定使用的模板文件 3,填充数据模型,数据模型就是一个Map对象 4,调用Template实例的process方法完成合并. 下面来看看几个测试实例,以加深我们的对模板语言的认识: 实例一: Freemarker基本使用方法: 我们下面就用一个使用FreeMarker来创建一个java测试程序,将模板中的内容输出的指定的文件中,来简单了解一下其基本语法,程序源代码如下: publicvoidtestFreemarker01()throwsException{ //指定模板文件路径(在项目下,你可以修改此路径) Stringdir="E: /workspace/freemarker/src/com/freemarker/test"; //创建一个Configuration对象: 该实例负责管理FreeMarker的模板加载路径,负责生成模板实例 Configurationcfg=newConfiguration(); //配置freemarker从什么地方加载模板文件,通过创建的Configuration对象加载模板文件 cfg.setDirectoryForTemplateLoading(newFile(dir)); //加载模板,生成模板实例对象,同时制定所使用的模板文件 Templatetemplate=cfg.getTemplate("test01.ftl"); //定义数据模型(Map对象),并填充数据 Maproot=newHashMap(); root.put("strvalue","世界,你好"); //定义输出,将其输出到指定文件中去 Writerout=newFileWriter(dir+"/test01_out.txt"); //处理执行,将模板与数据进行合并 template.process(root,out); } test01.ftl模板文件如下: 第一个测试程序: ${strvalue} test01_out.txt文件内容结果: 第一个测试程序: 世界,你好 实例二: Freemarker中关于空值的处理问题: 当在模板文件中取值,拿不到,为空值时,freemaker默认会将错误信息打印在页面中或输出到指定文件中,为了将错误信息隐藏到后台,而不要现在前台页面中,需要设置setTemplateExceptionHandler 来忽略异常信息,具体代码如下: //关于空值的处理问题 publicvoidtestFreemarker02()throwsException{ Stringdir="E: /workspace/freemarker/src/com/freemarker/test"; Configurationcfg=newConfiguration(); //配置freemarker从什么地方加载模板文件 cfg.setDirectoryForTemplateLoading(newFile(dir)); [color=red]//增加设置忽略异常 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);[/color] //加载模板 Templatetemplate=cfg.getTemplate("test02.ftl"); //定义数据 Maproot=newHashMap(); //root.put("strvalue","世界,你好"); root.put("boolvalue",true); root.put("today",newDate()); //定义输出 Writerout=newFileWriter(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}将取不到值而在页面显示错误,当然可以在模板文件中可以使用条件判断将空值情况排除 <#ifstrvalue? exists>#if>。 实例三: 关于集合处理的问题 在模板中显示数据模型中集合列表信息, 显示集合列表信息: <#list>#list> 条件判断: <#if变量? exists>#if> 条件${? string("1","0")}关于这些还是去看实例吧,我就不在这里描述了。 从实例中去学习其语法。 具体代码如下: //关于集合的处理 publicvoidtestFreemarker03()throwsException{ Stringdir="E: /workspace/freemarker/src/com/freemarker/test"; Configurationcfg=newConfiguration(); //配置freemarker从什么地方加载模板文件 cfg.setDirectoryForTemplateLoading(newFile(dir)); //忽略异常 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //加载模板 Templatetemplate=cfg.getTemplate("test03.ftl"); //定义数据 Maproot=newHashMap(); Listlist=newArrayList(); for(inti=0;i<10;i++){ list.add("listvalue"+i); } root.put("list",list); //定义输出 Writerout=newFileWriter(dir+"/test03_out.txt"); template.process(root,out); } test03.ftl模板文件如下: listvalue: <#--正常显示的文本信息--> <#listlistasv> ${v}-${v_index}[${v_has_next? string("y","n")}] #list> test03_out.txt显示结果如下: listvalue: listvalue0-0[y] listvalue1-1[y] listvalue2-2[y] listvalue3-3[y] listvalue4-4[y] listvalue5-5[y] listvalue6-6[y] listvalue7-7[y] listvalue8-8[y] listvalue9-9[n] 实例四: 关于宏定义的应用<#macro>#macro> //关于freemarker的宏定义 publicvoidtestFreemarker04()throwsException{ Stringdir="E: /workspace/freemarker/src/com/freemarker/test"; Configurationcfg=newConfiguration(); //配置freemarker从什么地方加载模板文件 cfg.setDirectoryForTemplateLoading(newFile(dir)); //忽略异常 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //加载模板 Templatetemplate=cfg.getTemplate("test04.ftl"); //定义数据 Maproot=newHashMap(); root.put("name","李四"); //定义输出 Writerout=newFileWriter(dir+"/test04_out.txt"); template.process(root,out); } 来看看模板文件test04.ftl: <#macrogreetp> Hello,${p} #macro> <@greetp="张三"/> <@greetp="${name}"/> 来看看输出文件的结果: Hello,张三 Hello,李四 实例五: 关于auto-import特性的使用,自动引入模板文件 //关于auto-import特性 publicvoidtestFreemarker05()throwsException{ Stringdir="E: /workspace/freemarker/src/com/freemarker/test"; Configurationcfg=newConfiguration(); //配置freemarker从什么地方加载模板文件 cfg.setDirectoryForTemplateLoading(newFile(dir)); //忽略异常 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //添加auto-import cfg.addAutoImport("my","common.ftl"); //加载模板 Templatetemplate=cfg.getTemplate("test05.ftl")
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java freemarker
![提示](https://static.bdocx.com/images/bang_tan.gif)