008_setting指令

1. setting指令为进一步的处理而设置。设置是影响FreeMarker行为的值。<#setting name=value />, name: 设置的名称, 不是表达式。value: 设置的新值, 是表达式。

2. locale: 输出的本地化(语言)。它可以影响数字, 日期等显示格式。它的值是由语言编码(小写两个字母的ISO-639编码)和可选的国家码(大写的两个字母ISO-3166编码)组成的字符串, 它们以下划线相分隔。中文中国本地化设置<#setting locale = "zh_CN" />。

3. number_format设置

3.1. 当没有指定确定的格式化形式时, 用来转化数字到字符串形式的数字格式化设置。可以是下列中的一个预定义值number(默认的, 用户看), computer(计算机识别, 可以给编程语言看), currency(货币)或percent(百分数)。

3.2. Java数字格式语法(java.text.DecimalFormat)

3.2.1. pattern="0", 这里的0代表数字, 如果number的位数大于等于pattern的0的个数, result=number。否则不够的位数以0填充。

3.2.2. #号和0的含义相同, 都是代表数字, 不同的是其不会用0填充, 不够位数就不显示。

3.2.3. E使用科学计数法。

3.2.4. 在金融和统计学实践中, 四舍五入都是根据所谓的一半原则, 这就意味着对最近的"邻居"进行四舍五入, 除非离两个邻居距离相等, 这种情况下, 它四舍五入到偶数的邻居。

4. boolean_format设置

4.1. 以逗号分隔的一对字符串来分别展示true和false值, 当没有指定确定的格式时(比如: 在${booleanValue}中), 将转换布尔值到字符串。

4.2. boolean_format的默认字符串是"true,false"。

4.3. FreeMarker还自带了一个boolean_format是c的值。

4.4. boolean_format用户还可以自定义, 使用逗号分割真和假的值。

5. date_format, time_format, datetime_format设置

5.1. date_format, time_format, datetime_format根据指定的格式将日期、时间、日期-时间值转换为字符串。

5.2. date_format设置仅仅格式于存储的无时间部分的值; time_format仅仅格式于存储无日期部分的值; 而datetime_format仅仅格式于日期-时间值。这些设置也影响进行了?time, ?date, 和?datetime操作的格式。

5.3. 根据java.text.DateFormat可以将日期、时间、日期-时间格式为short(短格式)、medium(中等格式)、long(长格式)和full(完整格式)。

5.4. 根据java.text.SimpleDateFormat指定的格式将日期、时间、日期-时间值转换为字符串。

字母

日期或时间元素

表示

示例

G

时代, 纪元标志符

Text

公元

y

Year

1996; 96

M

年中的月份

Month

07; 11

w

年中的周数

Number

27

W

月份中的周数

Number

1

D

年中的天数

Number

189

d

月份中的天数

Number

10

F

月份中的星期

Number

3

E

星期

Text

星期四

a

AM/PM标记

Text

PM

H

一天中的小时数(0-23)

Number

23

k

一天中的小时数(1-24)

0是24

Number

24

K

AM/PM中的小时数(0-11)

Number

0

h

AM/PM中的小时数(1-12)

0是12

Number

12

m

小时中的分钟数

Number

42

s

分钟中的秒数

Number

59

SS

毫秒数

Number

987

z

时区

General time zone

CST(China Standard Time)

Z

时区

RFC 822 time zone

+0800(东八区)

5.5. ISO 8601:2004格式

5.5.1. 精度选择

  • ms: 毫秒, 通常显示3位数字。
  • s: 秒。
  • m: 分。
  • h: 小时。

5.5.2. 时区偏移可见性选项

  • fz: "Force Zone", 对java.sql.Time和java.sql.Timestamp值也起作用。
  • nz: "No Zone",  从不显示时区偏移。

5.5.3. 时区选项

  • u: 使用UTC来代替time_zone设置建议的内容。
  • fu: "Force UTC", 也就是说, 使用 UTC 来代替time_zone或sql_date_and_time_time_zone设置建议的内容。这会影响java.sql.Date和java.sql.Time值。

