• 初建FreeMarker工程


    初建FreeMarker工程

     

    背景:听说freemarker可以用来写页面的组件,热衷于编写可重用代码的我,迫不及待地研究了freemarker,不过,在写组件之前,还是先研究一下freemarker的基本用法。

    摘要:本文用了3种不同的方式(main、servlet、action),将freemarker融入工程之中。

    一、通过main方法使用freemarker

      1.新建一个普通的Java工程,在工程引入freemarker.jar,(右键-BuildPath(构建路径)-ConfigureBuildPath(配置构建路径) )。

      2.在工程的根目录下建立一个文件夹,命名为templates(命名随意),用来放freemarker的模板文件。

      3.在templates下面新建一个模板文件,命名为sample(命名随意),后缀格式ftl(后缀随意,一般是ftl),文件内容就写一句简单的:

    你好${username}

      (以后通过这个模板文件,就可以生成:你好张三、你好李四、你好王五。这个模板,看起来跟使用了struts2的JSP文件差不多,其实struts2本来就用了freemarker,struts2的基础jar包里就有freemarker.jar)

      4.main方法如下:

    public class Test
    {
        public static void main(String[] args) throws Exception
        {
            //读取模板文件的所在目录
            Configuration configuration = new Configuration();
            configuration.setDirectoryForTemplateLoading(new File("templates"));
    
            //读取模板文件
            Template template = configuration.getTemplate("sample.ftl");
    
            //数据
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("username", "lwp");
    
            //输出方式
            Writer out = new OutputStreamWriter(System.out);
            
            //将模板转换并输出
            template.process(map, out);
            
            //使用了流之后,记得要关掉
            out.close();
        }
    }

      5.在控制台看输出结果为:

    你好lwp

      (体验了简单的,接着就试试高级一点的)

      6.在templates下面新建一个模板文件header.ftl,内容如下:

    <#macro show age="50">
    ${username}-${age}
    </#macro>
    
    <#macro show2 age="50">
    <#nested>-${age}
    </#macro>

      7.修改sample.ftl,内容如下:

    1.你好,${username}
    2.你好,<#if username=="lwp">程序猿<#else>${username}</#if>
    3.你好,${user.name}
    
    <#include "header.ftl">
    4.你好,<@show />
    5.你好,<@show age="12" />
    
    6.你好,<@show2>${username}</@show2>
    7.你好,<@show2 age="12">${username}</@show2>
    
    <#import "header.ftl" as lwp>
    8.你好,<@lwp.show />
    9.你好,<@lwp.show age="12" />

      8.新建一个User类:

    public class User implements Serializable
    {
        private static final long serialVersionUID = 1L;
        
        private String name;
        
        public User(String name)
        {
            this.name = name;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    }

      9.main方法改为这样:(多了一句map.put("user", new User("userLWP"));

    public class Test
    {
        public static void main(String[] args) throws Exception
        {
            //读取模板文件的所在目录
            Configuration configuration = new Configuration();
            configuration.setDirectoryForTemplateLoading(new File("templates"));
    
            //读取模板文件
            Template template = configuration.getTemplate("sample.ftl");
    
            //数据
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("username", "lwp");
            map.put("user", new User("userLWP"));
    
            //输出方式
            Writer out = new OutputStreamWriter(System.out);
            
            //将模板转换并输出
            template.process(map, out);
            
            //使用了流之后,记得要关掉
            out.close();
        }
    }

      10.在控制台看结果:

    1.你好,lwp
    2.你好,程序猿
    3.你好,userLWP
    4.你好,lwp-50
    5.你好,lwp-12
    6.你好,lwp-50
    7.你好,lwp-12
    8.你好,lwp-50
    9.你好,lwp-12

      (效果甚好,我打算以后就用macro来写组件了)

    二、通过servlet使用freemarker

      1.新建一个动态web工程,把freemarker.jar复制到WEB-INF的lib里面,(如果不起作用,就用上面的方式引入freemarker.jar吧)。

      2.在WebRoot或WebContent下面,建立一个文件夹,命名为templates(命名随意),用来放freemarker的模板文件。

      3.在templates下面新建一个模板文件,命名为sample(命名随意),后缀格式ftl(后缀随意,一般是ftl),文件内容如下:

      (在servlet中,使用了response输出为网页,所以模板内容按照html5的规范来写,不能像上面那样随意了)

    <!DOCTYPE html>
    <html>
      <head>
        <title>MyHtml.html</title>
        <meta charset="utf-8">
      </head>
      
      <body>
        1.你好,${username}<br>
        2.你好,<#if username=="lwp">程序猿<#else>${username}</#if><br>
        3.你好,${user.name}<br>
        
        <#include "header.ftl">
        4.你好,<@show /><br>
        5.你好,<@show age="12" /><br>
        
        6.你好,<@show2>${username}</@show2><br>
        7.你好,<@show2 age="12">${username}</@show2><br>
        
        <#import "header.ftl" as lwp>
        8.你好,<@lwp.show /><br>
        9.你好,<@lwp.show age="12" /><br>
      </body>
    </html>

      4.header.ftl专门被引用,跟之前的一样就行:

    <#macro show age="50">
    ${username}-${age}
    </#macro>
    
    <#macro show2 age="50">
    <#nested>-${age}
    </#macro>

      5.复制刚才的User类:

    public class User implements Serializable
    {
        private static final long serialVersionUID = 1L;
        
        private String name;
        
        public User(String name)
        {
            this.name = name;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    }

      6.新建servlet类,内容如下:

    public class TestServlet extends HttpServlet
    {
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException
        {
            try
            {
                this.execute(req, resp);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException
        {
            try
            {
                this.execute(req, resp);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        public void execute(HttpServletRequest req, HttpServletResponse resp)
                throws Exception
        {
            //读取模板文件的所在目录
            Configuration configuration = new Configuration();
            configuration.setServletContextForTemplateLoading(super.getServletContext(), "templates");
            configuration.setDefaultEncoding("utf-8");
    
            //读取模板文件
            Template template = configuration.getTemplate("sample.ftl");
    
            //数据
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("username", "lwp");
            map.put("user", new User("userLWP"));
    
            //输出方式:response输出
            resp.setCharacterEncoding("utf-8");
            Writer out = resp.getWriter();
            
            //将模板转换并输出
            template.process(map, out);
            
            //使用了流之后,记得要关掉
            out.close();
        }
    }

      7.在web.xml配置一下servlet:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
        
        <!-- 项目名称 -->
        <display-name>freemarker_servlet</display-name>
        
        <servlet>
            <!-- servlet的名称(随意) -->
            <servlet-name>TestServlet</servlet-name>
            
            <!-- servlet的所在路径(按实际填写) -->
            <servlet-class>lwp.TestServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <!-- servlet的名称(跟上面一样) -->
            <servlet-name>TestServlet</servlet-name>
            
            <!-- servlet的请求url -->
            <url-pattern>/TestServlet</url-pattern>
        </servlet-mapping>
    </web-app>

      8.启动一下tomcat,在地址栏输入http://localhost:8080/freemarker_servlet/TestServlet

      9.看到运行结果:

    1.你好,lwp
    2.你好,程序猿
    3.你好,userLWP
    4.你好,lwp-50
    5.你好,lwp-12
    6.你好,lwp-50
    7.你好,lwp-12
    8.你好,lwp-50
    9.你好,lwp-12 

      (其实,自从接触struts2之后,我已经好久没用servlet了)

    三、通过action使用freemarker

      1.新建一个动态web工程,把struts2的基础包复制到WEB-INF的lib下面。

      (基础包在struts-2.3.16.1appsstruts2-blank.war,用解压软件打开之后,找到WEB-INFlib,里面那些包就是基础包了,其中包括了freemarker-2.3.19.jar)。

      2.在WebRoot或WebContent下面,建立一个文件夹,命名为templates(命名随意),用来放freemarker的模板文件。

      3.在templates下面新建一个模板文件,命名为sample(命名随意),后缀格式ftl(后缀随意,一般是ftl),文件内容如下:

      (因为要输出为网页,所以模板内容按照html5的规范来写)

    <!DOCTYPE html>
    <html>
      <head>
        <title>MyHtml.html</title>
        <meta charset="utf-8">
      </head>
      
      <body>
          <#if user ?? || username ??>
            1.你好,${username}<br>
            2.你好,<#if username=="lwp">程序猿<#else>${username}</#if><br>
            3.你好,${user.name}<br>
            
            <#include "header.ftl">
            4.你好,<@show /><br>
            5.你好,<@show age="12" /><br>
            
            6.你好,<@show2>${username}</@show2><br>
            7.你好,<@show2 age="12">${username}</@show2><br>
            
            <#import "header.ftl" as lwp>
            8.你好,<@lwp.show /><br>
            9.你好,<@lwp.show age="12" /><br>
        </#if>
      </body>
    </html>

      4.header.ftl专门被引用,跟之前的一样就行:

    <#macro show age="50">
    ${username}-${age}
    </#macro>
    
    <#macro show2 age="50">
    <#nested>-${age}
    </#macro>

      5.复制之前的User类:

    public class User implements Serializable
    {
        private static final long serialVersionUID = 1L;
        
        private String name;
        
        public User(String name)
        {
            this.name = name;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    }

      6.新建action,内容如下:

    public class TestAction extends ActionSupport
    {
        private static final long serialVersionUID = 1L;
    
        private String username;
        private User user;
        
        @Override
        public String execute() throws Exception
        {
            //数据
            this.username = "lwp";
            this.user = new User("userLWP");
            
            //返回
            return ActionSupport.SUCCESS;
        }
    
        public String getUsername()
        {
            return username;
        }
    
        public void setUsername(String username)
        {
            this.username = username;
        }
    
        public User getUser()
        {
            return user;
        }
    
        public void setUser(User user)
        {
            this.user = user;
        }
    }

      7.在struts.xml配置action:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>    
        <package name="default" extends="struts-default">
            <!-- action的请求名字 -->
            <action name="test" class="lwp.TestAction">
                <result name="success" type="freemarker">/templates/sample.ftl</result>
            </action>
            
            <!-- ftl模板文件是不能直接输出的,经过action之后才能转化页面显示。以下这个配置是经过action的直接返回 -->
            <action name="*">
                <result type="freemarker">/templates/{1}.ftl</result>
            </action>
        </package>
    </struts>

      8.在web.xml配置struts:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
    
        <!-- 项目名称 -->
        <display-name>freemarker_struts</display-name>
    
        <!-- struts2的配置 -->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>

      9.启动一下tomcat,在地址栏输入http://localhost:8080/freemarker_struts/test.action

      10.看到运行结果:

    1.你好,lwp
    2.你好,程序猿
    3.你好,userLWP
    4.你好,lwp-50 
    5.你好,lwp-12 
    6.你好,lwp-50 
    7.你好,lwp-12 
    8.你好,lwp-50 
    9.你好,lwp-12 
  • 相关阅读:
    题解 P2296 【寻找道路】
    题解 CF534C 【Polycarpus' Dice】
    题解 CF294B 【Shaass and Bookshelf】
    题解 SP4354 【TWINSNOW Snowflakes】
    题解 UVA10294 【Arif in Dhaka (First Love Part 2)】
    FLV文件格式解析部分代码
    关于“无法定位程序输入点getaddrinfo于动态链接库WS32_32.dll上”的问题
    MinGW介绍与使用
    FFMPEG: 0.4.9
    可以处理UTF8编码的md5函数
  • 原文地址:https://www.cnblogs.com/liangweiping/p/3909251.html
Copyright © 2020-2023  润新知