xml处理文件
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'}}
日期类型
不能直接用要转换成日期型或者字符串
- 在Servlet中设置日期类型
request.setAttribute("createDate",new Date());
- 获取数据
年月日 ?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中数值类型可以直接输出
- 转字符串
- 普通字符串
- 货币型
- 百分比
- 浮点型的数值转换成指定小数位输出
(#表示小数位)
?string([0.##])
字符串类型
- 在servlet中设置字符串类型的数据
request.setAttribute("msg","hello");
request.setAttribute("msg2","freemarker")
- 获取数据
<#--
数据类型 :字符串类型
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和不存在的时候都会报错
空字符串不报错
- !:指定确实变量的默认值
${value!} 如果value为空默认值是空字符串
${value!“默认值”} 如果value为空,默认值是"默认值" - ??判断变量是否存在
${str??}
返回boolean类型
sequence类型
-
在Servlet中设置序列类型的数据
-
获取数据
<#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}
</#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();
}
}
}