JSTL核心标签库包含了一组用于实现WEB应用中的通用操作的标签,JSP规范为核心标签库建议的前缀名为c。
表8.2 特殊字符转换
语法1,没有标签体的情况:
[escapeXml="{true|false}"]
[default="defaultValue"]/>
语法2,有标签体的情况,在标签体中指定输出的默认值:
[escapeXml="{true|false}"] >
defaultvalue
表8.3
属性名 |
是否支持EL |
属性类型 |
属性描述 |
value |
true |
Object |
指定要输出的内容 |
escapeXml |
true |
Boolean |
指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true |
default |
true |
Object |
指定如果value属性的值为null时所输出的默认值 |
当且仅当value属性的值为null时,
例程8-3是
例程8-3 c_out1.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
<%
session.setAttribute("test_session","testValue_session");
%>
直接输出一个字符串:
输出Web域中不存在的属性的值:
输出Web域中的test_session属性的值:
例程8-3的运行结果如图8.1所示。
例程8-4和例程8-5是两个用于演示
例程8-4 c_out2.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
例程8-5 c_out3.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
例程8-4和例程8-5的运行结果分别如图8.2和图8.3所示。
语法1,使用value属性设置指定域中的某个属性的值:
var="varName"
[scope="{page|request|session|application}"]/>
语法2,在标签体中设置指定域中的某个属性的值:
[scope="{page|request|session|application}"]>
bodycontent
语法3,使用value属性设置Web域中的一个属性对象的某个属性:
target="target"
property="propertyName" />
语法4,在标签体中设置Web域中的一个属性对象的某个属性性:
property="propertyName">
bodycontent
表8.4
属性名 |
是否支持EL |
属性类型 |
属性描述 |
value |
true |
Object |
用于指定属性值 |
var |
false |
String |
用于指定要设置的Web域属性的名称 |
scope |
false |
String |
用于指定属性所在的Web域 |
target |
true |
Object |
用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象 |
property |
true |
string |
用于指定当前要为对象设置的属性名称 |
如果使用第1种语法格式时的value属性值为null,或者使用第2种语法格式时的标签体内容为空,
在第3种语法格式和第4语法格式中,如果target属性的值是java.util.Map对象,property属性表示该Map对象的关键字,如果Map对象没有指定的关键字,就给Map对象增加指定的关键字;如果target属性的值是JavaBean对象,property属性表示JavaBean对象的属性,如果value的类型与JavaBean属性的类型不匹配时,会根据EL的转换规则自动进行转换。当使用第3种语法格式或第4种语法格式时,如果target属性的值为null(即target属性指定的对象不存在),或者target属性的值是一个JavaBean对象,但该JavaBean中不存在property属性指定的属性,
例程8-6是使用
例程8-6 c_set1.jsp
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ pagecontentType="text/html;charset=gb2312" %>
zxx
输出session作用域中的userNamer属性的值:
输出session作用域中的bookname属性的值:
例程8-6的运行结果如图8.4所示。
例程8-7是使用
例程8-7 c_set2.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
<%@page import="java.util.HashMap" %>
<%
HashMap preferences = new HashMap();
session.setAttribute("preferences",preferences);
%>
设置和输出UserBean对象的userName属性值:
设置和输出UserBean对象的password属性值:
设置和输出Map对象的color关键字的值:
在浏览器地址栏输入如下地址访问例程8-7:
http://localhost:8080/JSTL/c_set2.jsp?color=green
例程8-7的运行结果如图8.5所示。
[scope="{page|request|session|application}"]/>
var属性用于指定要删除的属性的名称,scope属性用于指定要删除的属性所属的Web域,它们的值都不能接受动态值。如果没有指定scope属性,
例程8-8是使用
例程8-8 c_remove.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
a123456a
在没有使用 <c:remove> 标签之前,变量的值为:
company:
passWord:
在使用 <c:remove> 标签之后,变量的值为:
company:
passWord:
例程8-8的运行结果如图8.6所示。
nestedactions
var属性用于标识
例程8-9是使用
例程8-9 c_catch.jsp
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ pagecontentType="text/html;charset=gb2312" %>
<%
int i = 0;
int j = 10;
out.println(j +"/" + i + "=" + j/i);
%>
异常:
异常 myex.getMessage:
异常 myex.getCause:
异常 myex.getStackTrace:
在例程8-9中,
JSP页面的显示逻辑中也经常需要进行条件判断,
语法1,没有标签体的情况:
[scope="{page|request|session|application}"] />
语法2,有标签体的情况,在标签体中指定要执行的内容:
[scope="{page|request|session|application}"]>
bodycontent
表8.5
属性名 |
是否支持EL |
属性类型 |
属性描述 |
test |
true |
boolean |
决定是否处理标签体中的内容的条件表达式 |
var |
false |
String |
用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称 |
scope |
false |
String |
指定将test属性的执行结果保存到哪个Web域中 |
对于语法2,如果指定了
例程8-10是使用
例程8-10 c_if.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
这是您第一次访问本网站,欢迎您!
在浏览器地址栏输入如下地址访问例程8-10:
http://localhost:8080/JSTL/c_if.jsp?count=1
例程8-10的运行结果如图8.8所示。
当JSP页面中使用
例程8-11是使用
例程8-11 c_choose.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
对不起,没有符合您要求的记录。
符合您要求的记录共有${count}条.
在浏览器地址栏输入如下地址访问例程8-11:
http://localhost:8080/JSTL/c_choose.jsp?count=0
例程8-11的运行结果如图8.9所示。如果将参数count的值修改为10,则运行结果如图8.10所示。
例程8-12是一个综合使用
例程8-12 c_customLogic.jsp
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Yourfavourite course is computer.
Yourfavourite course is other.
在浏览器地址栏中直接访问c_customLogic.jsp的运行结果如图8.11所示,在文本框中输入“computer”,单击其中的submit按钮后的运行结果如图8.12所示。
JSP页面的显示逻辑中也经常需要对集合对象进行循环迭代操作,
语法1,在集合对象中迭代:
items="collection"
[varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
语法2,迭代固定的次数:
[varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
表8.6
属性名 |
是否支持EL |
属性类型 |
属 性 描 述 |
var |
false |
String |
指定将当前迭代到的元素保存到page这个Web域中的属性名称 |
items |
true |
任何支持的类型 |
将要迭代的集合对象 |
varStatus |
false |
String |
指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称 |
begin |
true |
int |
如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代 |
end |
true |
int |
参看begin属性的描述 |
step |
true |
int |
指定迭代的步长,即迭代因子的迭代增量 |
在使用
l 如果指定begin属性,其值必须大于或等于零;
l 如果指定步长(step属性),其值必须大于或等于1;
l 如果items属性的值为null,则要处理的集合对象为空,这时不执行迭代操作;
l 如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作;
l 如果指定的end属性的值小于begin属性的值,不执行迭代操作;
l 任意类型的数组
l java.util.Collection
l java.util.Iterator
l java.util.Enumeration
l java.util.Map
l String
items属性还支持与数据库有关的数据类型java.sql.ResultSet(包括javax.sql.RowSet),这些数据类型将在8.5 节的数据库标签中进行介绍。对字符串的迭代操作通常使用
1.迭代Collection类型的集合对象
例程8-13是使用
例程8-13 c_forEach_collection.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ pagecontentType="text/html;charset=gb2312" %>
<%@ pageimport="java.util.*,org.it315.UserBean" %>
<%
Collection users = new ArrayList();
for(int i=0; i<5; i++)
{
UserBean user = new UserBean();
user.setUserName("user"+ i);
user.setPassword("guess"+ i);
users.add(user);
}
session.setAttribute("users",users);
%>
用户名 密码
${user.userName} ${user.password}
例程8-13的运行结果如图8.13所示。
2.迭代Map对象
使用
EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所以我们可以使用
例程8-14 c_forEach_map.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
<%
request.setAttribute("attr1","value1");
request.setAttribute("attr2","value2");
%>
Map的关键字 Map的对应关键字的值 ${entry.key} ${entry.value}
例程8-14的运行结果如图8.14所示。
3.迭代指定的次数
例程8-15 c_forEach_count.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
从11到16迭代,指定迭代步长为2:
${i}
从0到5迭代,没有指定迭代步长:
${i}
例程8-15的运行结果如图8.15所示。
4.指定迭代集合对象的范围和步长
例程8-16 c_forEach_col.jsp
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,org.it315.UserBean" %>
<%
Collection users =new ArrayList();
for(int i=0;i<6; i++)
{
UserBean user= new UserBean();
user.setUserName("user"+ i);
user.setPassword("guest"+ i);
users.add(user);
}
session.setAttribute("users",users);
%>
用户名 密码
${user.userName} ${user.password}
例程8-16的运行结果如图8.16所示。
5.获取迭代的状态信息
不管是迭代集合对象,还是迭代指定的次数,在迭代时都可以获得当前的迭代状态信息。
l public java.lang.IntegergetBegin()
返回为标签设置的begin属性的值,如果没有设置begin属性则返回null
l public int getCount()
返回当前已循环迭代的次数
l public java.lang.ObjectgetCurrent()
返回当前迭代到的元素对象
l public java.lang.IntegergetEnd()
返回为标签设置的end属性的值,如果没有设置end属性则返回null
l publicint getIndex()
返回当前迭代的索引号
l public java.lang.IntegergetStep()
返回为标签设置的step属性的值,如果没有设置step属性则返回null
l public booleanisFirst()
返回当前是否是第一次迭代操作
l public booleanisLast()
返回当前是否是最后一次迭代操作
例程8-17是一个获取迭代状态信息的例子程序。
例程8-17 c_forEach_col2.jsp
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ pagecontentType="text/html;charset=gb2312" %>
<%@ pageimport="java.util.*,org.it315.UserBean" %>
<%
Collection users =new ArrayList();
for(int i=0;i<6; i++)
{
UserBean user= new UserBean();
user.setUserName("user"+ i);
user.setPassword("guest"+ i);
users.add(user);
}
session.setAttribute("users",users);
%>
用户名 密码 index
count first? last?
${user.userName} ${user.password} ${sta.index} ${sta.count} ${sta.first} ${sta.last}
数值 index count
first? last?
${i} ${sta1.index} ${sta1.count} ${sta1.first} ${sta1.last}
例程8-17的运行结果如图8-17所示。
6.与条件标签结合使用
迭代标签可以与条件标签结合使用,对数据进行有条件的迭代,应用举例如例程8-18所示。
例程8-18 c_forEach_com.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html;charset=gb2312" %>
number count even|odd
偶数行 奇数行 ${i} ${status.count}
例程8-18的运行结果如图8.18所示。 [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"][step="step"]> bodycontent
表8.7 c:forTokens 属性名 是否支持EL 属性类型 属 性 描 述 var false String 指定将当前迭代出的子字符串保存到page这个Web域中的属性名称 items true String 将要迭代的字符串 delims true String 指定一个或多个分隔符 varStatus false String 指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称,代表当前迭代的状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看这个类的详细信息 begin true int 指定从第begin个子字符串开始进行迭代,begin的索引值从0开始编号 end true int 指定迭代到第begin个子字符串,begin的索引值从0开始编号 step true int 指定迭代的步长,即每次迭代后的迭代因子增量 在使用 l 如果指定begin属性,其值必须大于或等于零。 l 如果指定步长(step属性),其值必须大于或等于1。 l 如果指定的end属性的值小于begin属性的值,不执行迭代操作。 例程8-19是一个使用 例程8-19 c_forTokens.jsp <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %> <%@ pagecontentType="text/html;charset=gb2312" %> 使用"|"作为分隔符 ${token}© 使用"|"和","作为分隔符 ${token}© 使用"-"作为分隔符 ${token}©
例程8-19的运行结果如图8.19 所示。
JSTL核心标签库中提供了如下一些与URL操作相关的标签: l l l l 在举例讲解上面的某些标签时,要引用另外一个JSP文件,这里先创建好这个JSP文件,如例程8-20所示。 例程8-20 register.jsp <%@ taglibprefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ pagecontentType="text/html;charset=gb2312" %> <% String name = request.getParameter("name"); name = newString(name.getBytes("iso-8859-1"),"gb2312"); session.setAttribute("name",name); String country = request.getParameter("country"); country = newString(country.getBytes("iso-8859-1"),"gb2312"); session.setAttribute("country",country); %> name=${name}; country=${country} 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。 语法1,使用value属性指定参数的值: 语法2,在标签体中指定参数的值: parameter value
表8.8 语法1,没有标签体的情况: [context="context"] [var="varName"] [scope="{page|request|session|application}"] /> 语法2,有标签体的情况,在标签体中指定构造的URL的参数: [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
表8.9 属性名 是否支持EL 属性类型 属 性 描 述 value true String 指定要构造的URL context true String 当要使用相对路径导入同一个服务器下的其他WEB应用程序中的URL地址时,context属性指定其他WEB应用程序的名称 var false String 指定将构造出的URL结果保存到Web域中的属性名称 scope false String 指定将构造出的URL结果保存到哪个Web域中 value属性所指定的URL可以是相对路径和绝对路径,其具体细节与8.3.12节的 例程8-21是一个使用 例程8-21 c_url.jsp <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ pagecontentType="text/html;charset=gb2312" %> 使用绝对路径构造URL:
使用相对当前JSP页面的路径构造URL: 使用相对当前WEB应用的路径构造URL: 在浏览器地址栏输入如下地址访问例程8-21: http://localhost:8080/JSTL/c_url.jsp?country=China 查看例程8-21的运行结果的源文件,内容如例程8-22所示。 例程8-22 c_url.jsp运行结果的源文件 使用绝对路径构造URL: 使用相对当前JSP页面的路径构造URL: 使用相对当前WEB应用的路径构造URL: 语法1,将URL地址指向的资源内容以字符串形式输出或以字符串形式保存到一个变量中: [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]> optionalbody content for
语法2,将URL地址指向的资源内容保存到一个Reader对象中: [context="context"] varReader="varReaderName" [charEncoding="charEncoding"]> bodycontent where varReader is consumed by another action
表8.10 属性名 是否支持EL 属性类型 属 性 描 述 url true String 指定要导入的资源的URL地址 context true String 当要使用相对路径导入同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称 var false String 指定将导入的资源内容保存到Web域中的属性名称 scope false String 指定将导入的资源内容保存到哪个Web域中 charEncoding true String 将导入的资源内容转换成字符串时所使用的字符集编码 varReader false String 指定将导入的资源内容保存到page域中的一个java.io.Reader对象中,varReader属性指定了该Reader对象在page这个Web域中的属性名称。 使用 当使用第1种语法格式时,如果指定了var属性,导入的资源内容以字符串形式保存到一个变量中,var属性指定了这个变量保存在Scope属性指定的Web域中的名称;如果没有指定var属性,导入的资源内容将以字符串形式直接输出。第1种语法格式的标签体内中可以嵌套 使用第2种语法格式时,导入的资源内容保存到page域中的一个java.io.Reader对象中,varReader属性指定了该Reader对象在page这个Web域中的属性名称。因为 使用 1.使用相对URL导入其他资源文件 (1)当被导入的外部资源文件与当前JSP文件属于同一个WEB应用程序时,JSP容器对资源路径的处理与 (2)当被导入的外部资源文件与JSP文件属于同一个服务器下的不同的WEB应用时,如果要使用相对路径,路径必须以“/”开始。此时, 2.使用绝对URL导入其他资源 使用绝对路径导入外部资源文件时,即使被导入的文件与当前JSP文件属于同一个WEB应用程序,被导入的资源文件也不会共享当前JSP页面的request和session对象。因为在这种情况下,当前JSP文件所属的Web服务器充当了一个Http客户端程序,去访问绝对路径所指定的外部资源文件,然后将响应结果的实体内容加入到当前JSP页面中,此时,访问当前JSP页面的客户端是浏览器,而访问绝对路径所指定的外部资源文件的客户端是当前JSP文件所属的Web服务器,这显然属于两个不同的客户端,所以,被导入的资源文件和当前JSP页面不可能共享request和session对象。 例程8-23是使用 例程8-23 c_import.jsp <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %> <%@ pagecontentType="text/html;charset=gb2312" %> 使用相对路径导入同一个WEB应用中的资源: 使用相对路径导入同一个服务器下的不同WEB应用中的资源: 使用绝对路径导入资源示例1: 使用绝对路径导入资源示例2: charEncoding="gb2312">
${myImport} 在浏览器地址栏输入如下地址访问例程8-23,其运行结果如图8.20 所示: http://localhost:8080/JSTL/c_import.jsp?name=zxx&country=China 在 语法1,没有标签体的情况: 语法2,有标签体的情况,在标签体中指定重定向时的参数:
表8.11 属性名 是否支持EL 属性类型 属 性 描 述 url true String 指定要转发或重定向到的目标资源的URL地址 context true String 当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称 url属性指定将要重定向的资源的URL时,可以使用相对路径和绝对路径,其具体细节与 例程8-24 c_redirect.jsp <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ pagecontentType="text/html;charset=gb2312" %>
例程8-24的运行结果如图8.21 所示。 好了,先到这里吧!
8.3.8
8.3.9 URL相关的标签概述
8.3.10
8.3.11
8.3.12
8.3.13
你可能感兴趣的:(JavaWeb开发第8章标准标签库(JSTL)之一二核心标签库)