javaWeb+freemarker的使用

  1. 导入pom坐标

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.xst</groupId>
      <artifactId>freemarker</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <name>freemarker Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.freemarker</groupId>
          <artifactId>freemarker</artifactId>
          <version>2.3.23</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
       <plugins>
         <plugin>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>jetty-maven-plugin</artifactId>
           <version>9.2.1.v20140609</version>
         </plugin>
       </plugins>
      </build>
    </project>
    
  2. 配置web.xml
    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    
      <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
        <init-param>
          <param-name>TemplatePath</param-name>
          <param-value>/</param-value>
        </init-param>
        <init-param>
          <param-name>default_encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
      </servlet-mapping>
    </web-app>
    


     
  3. freemarker简单的使用

    Freemarker基础数据类型


    package com.sxt.controller;
    
    import com.sxt.controller.vo.User;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.*;
    
    /**
     * @Author panghl
     * @Date 2021/1/16 9:40
     * @Description TODO
     **/
    @WebServlet(urlPatterns = "/f01")
    public class F01 extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /**
             * 准备Model数据
             * 转发页面(指定模板文件)
             */
            req.setAttribute("msg","hello freemarker");
    
            req.setAttribute("flag",true);
            req.setAttribute("createTime",new Date());
            req.setAttribute("age",20);
            req.setAttribute("salary",6666);
            req.setAttribute("test",0.57);
            req.setAttribute("msg02","freemarker is so essay");
    
            String[] strs = new String[] {"admin","super-admin","test"};
            req.setAttribute("strs",strs);
    
            Integer[] ids = new Integer[] {1,23,4,5};
            req.setAttribute("ids",ids);
    
            List<User> users = Arrays.asList(new User(10,"heloUser","浙江杭州",40),new User(20,"李彦宏","北京百度",35));
            req.setAttribute("users",users);
    
    
            Map<String,String> map = new HashMap<>();
            map.put("admin","码云");
            map.put("test","李彦宏");
            req.setAttribute("map",map);
    
            req.setAttribute("userName",null);
            // ftl 文件浏览器不能直接访问
            req.getRequestDispatcher("/templates/f01.ftl").forward(req,resp);
        }
    
    }
    

    f01.ftl   

    <#--
        html标签
        js
        css
    -->
    
    <h1>Freemarker基础数据类型</h1>
    
    你好啊!
    <h2>${msg}</h2>
    
    <#-- boolean 类型不能直接输出, 如果输出,需要转换为字符串-->
    <#--${flag} 源码不可见-->
    ?string: ${flag?string} || ?c:${flag?c}
    <br/>
    <#if flag>
        flag 为true
        <#else>
        flag 为false
    </#if>
    <br/>
    <#--
        日期类型 不能直接输出,需要转换为字符串输出
    -->
    <#--${createTime}-->
    date: ${createTime?date} || string :${createTime?string("yyyy-MM-dd")} || datetime: ${createTime?datetime} || time: ${createTime?time}
    <br/>
    
    <#--
        数值输出
    -->
    ${age} || ${salary} ||非格式化输出: ${salary?c}|| 货币: ${test?string.currency} || 百分比: ${test?string.percent}
    
    <br/>
    
    <#--
        字符串输出
    -->
    ${msg02} || 大写: ${msg02?upper_case} || 首字母大写: ${msg02?cap_first} || 每个单词首字母大写: ${msg02?capitalize}
    <br/>
    字符串切割:
    <br/>
    start..end : 索引2-3: ${msg02[2..3]} || ${msg02[2..<4]}
    <br/>
    start..小于end+1 和start ..end相同: ${msg02[2..<4]}
    <br/>
    限制长度的值域 (start..*length): ${msg02[2..*4]}
    <br/>
    无右边界值域 (start..) : ${msg02[2..]}
    <br/>
    
    <br/>
    
    <#--
        序列类型:
            数组  list  set
    -->
    <#list strs as str>
        <li>${str}</li>
    </#list>
    <hr/>
    <#list ids as id>
        <li>${id}</li>
    </#list>
    <hr/>
    <#list users as user>
        <li>${user.id} || ${user.userName} || ${user.addr} </li>
    </#list>
    <hr/>
    排序
    <#list ids?sort as id>
        <li>${id_index} - ${id}</li>
    </#list>
    <#list users?sort_by("age") as user>
        <li>${user.id} || ${user.userName} || ${user.addr} || ${user.age}</li>
    </#list>
    
    <hr/> hash
    <#list map?keys as key>
        ${key} || ${map[key]}<br/>
    </#list>
    
    <#--
    值为null 时的处理:
        1.使用默认值 !"默认值"
        2.判断变量值是否存在 输出内容
    -->
    <br/>值为null 时的处理: ||
    使用默认值: ${userName!"admin"}
    <br/>
    判断变量值是否存在:
    <#if userName??>
        ${userName}
        <#else>
        userName不存在
    </#if>
    
    
    
    
    

    FreeMarker常见指令

    package com.sxt.controller;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @Author panghl
     * @Date 2021/1/16 10:56
     * @Description TODO
     **/
    @WebServlet(urlPatterns = "/f02")
    public class F02 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String action = req.getParameter("action");
    //        if (action.equals("")){
    //
    //        }else if (){
    //
    //        }else if (){
    //
    //        }else{}
    
            req.getRequestDispatcher("/templates/f02.ftl").forward(req,resp);
        }
    }
    

    f02.ftl  

    
    <h1>FreeMarker常见指令</h1>
    <#--
        常用指令 -assign   变量的定义
    -->
    <#assign str="freemarker">
    <H2>${str}</H2>
    <hr/>
    <#assign ids = [10, 20, 30]>
    ${ids?join(" - ")}
    <br/>
    <#assign x=0>
    ${x+1}
    <br/>
    <#assign userName = "admin",userPwd = "123456", str=["test","user"]>
    ${userName} || ${userPwd} ||  ${str?join(",")}
    <br/>
    
    <#--
        常用指令02-if elseif else
    -->
    <#assign action="main">
    <#if action =="index">
        首页。。。
        <#elseif action=="main">
        主页。。。
        <#else>
        404。。。
    </#if>
    <br/>
    <#--
        常用指令03-list
    -->
    <#assign users=["admin"]>
    <#list users as user>
        ${user}
    <#else>
        暂无用户
    </#list>
    <br/>
    <#if users?? && users?size gt 0 >
        <#list users as user>
            ${user}
        </#list>
        <#else>
        暂无数据
    </#if>
    <br/>
    <#list users>
    <ul>
        <#items as user>
            <li>${user}</li>
        </#items>
    </ul>
    </#list>
    
    <br/>
    <#--
        常用指令04-macro
    -->
    
    <#--
        1.定义宏test01
    -->
    <#macro test01>
        hello macro
    </#macro>
    <#--
        2.使用宏test01
    -->
    <@test01></@test01>
    <br/>
    <@test01></@test01>
    <br/>
    <@test01></@test01>
    <br/>
    <@test01></@test01>
    <br/>
    
    <hr/>
    
    <#macro test02 userName>
        hello ${userName}
    </#macro>
    
    <@test02 userName="admin"></@test02>
    
    <hr/>
    <#macro test03 userName users>
        hello ${userName}
        <br/>
        <#list users as user>
            ${user}
            <#else>
            暂无数据
        </#list>
    </#macro>
    <@test03 "auper-panghl" users></@test03>
    
    <br>
    <#--
        常用指令05-import
    -->
    <#import "f03.ftl" as f03>
    <@f03.test04 userName="admin"></@f03.test04>
    <hr>
    <@f03.cfb n=9></@f03.cfb>
    
    
    <#--
        常用指令05-include
    -->
    <hr>
    <#include "index.html">
    <#include "f04.ftl">
    
    
    <hr>
    <#function avg x y>
        <#return (x + y)/2>
    </#function>
    ${avg(10,20)}
    
    
    
    
    
    
    
    

    f03.ftl  

    <#macro test04 userName>
        我是f03.ftl hello ${userName}
    </#macro>
    
    <#--
    9*9乘法表
    -->
    <#macro cfb n>
        <#list 1..n as i>
            <#list 1..i as j>
                <#if i*j lt 10>
                    ${j}*${i}= &nbsp;${i*j}
                    <#else>
                    ${j}*${i}=${i*j}
                </#if>
            </#list>
            <br/>
        </#list>
    </#macro>
    
    


    f04.ftl 

    testtest
    testtest
    testtest
    test
    
    test
    vtest
    
    
    
    
    
    
    
    
    
    



     

  4. 将网页静态化案例
     
    package com.sxt.controller;
    
    import freemarker.cache.FileTemplateLoader;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author panghl
     * @Date 2021/1/16 12:27
     * @Description TODO
     **/
    @WebServlet(urlPatterns = "/f03")
    public class F03 extends HttpServlet {
    
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.创建FreeMarker的配置类
            Configuration cfg = new Configuration();
            cfg.setDefaultEncoding("utf-8");
            cfg.setServletContextForTemplateLoading(getServletContext(),"/");
            //2.指定模块加载器:将模板存入缓存中
           // cfg.setTemplateLoader(new FileTemplateLoader(new File("templates")));
            //3. 根据模板文件获取模板对象
            Template template = cfg.getTemplate("templates/news.ftl");
            //4.构造数据模型
            Map<String,Object> map = new HashMap<>();
            map.put("title","开业五年 习近平推动这家银行点石成金");
            map.put("source","新闻社");
            map.put("createTime",new Date());
            map.put("content","对一切为亚洲和平与发展贡献正能量的意愿和行动,我们都持积极态度”“倡议成立亚投行,就是中国承担更多国际责任、推动完善现有国际经济体系、提供国际公共产品的建设性举动,有利于促进各方实现互利共赢”“亚投行应该成为促进成员共同发展、推动构建人类命运共同体的新平台”……");
            String basePath = req.getSession().getServletContext().getRealPath("/");
            File html = new File(basePath+"/html");
            if (!(html.exists())){
                //创建目录 用于存放.html文件
                html.mkdir();
            }
            String fileName = System.currentTimeMillis()+".html";
            //5.文件输出
            try {
                template.process(map,new FileWriter(new File(html,fileName)));
            } catch (TemplateException e) {
                e.printStackTrace();
            }
    
    
        }
    
    }
    

    news.ftl

    <h1>${title}</h1>
    <br/>
    发布时间:${createTime?string("yyyy-MM-dd HH:mm:ss")}
    来源:${source}
    <br/>
    ${content}
    

springboot项目中application.properties配置

扫描二维码关注公众号,回复: 12432847 查看本文章
#freemarker config
spring.freemarker.cache=false
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.suffix=.html
spring.freemarker.template-loader-path=classpath:/templates/

猜你喜欢

转载自blog.csdn.net/qq_45441466/article/details/113084450