FreeMarker学习

本文介绍了如何在Web.xml中配置FreemarkerServlet,并展示了如何在Servlet中设置数据以供Freemarker模板使用。涵盖了XML配置、servlet映射、ftl模板语法、数据类型处理及部署到Jetty等知识点。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
xml处理文件
在这里插入图片描述
99999999996969999999-999999589 .9
web.xml配置
在这里插入图片描述

xml配置

<?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.xxx</groupId>
  <artifactId>freemarker</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>free01 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.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>org.eclipse.jetty.aggregate</groupId>
    <artifactId>jetty-all</artifactId>
    <version>9.2.1.v20140609</version>
    </dependency>
      <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.23</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>free01</finalName>
<!--
插件地址:
tomcat http://tomcat.apache.org/maven-plugin-2.2/
Jetty https://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html

-->
    <plugins>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
     <version>9.2.1.v20140609</version>
      </plugin>
    </plugins>
  </build>
</project>

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>
    <servlet-name>freemarker</servlet-name>
 <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    <!--模板路径-->
<init-param>
  <param-name>TemplatePath</param-name>
 <!--默认在webapp目录下查找对应的模板文件-->
  <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>

ftl

<#-- 获取数据-->
${msg}

servlet配置


package com.xxx.servler;

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;

@WebServlet("/f01")
public class FreeMarker01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //设置数据,给模板设置数据据
        req.setAttribute("msg", "Hello FreeMarker");
        req.getRequestDispatcher("template/f01.ftl").forward(req,resp);
//请求转发 
    }
}

新建模板文件

在webapp目录下新建template文件夹
创建f01.ftl文件

html注释
在浏览器中可以看到的注释

<!-- -->

freemarker注释

<#-- -->

在浏览器中不可以看到的注释
freemarker的语法
html所有的标签都适用

<#-- 获取数据-->
<h2>${msg}</h2>

css和js的使用与html中语法一致

<style>
h2{
font-family:楷体
}
</style>

在这里插入图片描述

css的使用
js的使用

Freemarker的数据类型

在这里插入图片描述
在这里插入图片描述

${flag?c}<br>
${flag?string}<br>
${flag?string('yes','no')}<br>
${flag?string('jojo','dio')}<br>

布尔类型不能不能直接输出
要输出转换成字符串
问号string c
自定义 true false
在这里插入图片描述
?c
?string
在这里插入图片描述
then 三目运算符

${foo?then{'Y','N'}}

日期类型

不能直接用要转换成日期型或者字符串
在这里插入图片描述

  1. 在Servlet中设置日期类型
request.setAttribute("createDate",new Date());
  1. 获取数据
    年月日 ?date
    时分秒 ?time
    年月日时分秒 ?datetime
    指定格式 ?string(“自定义格式”)

output

${createDate?date}
${createDate?time}
${createDate?datetime}
${createDate?string("yyyy年MM月dd日 HH:MM:ss")}<br>

在这里插入图片描述

date_if_unknown
在这里插入图片描述

date_format
time_format
datetime_format
SimpleDateFormat格式
iso格式 xs格式
要使用一次iso格式
可以使用myDate?string.iso
在这里插入图片描述
iso必须的

数值类型数据

在这里插入图片描述
保留几位小数

在这里插入图片描述
在这里插入图片描述

<#-- 获取数据-->

<h4>FreeMarker 数据类型</h4><br>
<h5>布尔类型</h5><br>
${flag?c}<br>
${flag?string}<br>
${flag?string('yes','no')}<br>
${flag?string('jojo','dio')}<br>
${createDate?date}<br>


<br>
<hr>
<h1>数值类型数据</h1><br>
${age}<br>
${avg}<br>
${num}<br>
<p>转化成字符串</p>
${age?c}<br>
${avg?c}<br>
${num?c}<br>
<p>转换成货币类型</p>
${age?string.currency}<br>
${avg?string.currency}<br>
${num?string.currency}<br>
<p>将数值转换成百分比类型的数据</p>
${avg?string.percent}<br>
${age?string.percent}<br>
${num?string.percent}<br>
<p>将浮点型数值转换成指定小数位</p>
${avg?string["0.##"]}<br>
${age?string["0.##"]}<br>
${num?string["0.##"]}<br>

