JSTL
在JSP页面要用到核心标签,必须使用以下指令:
<%@taglib uri="http://java.sun.com/jsp/jstl
/core" prefix="c" %>
<c:set> :操作提供基于标记的机制来创建和设置限制了作用域的变量。
语法一:将value的值储存至范围为scope的varName变量之中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/> |
属性:
1 var 属性:指定了限制了作用域的变量的名称
2 scope 属性表明了该变量驻留在哪个作用域中,可选的,其缺省值是 page。
2 value 属性:指定了分配给该变量的值
如果指定变量已经存在,则简单地将所指明的值赋给它。如果不存在,则创建新的限制了作用域的变量,并用该值初始化这个变量。
看下面使用<c:set> 的两个示例。
<c:set var="timezone" scope="session" value="CST"/> |
将会话作用域变量设置成 String 值。 |
<c:set var="square" value="${param['x'] * param['x']}"/> 用表达式来设置数值:将页面作用域内名为 square 的变量赋值为名为 x 的请求参数的值的平方。 |
语法二:将本体内容的数据储存至范围为scope的varName变量之中
<c:set var="varName" [scope="{ page|request|session|application }"]> <c:set> 主体内生成的所有内容都将作为一个 String 值赋给指定变量。 |
语法三:将value的值储存至target对象的属性中
c:set value="value" target="target" property="propertyName" /> |
语法四:将本体内容的数据储存至target对象的属性中
<c:set target="target" property="propertyName"> |
名 称 | value | var | scope | target | property |
说 明 | 要被储存的值 | 欲存入的变量名称 | var变量的JSP范围 | 为一JavaBean或java.util.Map对象 | 指定target对象的属性 |
E L | Y | N | N | Y | Y |
类 型 | Object | String | String | Object | String |
必 须 | 否 | 否 | 否 | 否 | 否 |
默认值 | 无 | 无 | page | 无 | 无 |
注意:
一 <c:set>标签有两种不同的属性设置:var和target。
var“版本”用于设置作用域属性,target“版本”用于设置bean属性或Map值。
★ var“版本”
1 <c:set var="userLevel" scope="session" value="Cowboy"/>
2 <c:set var="fido" value="${person.dog}"/>
3 <c:set var="user" scope="session">
Sheriff, Bartender, Cowgirl
</c:set>
如果“value”为null,“var”指定的属性将被删除!
如果“var”指定的属性不存在,则会创建一个属性,但仅当“value”不为null时才会创建新属性。
★ target“版本”
1. <c:set target="${petMap}" property="dogName" value="Clover" scope="session"/>
2. <c:set target="${person}" property="name">
${foo.name}
</c:set>
如果“target”是一个Map,“property”指定的是该Map的一个键;如果“target”是一个bean,“property”指定的是该bean的一个成员字段。
如果“target”表达式为null,容器会抛出一个异常。
如果“target”表达式不是一个Map或bean,容器会抛出一个异常。
如果“target”表达式是一个bean,但是这个bean没有与“property”匹配的成员字段,容器会抛出一个异常。
二 定义变量的使用范围:
<c:set var="varName" [scope="{ page|request|session|application }"]>
默认的是:page 范围 ;“scope” 是可选的,如果没有使用这个属性,则默认为页面作用域。具体的,当没有使用这个属性时,容器会依次在页面作用域、请求作用域、会话作用域、应用作用域查 找,如果找不到“var”指定名字的作用域属性,容器就会在页面作用域新建一个属性;如果找不到“target”指定的对象,容器会抛出一个异常。
<c:set var="para" value="${41+1}" scope="session" />
<c:out value="${sessionScope.para}" />
<c:remove>: 是用来删除限制了作用域的变量的。删除数据。
语法:没有本体(body)内容
<c:remove var="varName" [scope="{ page|request|session|application }"] /> |
<c:remove var="timezone" scope="session"/> |
属性:
1var 属性:指定待删除变量的名称
2scope 属性是可选的,它表示待删除变量来自哪个作用域,缺省为 page。
名 称 | var | scope |
说 明 | 欲移除的变量名称 | var变量的JSP范围 |
EL | N | N |
类型 | String | String |
必须 | 是 | 否 |
默认值 | 无 | page |
<c:out>:显示表达式的值,而不存储它。类似<%= %>
语法一:没有本体(body)内容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /> 该标记对由其 value 属性指定的表达式进行求值,在对 value 属性的表达式求值所得结 果为 null 或空 String 的情况下,<c:out> 将打印其值。 如果value值为null,则显示default的值;没指定default,则输出空字符串。 |
语法一:有本体(body)内容
<c:out value="value" [escapeXml="{true|false}"]> default value </c:out> |
名 称 | value | default | escapeXml |
说 明 | 需要显示出来的值 | 如果value的值为null,则显示default的值 | 是否转换特殊字符,如:< 转换成 < |
E L | Y | Y | Y |
类 型 | Object | Object | boolean |
必 须 | 是 | 否 | 否 |
默认值 | 无 | 无 | true |
escapeXml 属性也是可选的。它控制当用 <c:out> 标记输出诸如“<”、“>”和“&”之类的字符(在 HTML 和 XML 中具有特殊意义)时是否应该进行转义。如果将 escapeXml 设置为 true,则会自动将这些字符转换成相应的 XML 实体(此处提到的字符分别转换成 <、> 和 &)。
例如,假定有一个名为 user 的会话作用域变量,它是一个类的实例,该类为用户定义了两个特性:username 和 company。每当用户访问站点时,这个对象被自动分配给会话,但直到用户实际登录后,才会设置这两个特性。假定是这种方案,在用户登录之后,这个片段将显示单词“Hello”,其后是他/她的用户名和一个惊叹号。但是,在用户登录之前,由这个片段生成的内容则是短语“Hello Guest!”。在这种情况下,因为 username 特性还有待初始化,所以 <c:out> 标记将转而打印出 default 属性的值(即字符串“Guest”)。
Hello <c:out value="${user.username}" default="Guest"/>! 登陆之前:Hello Guest! 登陆之后:Hello ${user.username}! |
<c:if>:执行流程控制,就和我们一般在程序中用的if一样。
语法一:没有本体(body)内容
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/> |
语法二:有本体(body)内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> 本体内容 </c:if> 如果表达式的结果为true,则执行本体内容,false则相反 |
注意:
<c:if> 标签必须要有 test 属性,当 test 中的表达式结果为 true 时,则会执行本体内容;如果为false,则不会执行。如果指定了scope属性,则必须指定var属性。
<c:choose>:本身只当做 <c:when> 和 <c:otherwise> 的父标签。
语法:有本体(body)内容
<c:choose> 本体内容( <when> 和 <otherwise> ) </c:choose> |
限制:
除了空白字符外,<c:choose>的标签体只能包含这两个标签。
<c:choose>的本体内容只能有:
a. 空白 b. 1或多个 <c:when> c . 0或多个 <c:otherwise>
说明:
1 运行时,判断<c:when>标签的测试条件是否为true,第一个测试条件为true的<c:when>标签的标签体将被JSP容器执行。如果没有满足条件的<c:when>标签,那么,<c:otherwise>的标签体将被执行。
2 若使用<c:when>和<c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签
<c:when>:作为<c:choose>的子标签,表示一个可选的条件。
语法:有本体(body)内容
<c:when test="testCondition" > 本体内容 </c:when> |
名 称 | 说 明 | EL | 类型 | 必须 | 默认值 |
test | 如果表达式的结果为true,则执行本体内容,false则相反 | Y | boolean | 是 | 无 |
约束:
<c:when>必须有一个直接的父标签<c:choose>,而且必须在同一个父标签下的<c:otherwise>标签之前出现。
说明:
运行时,判断<c:when>标签的测试条件是否为true,第一个测试条件为true的<c:when>标签的标签体被JSP容器执行。
<c:otherwise>:作为<c:choose>的子标签,表示最后的选择,在同一个 <c:choose> 中,当所有 <c:when> 的条件都没有成立时,则执行 <c:otherwise> 的本体内容。
语法:有本体(body)内容
<c:otherwise> 本体内容 </c:otherwise> |
属性:无
限制:<c:otherwise> 必须在 <c:choose> 和 </c:choose>之间 ·在同一个 <c:choose> 中时,<c:otherwise> 必须为最后一个标签。
说明:在同一个 <c:choose> 中,假若所有 <c:when> 的test属性都不为true时,则执行 <c:otherwise> 的本体内容。
<c:choose> <c:when test="${condition1}"> condition1为true </c:when> <c:when test="${condition2}"> condition2为true </c:when> <c:otherwise> condition1和condition2都为false </c:otherwise> </c:choose> |
范例说明: 当condition1为true时,会显示“condition1为true”;当condition1为false且condition2为true时,会显示“condition2为true”,如果两者都为false,则会显示“condition1和condition2都为false”。 注意 假若condition1和condition2两者都为true时,此时只会显示"condition1为true",这是因为在同一个<c:choose>下,当有好几个<c:when>都符合条件时,只能有一个<c:when>成立。 |
<c:forEach>:为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
语法一:迭代一集合对象之所有成员
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> </c:forEach> |
语法二:迭代指定的次数
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]> </c:forEach> |
名 称 | 说 明 | EL | 类型 | 必须 | 默认值 |
var | 用来存放现在指到的成员 | N | String | 否 | 无 |
items | 被迭代的集合对象 | Y | Arrays Collection Iterator EnumerationMap String | 否 | 无 |
varStatus | 用来存放现在指到的相关成员信息 | N | String | 否 | 无 |
begin | 开始的位置 | Y | int | 否 | 0 |
end | 结束的位置 | Y | int | 否 | 最后一个成员 |
step | 每次迭代的间隔数 | Y | int | 否 | 1 |
限制 :
·假若有begin属性时,begin必须大于等于 0
·假若有end属性时,必须大于等于begin
·假若有step属性时,step必须大于等于0 Null 和 错误处理
·假若items为null时,则表示为一空的集合对象
·假若begin大于或等于items时,则迭代不运算
说明 如果要循序浏览一个集合对象,并将它的内容显示出来,就必须有items属性。
varName的范围只存在<c:forEach>的本体中,如果超出了本体,则不能再取得varName的值。上个例子中,若${item} 是在</c:forEach>之后执行时,如: <c:forEach items="${atts}" var="item" > </c:forEach> ${item}</br> ${item}则不会显示item的内容。
<c:forEach>除了支持数组之外,还有标准J2SE的集合类型,例如:ArrayList、List、LinkedList、Vector、Stack和Set 等等;另外还包括java.util.Map类的对象,例如:HashMap、Hashtable、Properties、Provider和Attributes。
<c:forEach>还有begin、end和step这三种属性:begin主要用来设定在集合对象中开始的位置(注意:第一个位置为0);end用来设定结束的位置;而step则是用来设定现在指到的成员和下一个将被指到成员之间的间隔。我们将之前的范例改成如下:
<c:forEach>中指定的集合对象atts将会从第2个成员开始到第5个成员,并且每执行一次循环都会间隔一个成员浏览。因此结果是只显示atts[1]和atts[3]的内容
JSTL之数字、日期格式化---<fmt:formatNumber/>、<fmt:formatDate/>
日期表示
<fmt:formatDate value="${DATE1}" pattern="yyyy-MM-dd hh:mm:ss" type="date" dateStyle="long" />
百分数,千分数表示
<fmt:formatNumber value="${DoubleVALUE}" type="number" pattern="0.00‰" /> 0.01 ‰<fmt:formatNumber value="${DoubleVALUE}" type="number" pattern="0.00%" /> 0.20 %
其他数字表示
fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/> -- 123,456.79
<fmt:formatNumber value="123456.7" pattern="#,#00.0#"/> -- 123,456.7
<fmt:formatNumber value="123456.7" pattern="#,#00.00#"/> -- 123,456.70
<fmt:formatNumber value="12" type="percent" /> -- 1,200%type 可以是currency、 number、 和percent。
货币表示
===1
<fmt:setLocale value="ch_CH" />
<fmt:formatNumber value="${data}" type="currency" />
==2
<fmt:formatNumber value="${doubleValue}" type="number" pattern="¥0.00" />
参考 ==============================================================================
java格式化输出:
DecimalFormat df = new DecimalFormat("格式");
String fmt =df.format(double);
符号 意义
0 一个数位
# 一个数位,前导零和追尾零不显示
. 小数点分割位置
, 组分隔符的位置
- 负数前缀
% 用100乘,并显示百分号
其他任何符号 在输出字符串中包括指定符号
JSP 国际化-格式化货币和日期
1.格式化货币
世界上许多国家都有不同的货币格式和数字格式惯例。针对特定的本地化环境正确地格式化和显示货币是本地化的一个重要部分。
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Currency Formatting</title>
</head>
<body>
<h1>Currency Formatting and locales</h1>
<h3>English, Great Britain</h3>
<fmt:setLocale value="en_GB" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>English, USA</h3>
<fmt:setLocale value="en_US" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>French, France</h3>
<fmt:setLocale value="fr_FR" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>Japanese, Japan</h3>
<fmt:setLocale value="ja_JP" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>Korean, Korea</h3>
<fmt:setLocale value="ko_KR" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>Spanish, Spain</h3>
<fmt:setLocale value="es_ES" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>Arabic, Egypt</h3>
<fmt:setLocale value="ar_EG" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<h3>Using Local Numeric Formatting for Different Currency</h3>
<h4>English, Great Britan</h4>
<fmt:setLocale value="en_GB" />
<fmt:formatNumber type="currency" value="80000" /><br/>
<fmt:formatNumber type="currency" value="80000" currencyCode="EUR"/><br/>
</body>
</html>
2.格式化日期
类似于数字和货币格式化,本地化环境还会影响生成日期和时间的方式。
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Date Formatting</title>
</head>
<body>
<h1>Date Formatting and locale</h1>
<fmt:timeZone value="EST">
<jsp:useBean id="currentTime" class="java.util.Date"/>
<h3>English, Great Britain</h3>
<fmt:setLocale value="en_GB" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
<h3>English, USA</h3>
<fmt:setLocale value="en_US" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
<h3>French, France</h3>
<fmt:setLocale value="fr_FR" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
<h3>Japanese, Japan</h3>
<fmt:setLocale value="ja_JP" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
<h3>Korean, Korea</h3>
<fmt:setLocale value="ko_KR" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
<h3>Spanish, Spain</h3>
<fmt:setLocale value="es_ES" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
<h3>Arabic, Egypt</h3>
<fmt:setLocale value="ar_EG" />
<fmt:formatDate type="both" dateStyle="full" timeStyle="full" value="${currentTime}" /><br/>
</fmt:timeZone>
</body>
</html>
<fmt:formatDate>动作的属性
type: 可以是time,date或both。控制是否只生成时间,只生成日期,或者时间日期都生成。
dateStyle: 可以是short, medium, long 或 full(default)。控制打印日期使用的具体格式。
timeStyle: 可以是short, medium, long 或 full(default)。控制打印时间使用的具体格式。
value: 这是一个java.util.Date 类型的值,用于生成日期和时间。