struts2+FreeMarker -FreeMarker学习笔记 -gcode

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

你可能感兴趣的:(html,freemarker,Web,servlet,struts)