6. time_zone时区的名称来显示并格式化时间。默认情况下, 使用JVM的时区。也可以是Java时区API接受的值, 例如: <#setting time_zone = "GMT+08" />。

7. sql_date_and_time_time_zone对于来自SQL数据库(更精确地, 就是java.sql.Time和java.sql.Timestamp对象)的仅日期和仅时间值来说, FreeMarke 会使用该时区来代替 time_zone 设置项指定的时区。我们一般也设置东八区<#setting sql_date_and_time_time_zone = "GMT+08" />。

8. url_escaping_charset用来URL转义的字符集, 来计算转义(%XX)的部分。通常包含FreeMarker的框架应该设置它, 所以不应该在模板中来设置。一般设置utf-8。

9. output_encoding告诉FreeMarker输出的字符集是什么。通常包含FreeMarker的框架应该设置它, 所以不应该在模板中来设置。一般设置utf-8。

10. 例子

10.1. 新建一个名为FMSetting的动态Web工程, 同时添加相关jar包。

10.2. 编写FMFactory.java

package com.fm.util;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import freemarker.template.Configuration;
import freemarker.template.TemplateExceptionHandler;

public class FMFactory {
	private final static FMFactory instance = new FMFactory();
	private FMFactory() {}
	public static FMFactory getInstance() {
		return instance;
	}
	
	private Map<String, Configuration> map = new ConcurrentHashMap<String, Configuration>();
	 
	public synchronized Configuration getCfg(Object servletContext, String path) {
		if(null != map.get(path)) {
			return map.get(path);
		}
		Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
		cfg.setServletContextForTemplateLoading(servletContext, path);
		cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
		map.put(path, cfg);
		
		return cfg;
	}
	
}

10.3. 编写SettingDirective.java