数值的简单使用
FreeMarker
freemarker中数值类型可以直接输出

  1. 转字符串
  • 普通字符串
  • 货币型
  • 百分比
  1. 浮点型的数值转换成指定小数位输出
    (#表示小数位)
    ?string([0.##])

字符串类型

  1. 在servlet中设置字符串类型的数据
request.setAttribute("msg","hello");
request.setAttribute("msg2","freemarker")
  1. 获取数据
<#-- 
数据类型 :字符串类型
3. 截取字符串(左闭右开)?substring(start,end)
4. 首字母小写输出?uncap_first
5. 首字母大写输出 ?cap_first
6. 字母转小写输出 ?lower_case
7. 字母转大写输出 ?upper_case
8. 获取字符串长度 ?length
9. 是否以指定字符开头 (boolean?starts_with("xx")?string
10.是否以指定字符结尾 (boolean)?ends_with("xx")?string
10. 获取指定字符的索引 ?index_of("xx")
11. 去除字符串前后空格 ?trim
12. 替换指定字符串 ?replace("xx","xx") 
-->

直接使用就可以
${msg.substring(2,5)}
如果其他类型的先转成字符串类型之后再使用


这里可以不用重启服务器
在这里插入图片描述
在这里插入图片描述
会自动有空格

replace
trim函数

字符串为空的判断和处理

null和不存在的时候都会报错
空字符串不报错

  1. !:指定确实变量的默认值
    ${value!} 如果value为空默认值是空字符串
    ${value!“默认值”} 如果value为空,默认值是"默认值"
  2. ??判断变量是否存在
    ${str??}
    返回boolean类型

在这里插入图片描述

sequence类型

  1. 在Servlet中设置序列类型的数据
    在这里插入图片描述

  2. 获取数据

<#list 序列名 as 元素名>
${元素名}
</#list>

在这里插入图片描述
在这里插入图片描述
对数据进行操作

获取序列的长度
${序列名?size}
获取序列元素的下标
${元素名7index}
获取第一个元素
${序列名?first}
获取最后一个元素
${序列名?last}
倒序输出
序列名?reverse
升序输出
序列名?sort
降序输出
序列名?sort?reverse
指定字段名排序
序列名?sort_by(“字段名”)

注:一般是JavaBean集合,对应的字段名需要提供get方法

在这里插入图片描述
在这里插入图片描述

<#list stars as star>
${star}
</#list>
<br>
获取序列的长度:${stars?size}<br>
获取第一个元素:${stars?first}<br>
获取最后一个元素:${stars?last}<br>

在这里插入图片描述
在这里插入图片描述

<#list cityList?sort as city>
    ${city}
</#list>
<br>
<#list cityList?reverse as city>
    ${city}
</#list>
<br>
<#list cityList?sort?reverse as city>
    ${city}
</#list>

在这里插入图片描述
在这里插入图片描述

hash类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.xxx.servler;


import java.util.Map;
import java.util.HashMap;
import com.xxx.entity.User;

import java.util.List;
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.Date;
import java.util.ArrayList;
import java.util.Arrays;
@WebServlet("/f02")
public class FreeMarker02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //设置数据,给模板设置数据据
/*布尔类型数据*/

        req.setAttribute("flag", true);
/*设置日期类型数据*/
        req.setAttribute("createDate", new Date());

         req.setAttribute("age", 80);
         req.setAttribute("num", 1000);
         req.setAttribute("avg", 5.561);

        req.setAttribute("msg","hello");
        req.setAttribute("msg2","hellooworld");

        req.setAttribute("str1", null);
        req.setAttribute("str2", "");

//数组
        String[] str = new String[]{"周杰伦","林俊杰","陈奕迅","五月天"};
        req.setAttribute("stars", str);


      List<String> cites= Arrays.asList("上海","北京","杭州","深圳");



        req.setAttribute("cityList", cites);



/* 在servlet中设置javabean类型*/
           List<User>userList = new ArrayList<>();
           userList.add(new User(1,"zhangsan",22));
           userList.add(new User(2,"lisi",18));
           userList.add(new User(3,"wangwu",20));
           req.setAttribute("userList", userList);

/* 设置map类型数据*/
        Map<String,String>cityMap = new HashMap<>();
        cityMap.put("sh","上海");
        cityMap.put("bj","北京");
        cityMap.put("sz","深圳");


        req.setAttribute("cityMap", cityMap);

        req.getRequestDispatcher("template/f02.ftl").forward(req,resp);

    }


}

FreeMarker常用指令

在这里插入图片描述
assign自定义变量指令
assign 可以创建一个新的变量或者替换一个已经存在的变量

在这里插入图片描述

assign
name
在这里插入图片描述
里面给值

在这里插入图片描述

name1=value1
name2=value2
nameN=valueN

assign same as above in namespacehash

name 变量的名字
foo-bar
assign x = x+1
value 存储的值
namespacehash 通过import 为命名空间创建的哈希表,是表达式

if elseif else逻辑判断指令

<#if condition>
...
<#elseif condition2>
..
<#elseif condition3>
..
<#else>
..

</#if>

...
<#assign list="">

assign不能assignnull值

在这里插入图片描述

sequence想要迭代的项,可以是序列或集合的表达式

item循环变量的名称
没有迭代项的时候采用else指令,可以输出一些特殊的内容而不只是空在那里

<br>
<#if users3??>
<#assign users3=['a']>
<#list users3 as user>
    ${user}
    <#else>
    用户数据不存在
</#list>
</#if>

判断输出

常用指令macro宏和nested指令
在这里插入图片描述
在这里插入图片描述

<h5>4.macro自定义指令</h5>
<#--自定义指令-->
<#macro address>
   <h2> @ 2021-2050 This FreeMarker Project All rights reserved.</h2>
</#macro>
<#-- 使用自定义指令 -->
<@address></@address>

可以嵌套标签使用

可以被多次重复使用

可以传递多个参数

可以包含内置指令


<#--自定义有参数的指令-->
<#macro queryUserByName uname upwd phone>
    通过用户名查询用户对象:${uname}-${upwd}-${phone}
</#macro>
<@queryUserByName uname="admin" upwd="123456" phone="13129571578"></@queryUserByName><br>
<#--传递多个参数-->

在这里插入图片描述
在这里插入图片描述

<#--传递多个参数-->
<#macro cfb>
    <#list 1..9 as i>
        <#list 1..i as j>
${j}*${i}=${j*i}&nbsp;
        </#list>
        <br>
    </#list>
</#macro>
<@cfb></@cfb>


在这里插入图片描述

占位符nested

在这里插入图片描述
在这里插入图片描述

<#macro test>
    这是一段文本<br>
    <#nested><br>
    我想告诉你
</#macro>
<@test>天天开心</@test>

nested可以多次调用

import 导入指令

在这里插入图片描述
commons.ftl
在这里插入图片描述
使用宏指令

引入别地的东西


<#import "f03.ftl" as f3>
<@f3.cfb></@f3.cfb>

include包含指令

在这里插入图片描述
可以包含html
ftl
txt文件

在这里插入图片描述

页面静态化介绍

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
定义模板,加载模板

package com.xxx.servler;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.util.Map;
import java.util.HashMap;
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;

@WebServlet("/news")
public class NewsServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//实例化一个模板对象
        Configuration config=new Configuration();
        //设置加载模板的上下文,以及加载模板的路径
        config.setServletContextForTemplateLoading(getServletContext(), "/template");
//设置模板的编码格式
        config.setDefaultEncoding("UTF-8");
 //加载模板文件,获取模板对象
 Template template= config.getTemplate("news.ftl");

 //设置数据模型
        Map<String,Object>map=new HashMap<>();
        map.put("title","标题");
        map.put("source","新华社");
        map.put("pubTime","2020年03月16日 10:00");
        map.put("content","1.\t采用开卷考试方法,建议带自己的电脑,而且一定要测试操控CPLD正常。但要求独立完成,抄袭别人按作弊处理。\n" +
                "2.\t老师不做任何与考核题目有关的答疑。\n");
String basePath = req.getServletContext().getRealPath("/");

File htmlFile=new File(basePath+"/html");

if(!htmlFile.exists()){
 //如果文件目录不存在,则新建目录
 htmlFile.mkdir();
}

//得到生成的文件名
        String fileName=System.currentTimeMillis()+".html";
File file=new File(htmlFile,fileName);
//获取文件输出流
        FileWriter writer = new FileWriter(file);

 //生成html 将数据模型填充到模板中
        try {
            template.process(map,writer);
        } catch (TemplateException e) {
            e.printStackTrace();
        }finally{
            /*关闭资源*/
            writer.flush();
            writer.close();
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值