Java for Web学习笔记(三十):JSTL(6)FMT Tag(下)

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.DateEL实例 -->
   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。

相关链接: 我的Professional Java for Web Applications相关文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值