struts2+FreeMarker -FreeMarker学习笔记 -gcode
struts2改用FreeMarker作为表示层。
FreeMarker不支持使用taglib指令来导入标签库,但struts2提供了额外的支持。 步骤如下: 1,将要用的.tld文件复制到web应用中。 2,web.xml中启动JSPSupportServlet。 <servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 3,在FreeMarker模板中使用assign指令导入标签库。 <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 就可以使用标签了。 <@s.form action="Login.action"> <@s.textfield name="username" label="用户名"/> <@s.textfield name="password" label="密码"/> <@s.submit value="提交"/> </@s.form> 4,web容器默认不处理模板页面,必须通过struts2。 我们将模板放到WEB-INF/ftl下, 在struts.xml增加如下配置, <action name="*"> <result type="freemarker">/WEB-INF/ftl/{1}.ftl</result> </action> ====================================== struts2解析模板中的变量顺序如下: 1,模板内建变量 2,ValueStack中的变量 3,ActionContext中的变量 4,HttpServletRequest范围变量 5,HttpSession范围变量 6,ServletContext范围变量 -------- FreeMarker模板内建变量如下: 1,stack,${stack.findString('ognl expr')}。 2,action,代表刚执行过的Action实例。 3,response,res,代表HttpServletResponse实例。 4,request,req。 5,session,application。 6,base,代表用户请求的上下文路径。 ------------ <#if Application.attName?exists> ${Application.attName} </#if> 或者 <@s.property value="%{#application.attName}" /> 对于Request,不仅可以访问属性,还可以访问参数。 <@s.property value="%{#parameters.paraName}" /> 此外访问ValueStack上下文参数,可以${stack.findValue('#contextParamName')} 或者<@s.property value="%{#contextParamName}" /> ========================= ========================= 文本,注释<#-- -->插值${}或者#{},FTL指令<#指令名 >,如果是用户指令则用@符号。 http://freemarker.sourceforge.net/docs/index.html ------------------- 模板文件test.ftl-- ${name},你好!${msg} 合并程序-- 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(); }} ------------------------------------ web应用中 模板文件test.ftl-- <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); } } } |
转载自http://hi.baidu.com/hxzon/blog/item/5ca0364e269878ccd0c86a5c.html