FreeMarker在struts2,JAVA,web中的应用实例
FreeMarker概述
* FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
* Template + data model = output
FreeMarker 是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.界面开发人员只需要关于界面(也就是模板文件)的开发,而业务逻辑开发者只需要负责将需要显示的数据填入数据模型-----FreeMarker负责合并数据模型和模板, 从而生成标准输出.
FreeMarker特别适应于MVC模式的Web应用,虽然FreeMarker具有一些编程能力,但这种编程能力非常有限,无法实现业务逻辑, 只能提供一些数据格式的转换功能.因此,通常由Java程序准备要显示的数据,由FreeMarker模板引擎来生成页面,而FreeMarker模板则提供页面布局支持.(好处:严格实现MVC分离)
此外,FreeMarker也是与Web容器无关的,也就是FreeMarker并不一定需要运行在Web容器中:FreeMarker同样可以应用于非Web应用程序环境.而且,FreeMarker并不是只能生成HTML页面,它也可以生成各种文本,如XML,RTF,Java源代码等.
Struts2默认采用FreeMarker作为其模板文件,而Struts2所有的主题模板文件都是采用FreeMarker编写的,eclipse中的JSP,Java等模板文件也是采用FreeMarker技术.
1.
在struts2中使用freemarker
普通的struts2配置文件一般是这么配置的:
<action name=“Action1“ class=“com.abc.Action1“> <result>/page.jsp</result></action>
<action name=”Action1″ class=”com.abc.Action1″> <result type=”freemarker”>/fm.ftl</result></action>
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class> org.apache.struts2.views.JspSupportServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /><html><head><meta http-equiv=“Content-Type“ content=“text/html; charset=GB2312“><title>Insert title here</title></head><body><@s.form action=“Action1.action“><@s.textfield name=“username“></@s.textfield><@s.textfield name=“password“></@s.textfield><@s.submit value=“提交“/></@s.form><br/>登录用户名:${username}</body></html><constant name=”struts.i18n.encoding” value=”gb2312″ />
<package name="loginPackage" extends="jason-default"> <action name="jLogin" >/WEB-INF/jason/index.jsp</result> <result name="error">/WEB-INF/jason/login.jsp</result> <result name="input">/WEB-INF/jason/login.jsp</result> <result name="search" type="freemarker">/WEB-INF/templates/jsearch.ftl</result> <interceptor-ref name="jLoginStack"/> </action> </package>
Hits hits = JLuceneUtils.luceneSearch(indexPath, searchMess); System.out.println("----------hits.length():" + hits.length()); for (int a = 0; a < hits.length(); a++) { Document doc2 = (Document) hits.doc(a); System.out.println(searchMess + "的值是:"+ doc2.get("confContext")); ActionContext.getContext().getSession().put("jsearch_value",doc2.get("confContext")); } ActionContext.getContext().getSession().put("jsearch_cout", hits.length()); ActionContext.getContext().getSession().put("jsearch_name", searchMess);<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>jason search result</title></head><body><table width="98%" border="0" align="center" cellpadding="5" cellspacing="0"> <tr> <td><strong>以面是jason用lucene查询的结果,共有${jsearch_cout}条符合:</strong></td> </tr> <tr> <#-- freemarker插值(如下,是利用EL语言,即将ACTION中的值先放入session/request/application) --> <td>查询内容:${jsearch_name} --- 查询值:${jsearch_value}</td> </tr> <tr> <td> <@s.url action="jLogin!login" id="login" /> <a href="${login}">返回登录主页</a> </td> </tr></table></body></html><servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class> org.apache.struts2.views.JspSupportServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
package lee;import java.util.*;import java.io.*;import freemarker.template.*;public class HelloFreeMarker{ private Configuration cfg; public void init() throws Exception{ //初始化FreeMarker配置 //创建一个Configuration实例 cfg = new Configuration(); //设置FreeMarker的模版文件位置 cfg.setDirectoryForTemplateLoading(new File("templates")); } public void process()throws Exception{ Map root = new HashMap(); root.put("name", "FreeMarker!"); root.put("msg" , "您已经完成了第一个FreeMarker的示例"); Template t = cfg.getTemplate("test.ftl"); t.process(root, new OutputStreamWriter(System.out));}public static void main(String[] args)throws Exception{ HelloFreeMarker hf = new HelloFreeMarker(); hf.init(); hf.process();}}<html><head><title>FreeMarker的HelloWorld</title></head><body>${message}</body></html>package lee;import java.util.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import freemarker.template.*;public class HelloServlet extends HttpServlet{ private Configuration cfg; public void init(){ //初始化FreeMarker配置 //创建一个Configuration实例 cfg = new Configuration(); //设置FreeMarker的模版文件位置 cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates"); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //建立数据模型 Map root = new HashMap(); root.put("message", "Hello FreeMarker!"); //取得模版文件 Template t = cfg.getTemplate("test.ftl"); // 开始准备生成输出 // - 使用模版文件的charset作为本页面的charset // - 使用text/html MIME-type response.setContentType("text/html; charset=" + t.getEncoding()); Writer out = response.getWriter(); //合并数据模型和模版,并将结果输出到out中 try { t.process(root, out); } catch (TemplateException e) { throw new ServletException("处理Template模版中出现错误", e); } }}<web-app><servlet> <servlet-name>hello</servlet-name> <servlet-class>lee.HelloServlet</servlet-class></servlet><servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern></servlet-mapping></web-app>
<html><br><head><br><title>Welcome!</title><br></head><br><body><br><#-- 注释部分 --><br><#-- 下面使用插值 --><h1>Welcome ${user} !</h1><br><p>We have these animals:<br><u1><br><#-- 使用FTL指令 --><#list animals as being><br> <li>${being.name} for ${being.price} Euros<br><#list><br><u1><br></body><br></html>