fmt:requestEncoding
<fmt:requestEncoding value="GB18030" />
fmt:requestEncoding说是用来设置请求的编码,但这我们是不需要使用的。对于编码,我们应该在jsp的一开始就设定编码,而不是在半道。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
以及在html的<header>中设置:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
另一方面,现代浏览器的请求如果不使用ISO-8859-1,都会设置Content-Type消息头。通常,在传递表格,用了Content-Type:application/x-www-form-urlencoded,这个就是ISO-8859-1编码。更重要的fmt:requestEncoding不会翻译成为html在HTTP中传递,浏览器对此并无识别。这个只是在jsp文件中作为一个编码的标记而已。一句话:忘记它。
fmt:timezone和fmt:setTimezone
这和fmt:bundle已经fmt:setBundle的使用方式雷同,用于设置时间显示的时区。
缺省,时区使用的是web container的JVM时区,我们也可以在web.xml中设置javax.servlet.jsp.jstl.fmt.timeZone来设置缺省的时区。如果要在页面中指定,可以使用fmt:timezone,也可以设置fmt:formatDate中的timezone参数来实现。
<c:set var="now" value="<%=new java.util.Date()%>" />
<fmt:setTimeZone value="America/Chicago" var="timeZoneCst" /> <!-- 时区的值可以查看java.util.TimeZone的javadoc-->
<fmt:formatDate value="${now}" timeZone="${timeZoneCst}" type="both" /><br/>
<fmt:formatDate value="${now}" type="both" /><br/> <!-- 使用缺省的时区,如无设置,就是web container机器的时区 -->
<fmt:timeZone value="Etc/GMT+1">
<fmt:formatDate value="${now}" type="both" /><br/>
</fmt:timeZone>
网上有一个轮训所有时区的fmt:timeZone的例子[1],抄录如下:
<table border="1" width="100%">
<tr>
<td width="100%" colspan="2" bgcolor="#0000FF">
<p align="center">
<b>
<font color="#FFFFFF" size="4">Formatting:
<fmt:formatDate value="${now}" type="both" timeStyle="long" dateStyle="long" />
</font>
</b>
</p>
</td>
</tr>
<c:forEach var="zone" items="<%=java.util.TimeZone.getAvailableIDs()%>">
<tr>
<td width="51%">
<c:out value="${zone}" />
</td>
<td width="49%">
<fmt:timeZone value="${zone}">
<fmt:formatDate value="${now}" timeZone="${zn}" type="both" />
</fmt:timeZone>
</td>
</tr>
</c:forEach>
</table>
fmt:formatDate和fmt:parseDate
<fmt:formatDate
value="<string>" <!-- 这个值必须是java.util.Date的EL实例 -->
type="<string>" <!-- 有效值为date,time,both,表示只显示日期,只显示时间,两者均显示 -->
dateStyle="<string>" <!-- 在java.text.DateFormat中定义,有效值为default,short,medium,long,full -->
timeStyle="<string>" <!-- 同上 -->
pattern="<string>" <!-- 自定义格式,为java.text.SimpleDateFormat,一旦定义,type,dateStyle,timeStyle将失效 -->
timeZone="<string>"
var="<string>" <!-- 在scope范围中存放的参数 -->
scope="<string>"/>
在前面fmt:timeZone,我们已经给出了fmt:formatDate的相关使用例子,不再重复。这里要指出的是,不同的locale,会有不同的显示方法,例如2016年10月3日,dateStyle=”short”,在en_US中显示为10/3/16,在法国法语中显示为3/10/16。
fmt:parseDate是fmt:formatDate的反向操作,参数一样,将字符串对象为Date的对象,存放在var中。这在实际中很少使用。
<c:set var="test" value="20-10-2010" />
<fmt:parseDate value="${test}" var="parsedEmpDate" pattern="dd-MM-yyyy" />
Parsed Date: <c:out value="${parsedEmpDate}"
fmt:formatNumber和fmt:parseNumber
fmt:formatNumber是非常有用的,可以用来显示数字,货币,百分比(NUMBER, CURRENCY, or PERCENT )。
<c:set var="num" value="12345.6789" />
<fmt:formatNumber type="currency" value="${num}"/> ¤12,345.68
<fmt:formatNumber type="currency" value="${num}" currencyCode="CNY" /> CNY12,345.68
<fmt:formatNumber type="currency" value="${num}" currencySymbol="$"/> $12,345.68,不建议使用,另currencyCode优先
<fmt:setLocale value="zh_CN"/>
<fmt:formatNumber type="currency" value="${num}"/> ¥12,345.68
<fmt:formatNumber type="currency" value="${num}" currencyCode="CNY" /> ¥12,345.68
<fmt:setLocale value="es_ES"/>
<fmt:formatNumber type="currency" value="${num}"/> 12.345,68 €
<fmt:formatNumber type="currency" value="${num}" currencyCode="CNY" /> 12.345,68 CNY
currencyCode可以在 https://en.wikipedia.org/wiki/ISO_4217 中查看。我们看到西班牙货币的显示怪怪的,一般建议使用currencyCode,我们是CNY。在设定CNY的使用如果local是zh_CN(一致),则显示货币¥12,345.68,否则显示CNY12,345.68,具体格式根据本地locale的习惯,更符合本地人的阅读方式。
<c:set var="number" value="12345.6789" />
<fmt:formatNumber type="number" value="${number}" /> 12,345.679
<fmt:formatNumber type="number" value="${number}" maxIntegerDigits="3"/> 345.679 不建议使用
<fmt:formatNumber type="number" value="${number}" minIntegerDigits="6"/> 012,345.679
<fmt:formatNumber type="number" value="${number}" maxFractionDigits="1"/> 12,345.7
<fmt:formatNumber type="number" value="${number}" minFractionDigits="6"/> 12,345.678900
<fmt:formatNumber type="number" value="${number}" minFractionDigits="6" groupingUsed="false"/> 12345.678900
上述的参数对所有type都有效。
<fmt:formatNumber type="percent" value="0.8572" /> 86% 可通过minFractionDigits设置小数点显示位数
maxFractionDigits在货币中根据locale的习惯,在数字中缺省为3,在percent中缺省为0。可以通过pattern设置样式,pattern遵循java.text.DecimalFormat的规则。
fmt:parseNumber用来反向解析的,没有minIntegerDigits,maxIntegerDigits,minFractionDigits,maxFractionDigits,groupingUsed参数,提供integerOnly,true表示只解析整数部分,提供parseLocale参数用于设定特定的locale。