package com.fm.action;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fm.util.FMFactory;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class SettingDirective extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Configuration cfg = FMFactory.getInstance().getCfg(req.getServletContext(), "/WEB-INF/templates");
		Template template = cfg.getTemplate("setting.html");
		
		Map<String, Object> root = new HashMap<String, Object>();
		root.put("javaDate", new Date(System.currentTimeMillis()));
		root.put("sqlDate", new java.sql.Date(System.currentTimeMillis()));
		root.put("sqlTime", new Time(System.currentTimeMillis()));
		root.put("sqlTimestamp", new Timestamp(System.currentTimeMillis()));
		
		Writer out = new OutputStreamWriter(resp.getOutputStream());
		try {
			template.process(root, out);
		} catch (TemplateException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

10.4. 修改web.xml

10.5. 在/WEB-INF/templates下编写setting.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>setting指令</title>
	</head>
	<body>
		<h2>中文中国和德语德国数字显示</h2>
		<#setting locale = "de_DE" />
		德语德国: ${1234.56}<br />
		<#setting locale = "zh_CN" />
		中文中国: ${1234.56}
		
		<h2>number_format设置 </h2>
		<#setting number_format = "currency" />
		${1234.56}<br />
		<#setting number_format = "percent" />
		${1234.56}<br />
		<#setting number_format = "computer" />
		${1234.56}<br /><br />
		1.234使用"0.#"模式: ${1.234?string["0.#"]}<br />
		1.234使用"0.##"模式: ${1.234?string["0.##"]}<br />
		1.234使用"0.###"模式: ${1.234?string["0.###"]}<br />
		1.234使用"0.####"模式: ${1.234?string["0.####"]}<br /><br />
		1使用"000.00"模式: ${1?string["000.00"]}<br />
		12.1使用"000.00"模式: ${12.1?string["000.00"]}<br />
		123.456使用"000.00"模式: ${123.456?string["000.00"]}<br /><br />
		1.2使用"0"模式: ${1.2?string["0"]}<br />
		1.8使用"0"模式: ${1.8?string["0"]}<br />
		1.5使用"0"模式: ${1.5?string["0"]}<br />
		2.5使用"0"模式: ${2.5?string["0"]}<br /><br />
		12345使用"0.##E0"模式: ${12345?string["0.##E0"]}
		
		<h2>boolean_format设置</h2>
		<#setting boolean_format = "男,女" />
		${true}<br />
		${false}
		
		<h2>默认时间</h2>
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "short" time_format = "short" datetime_format = "short"</h2>
		<#setting date_format = "short" />
		<#setting time_format = "short"/>
		<#setting datetime_format = "short" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "medium" time_format = "medium" datetime_format = "medium"</h2>
		<#setting date_format = "medium" />
		<#setting time_format = "medium"/>
		<#setting datetime_format = "medium" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "long" time_format = "long" datetime_format = "long"</h2>
		<#setting date_format = "long" />
		<#setting time_format = "long"/>
		<#setting datetime_format = "long" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "full" time_format = "full" datetime_format = "full"</h2>
		<h2>CST是China Standard Time, 三字母时区ID表示方法已经废弃。</h2>
		<#setting date_format = "full" />
		<#setting time_format = "full"/>
		<#setting datetime_format = "full" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "yyyy-MM-dd w" time_format = "kk" datetime_format = "yyyy-MM-dd G HH:mm:ss.SSS a z"</h2>
		<#setting date_format = "yyyy-MM-dd w" />
		<#setting time_format = "kk" />
		<#setting datetime_format = "yyyy-MM-dd G HH:mm:ss.SSS a z" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "yyyy年MM月dd日 W" time_format = "KK" datetime_format = "yyyy年MM月dd日  G HH:mm:ss.SSS a Z"</h2>
		<#setting date_format = "yyyy年MM月dd日 W" />
		<#setting time_format = "KK"/>
		<#setting datetime_format = "yyyy年MM月dd日  G HH:mm:ss.SSS a Z" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "yyyy/MM/dd D" time_format = "hh" datetime_format = "yyyy/MM/dd G HH:mm:ss.SSS a Z"</h2>
		<#setting date_format = "yyyy/MM/dd D" />
		<#setting time_format = "hh"/>
		<#setting datetime_format = "yyyy/MM/dd G HH:mm:ss.SSS a Z" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "yyyy-MM-dd F" time_format = "HH" datetime_format = "yyyy/MM/dd G HH:mm:ss.SSS a Z"</h2>
		<#setting date_format = "yyyy-MM-dd F" />
		<#setting time_format = "HH"/>
		<#setting datetime_format = "yyyy/MM/dd G HH:mm:ss.SSS a Z" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "yyyy-MM-dd E" time_format = "iso_ms_nz" datetime_format = "iso_ms_nz"</h2>
		<#setting date_format = "yyyy-MM-dd E" />
		<#setting time_format = "iso_ms_nz"/>
		<#setting datetime_format = "iso_ms_nz" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "iso_s_fz" time_format = "iso_s_fz" datetime_format = "iso_s_fz"</h2>
		<#setting date_format = "iso_s_fz" />
		<#setting time_format = "iso_s_fz"/>
		<#setting datetime_format = "iso_s_fz" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "iso_m_u" time_format = "iso_m_u" datetime_format = "iso_m_u"</h2>
		<#setting date_format = "iso_m_u" />
		<#setting time_format = "iso_m_u"/>
		<#setting datetime_format = "iso_m_u" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>date_format = "iso_h_fu" time_format = "iso_h_fu" datetime_format = "iso_h_fu"</h2>
		<#setting date_format = "iso_h_fu" />
		<#setting time_format = "iso_h_fu"/>
		<#setting datetime_format = "iso_h_fu" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>time_zone = "GMT+10"</h2>
		<#setting time_zone = "GMT+10" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
		
		<h2>time_zone = "GMT+10" sql_date_and_time_time_zone = "GMT+12"</h2>
		<#setting time_zone = "GMT+10" />
		<#setting sql_date_and_time_time_zone = "GMT+12" />
		javaDate?date: ${javaDate?date}<br />
		javaDate?time: ${javaDate?time}<br />
		javaDate?datetime: ${javaDate?datetime}<br />
		sqlDate: ${sqlDate}<br />
		sqlTime: ${sqlTime}<br />
		sqlTimestamp: ${sqlTimestamp}
	</body>
</html>

10.6. 运行项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值