JSTL标签
包括以下几个标签库:
核心标签库 http://java.sun.com/jsp/jstl/core c
Xml标签库 http://java.sun.com/jsp/jstl/xml x
国际化/格式化标签库 http://java.sun.com/jsp/jstl/fmt fmt
数据库标签库 http://java.sun.com/jsp/jstl/sql sql
EL自定义函数 http://java.sun.com/jsp/jstl/functions fn
注: 语法说明
[…]:表示括号中的内容是可选的
{option1| option2| option3| option4|….}:花括号中的”|”字符分隔的各个选项不能同时出现,只能选一个.
属性的值字体加粗,表示这个值是对应属性的默认值
属性的值斜体,表示该属性可以是表达式
标签的内容用斜体,表示标签体的内容可以是jsp代码.
核心标签库:
<c:out>语法: (1) <c:out value=”value” [escapeXml=”${true|false}”]
[default=” defaultValue”] />
(2) <c:out value=”value” [escapeXml=”${true|false}”]>
default value
</c:out>
<c:out>标签属性说明
属性名 | 是否支持EL | 属性类型 | 属性描述 |
value | true | Object | 指定输出的内容 |
escapeXml | true | boolean | 是否将 >,<,’,”,&,等特殊字符进行HTML编码转换后再进行输出,默认是true. |
default | true | Object | 如果value属性的值为null时,所输出的默认值. 如果没有指定默认值,默认为null字符串. |
特殊字符转换表
字符 | 字符实体编码 |
< | < |
> | > |
& | & |
‘ | ' |
“ | "t; |
当escapeXml=true时,对特殊字符输出为字符实体编码中对应的值.
当escapeXml=false时,则不对特殊字转换,直接输出<,>,&,’,”
例子1:
Out1.jsp
<%
session.serAttribute(“test_session”,”zhangfan”);
%>
<c:out value=”test” default=” 123456” /><br/>
<c:out value=”${test_request}” default=”这个属性不存在”/><br/>
<c:out value=”${test_session}” /><br/>
运行结果:
test
这个属性不存在
zhangfan
例子2:
Out2.jsp
<c:out value=”${null}”>
<meta http-equiv=”refresh” content=”0;url=http://www.it315.org”/>
</c:out>
运行结果:
<meta http-equiv=”refresh” content=”0;url=http://www.it315.org”/>
例子3:
把例2中<c:out value=”${null}”>变成<c:out value=”${null}” escapeXml=”false”>其他不变.
运行结果:
显示http://www.it315.org这个网页.
<c:if>标签语法:
(1)<c:if test=”testCondition” var=”varname”
[scope=”{page|request|session|application}”] />
(2) <c:if test=”testCondition” var=”varname”
[scope=”{page|request|session|application}”] >
body content
</c:if>
<c:if>标签属性
属性名 | 是否支持EL | 属性类型 | 属性描述 |
test | true | boolean | 是否处理标签体中的内容的条件表达式 |
var | false | String | 用于指定将test属性的执行结果保存在某个web域中的某个属性的名称 |
scope | false | String | 指定将test属性的执行结果保存在哪个web域中 |
先写一个UserBean类,此类在org.it315包下.
public class UserBean{
private String username;
private String password;
private String address;
private int visitCount;
get()/set()方法;
}
例子1:
if1.jsp
<jsp:useBean id=”user” class=”org.it315.UserBean”>
<c:set value=”${param.count}” target=”${user}” property=” visitCount” />
<c:if test=”${user. visitCount==1}”>
这是您第一次访问!
</c:if>
地址栏输入http://localhost:8080/JSTL/if1.jsp?count=1
运行结果:
这是您第一次访问!
<c:set>标签语法:
<c:set>用于设置各种web域中的属性,或者设置web域中的java.until.Map类型的属性对象或javabean类型的属性对象的属性.
(1) 使用value属性设置指定域中的某个属性的值:
<c:set value=”value” var=”varName”
[scope=”{page|request|session|application}”] />
(2) 在标签体中设置指定域中的某个属性的值:
<c:set var=” varName” [scope=”{page|request|session|application}”]>
body content
</c:set>
(3) 使用value属性设置web域中的一个属性对象的某个属性:
<c:set value=”value” target=”target” property=”propertyName” />
(4)在标签体中设置web域中的一个属性对象的某个属性:
<c:set target=”target” property=”propertyName” />
body content
</c:set>
<c:set>标签的属性
属性名 | 是否支持EL | 属性类型 | 属性描述 |
value | true | object | 用于指定属性值 |
var | false | string | 用于指定要设置的web域属性的名称 |
scope | false | string | 用于指定属性所在的web域 |
target | true | object | 用于指定要设置属性的对象,这个对象必须是javabean对象或java.until.Map对象 |
property | true | string | 用于指定当前要为对象设置的属性名称 |
当语法(1)中value属性值为null,或者使用语法(2)格式时,标签内容为空,<c:set>标签将从scope属性指定的域范围中删除var属性指定的属性.
语法(3)和语法(4)格式中:如果target属性的值是java.until.Map对象,property属性表示该Map对象的关键字,如果Map对象没有指定关键字,就给Map对象增加指定的关键字.如果target属性的值是javabean对象, property属性表示该javabean对象的属性.如果value的类型与javabean属性的类型不匹配时,会根据EL的转换规则自动进行转换.
当使用语法(3)和语法(4)时,如果target属性的值是null(即target属性指定的对象不存在),或者target属性的值是一个javabean对象,但该javabean中不存在property属性指定的属性.<c:set> 标签将抛出异常.
如果使用语法(3)时,value属性的值为null,或者使用语法(4)时标签体的内容为空,如果target属性的值是一个java.until.Map对象,就从Map对象中删除property属性指定的关键字对应的项;如果target属性的值是一个javabean对象,就将javabean的相应属性的值设置为null.
例子: set1.jsp
<c:set var=”userName” scope=”session”>
zxx
</c:set>
结果1:
<c:out value=”${userName}” /><br/>
结果2:
<c:set var=”bookName” scope=”session” />
<c:out value=”${bookName}” />
运行结果:
结果1:zxx
结果2:
set2.jsp
<%
HashMap preferences = new ArrayList();
Session.setAttribue(“preferences”, preferences);
%>
<jsp:userBean id=”user” class=”org.it315.UserBean” />
操作UserBean的userName属性结果:
<c:set value=”zxx” target=”${user}” property=”userName” />
<c:out value=”${user.userName}” /><br/>
操作userbean的password属性的结果:
<c:set target=”${user}” property=”password” />
<c:out value=”${user.password}” /><br/>
操作Map对象的color关键字的值:
<c:set target=”${preferences}” property=”color” value=”${param.color}” />
<c:out value=”${ preferences.color}” /><br/>
在浏览器中输入http://localhost:8080/JSTL/set2.jsp?color=green
运行结果:
操作UserBean的userName属性结果:zxx
操作userbean的password属性的结果:
操作Map对象的color关键字的值: green
<c:choose>标签:
用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用,使用 <c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似if-else if-else的条件判断结构.
<c:choose>标签没有属性,在它的标签体内只能嵌套一个或多个<c:when>标签和0个或一个<c:otherwise>标签,并且同一个<c:choose>标签中的所有<c:when>子标签必须出现在<c:otherwise>子标签之前.
如果<c:choose>标签内嵌套一个<c:when>标签和<c:otherwise>标签,就相当于”if-else”
如果<c:choose>标签内嵌套多个<c:when>标签和一个<c:otherwise>标签,就相当于”if-else if-else”
<c:when>标签只有一个test属性,为boolean类型.test属性支持动态值,其值可以是一个条件表达式/如果属性的值为true,就执行这个<c:when>标签体的内容. <c:when>标签体的内容可以是任意的jsp代码. <c:otherwise>标签没有属性,它必须作为<c:choose>标签的最后分支出现.
当jsp页面使用<c:choose>标签时,嵌套在<c:choose>内的test条件成立的第一个<c:when>标签的标签体内容将执行和输出,当且仅当所有的<c:when>标签的test条件都不成立时,才执行和输出<c:otherwise>标签的标签体的内容.如果所有的<c:when>标签的test条件都不成立,并且<c:choose>标签内没嵌套<c:otherwise>标签,则不执行任何操作.
例子:
choose1.jsp:
<c:set value=”${param.count}” var=”count” />
<c:choose>
<c:when test=”${count==0}”>
对不起!
</c:when>
<c:otherwise>
符合要求的记录为${count}条
</c:otherwise>
</c:choose>
在浏览器地址栏中输入:
http://localhost:8080/JSTL/choose1.jsp?count=0
输出结果:
对不起!
(如果将count=0改为count=10,则输出结果为:符合要求记录为10条)
例子2:choose2.jsp
这是一个综合使用<c:if>标签和<c:choose>标签的例子.
首先使用<c:if>标签判断表单提交方式是否是post.如果是,就再使用<c:choose>等标签根据表单提交的内容进行不同的处理.
<c:if test=”${pageContext.request.method==’post’}”>
<c:choose>
<c:when test=”${param.favor==’computer’}”>
您的爱好是计算机
</c:when>
<c:otherwise>
您的爱好是其他
</c:otherwise>
</c:if>
<form method=”post”>
您的爱好是什么?
<input type=”text” name=”favor” />
<input type=”submit” value=”submit” />
</form>
运行结果:您的爱好是计算机
(把form里的post改成get)则结果为:您的爱好是其他.
<c:forEach>标签:
对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签中的内容.
语法:
(1) 迭代固定的次数:
<c:forEach [var=”varName”]
[varStatus=”varStatusName”]
begin=”begin” end=”end” [step=”step”] >
body context
</c:forEach>
(2) 对集合对象中迭代:
<c:forEach [var=”varName”]
items=”collection”
[varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”] >
body context
</c:forEach>
<c:forEach>标签的属性
属性名 | 是否支持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 | 指定迭代的步长,即迭代因子的迭代增数量 |
<c:forEach>标签注意:
(1) 如果指定begin属性,其值必须大于或等于零.
(2) 如果指定step属性,其值必须大于或等于1.
(3) 如果items属性值为null,则要处理的集合对象为空,这是不执行迭代操作。
(4) 如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作。
(5) 如果指定的end属性的值小于begin属性的值,不执行迭代操作。
<c:forEach>标签的items属性的值支持下面数据类型:
(1) 任意类型的数组
(2) java.until.Iterator
(3) java.until.Enumeration
(4) java.until.Collection
(5) java.until.Map
(6) String
(7) java.sql.ResultSet(包括javax.sql.RowSet)
一.迭代Collection类型的集合对象
例子:collection1.jsp
<%
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.setArribute(“users”,users);
%>
<table>
<tr><td>用户名</td><td>密码</td></tr>
<c:forEach var=”user” items=”${users}”>
<tr>
<td>${user.userName}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
结果:
用户名 密码
user0 guess0
user1 guess1
user2 guess2
user3 guess3
user4 guess4
二.迭代Map对象:
使用<c:forEach>迭代出的每个元素的类型为Map.Entry, Map.Entry代表Map集合中的一个条目项,其中的getKey()方法获得条目项的关键字。getValue()方法可获得条目项的值。
EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所以可以使用<c:forEach>迭代出EL中的requestScope隐含对象中的所有元素。
例子:Map1.jsp
<%
request.setArribute(“attr 1” ,”value 1” );
request.setArribute(“attr 2” ,” value 2” );
%>
<table>
<tr>
<td>map的关键字</td>
<td>map的对应关键字的值</td>
</tr>
<c:forEach var=”entry” items=”${requestScope}”>
<tr>
<td>${entry.key}</td>
<td>${entry.value}</td>
</tr>
</c:forEach>
</table>
结果:map的关键字 map对应关键字的值
attr1 value1
attr2 value2
三.迭代指定的次数:
<c:forEach>标签可以按指定的次数重复迭代执行标签体中的内容,可以指定迭代的步长,也可不指定。
例子:count.jsp
从11到16迭代,指定迭代步长为2:
<c:forEach var=”i” begin=” 11” end=” 16” step=” 2” >
${i}
</c:forEach><br/>
从0到5迭代,没指定步长:
<c:forEach var=”i” begin=” 0” end=” 5” >
${i}
</c:forEach><br/>
结果:
从11到16:11,13,15
从0到5:0,1,2,3,4,5
四.指定迭代集合对象的范围和步长:
<c:forEach>标签迭代集合类对象时,也可以指定迭代的范围和步长
例子:clo.jsp
<%
Collection users = new ArrayList();
for(int i=0;i<6;i++){
UserBean user = new UserBean();
user.setUserName(“user”+i);
user.setPassword(“guess”+i);
users.add(user);
}
session.setArribute(“users”,users);
%>
<table>
<tr><td>用户名</td><td>密码</td></tr>
<c:forEach var=”user” items=”${users}” end=” 5” step=” 2” >
<tr>
<td>${user.userName}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
结果:
用户名 密码
user0 guess0
user2 guess2
user4 guess4
五.获取迭代的状态信息:
<c:forEach>可以当代表当前迭代状态信息的对象保存到page域中
varStatus属性指定了这个对象保存在page域中的属性名称
代表当前迭代状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus.
从JSTL中查看这个类的详细信息,如下方法:
(1) public java.lang.Integer getBegin()
返回为标签设置的begin属性的值,如果没有设置begin属性则返回null
(2) public java.lang.Object.getCurrent()
返回当前迭代到的元素对象
(3) public java.lang.Integer getEnd()
返回为标签设置的end属性的值,如果没有设置end属性则返回null
(4) public int getIndex()
返回当前迭代的索引号
(5) public java.lang.Integer getStep()
返回为标签设置的step属性的值,如果没设置则返回null
(6) public boolean isFirst()
返回当前是否是第一次迭代操作
(7) public boolean isLast()
返回当前是否是最后一次迭代操作
例子:clo2.jsp
<%
Collection users = new ArrayList();
for(int i=0;i<6;i++){
UserBean user = new UserBean();
user.setUserName(“user”+i);
user.setPassword(“guess”+i);
users.add(user);
}
session.setArribute(“users”,users);
%>
<table>
<tr>
<td>用户名</td><td>密码</td>
<td>index</td><td>count</td>
<td>first?</td><td>last?</td>
</tr>
<c:forEach var=”user” items=”${users}” varStatus=”sta” begin=” 1” step=” 2” >
<tr>
<td>${user.userName}</td>
<td>${user.password}</td>
<td>${sta.index}</td>
<td>${sta.count}</td>
<td>${sta.first}</td>
<td>${sta.last}</td>
</tr>
</c:forEach>
</table>
迭代固定的次数
<table>
<tr>
<td>数值</td><td>index</td><td>count</td>
<td>first?</td><td>last?</td>
</tr>
<c:forEach var=”i” varStatus=”sta 1” begin=” 101” end=” 103” >
<tr>
<td>${i}</td>
<td>${sta1.index}</td>
<td>${sta1.count}</td>
<td>${sta1.first}</td>
<td>${sta1.last}</td>
</tr>
<c:forEach>
</table>
结果:
用户名 密码 index first? last? count
user1 guest1 1 true false 1
user3 guest3 3 false false 2
user5 guest5 5 false true 3
迭代固定的次数
数值 index count first? last?
101 101 1 true false
102 102 2 false false
103 103 3 false true
六.与条件标签结合使用:
例子:com.jsp
<table>
<tr>
<td>number</td>
<td>count</td>
<td>even|odd</td>
</tr>
<c:forEach var=”i” begin=” 11” end=” 13” varStatus=”status”>
<tr>
<td>${i}</td>
<td>${status.count}</td>
<td>
<c:choose>
<c:when test=”${status.count%2==0}”>
偶数行
</c:when>
<c:otherwise>
奇数行
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
结果:
number count even|odd
11 1 奇
12 2 偶
13 3 奇
<c:forTokens>标签:
用于实现类似java.until.StringTokenizer类的迭代功能,但它是以单个字符作为分隔符,同时可以指定多个字符作为多个并行的分隔符。
语法:
<c:forTokens items=”stringOfTokens” delims=”delimites”
[var=”varName”]
[varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]>
body content
</c:forTokens>
<c:forTokens>标签的属性
属性名 | 是否支持EL | 属性类型 | 属性描述 |
var | false | String | 指定将当前迭代出的子字符串保存到page这个web域中的属性名字 |
items | true | String | 将要迭代的字符串 |
delims | true | String | 指定一个或多个分隔符 |
varStatus | false | String | 指定将代表当前迭代状态信息的对象保存到page这个web域中的属性名称,代表当前迭代的状态信息的对象的类型为java.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看这个类的详细信息 |
begin | true | int | 指定从第begin个子字符串开始迭代,begin的索引值从0开始编号 |
end | true | int | 指定迭代到第begin个子字符串,begin的索引值从0开始编号 |
step | true | int | 指定迭代的步长,即每次迭代后的迭代因子增量 |
注意:
(1) 如果指定begin属性,其值必须大于或等于零
(2) 如果指定步长(step属性),其值必须大于或等于1
(3) 如果指定的end属性的值小于begin属性的值,不执行迭代操作
例子: forTokens.jsp
(1) 使用“|“为分隔符
<c:forTokens var=”token” items=”spring,sunmmer|autumn,winnter” delims=”|”>
${token}©
</c:forTokens>
(2) 使用“|”和“,”作为分隔符
<c:forTokens var=”token” items=”spring,sunmmer|autumn,winnter” delims=”|,” end=” 3” >
${token}©
</c:forTokens>
(3) 使用“-”作为分隔符
<c:forTokens var=”token” items=”year—season—month-week” delims=”-” >
${token}©
</c:forTokens>
结果:
(1) spring,summer(c)auntumn,winter(c)
(2) spring(c)summer(c)autumn(c)winter(c)
(3) year(c)season(c)month(c)week(c)
<c:remove>标签:
用于删除各种web域中的属性
语法:
<c:remove var=”varName”
[scope=”{ page | request | session | application}”] />
var属性用于指定要删除的属性的名称,scope属性用于指定要删除的属性所属的web域,它们的值都不能接受动态值,如果没有指定scope属性,<c:remove>标签就调用PageContext.removeAttribute(varName)方法,否则就调用PageContext.removeAttribute(varName,scope)方法,<c:remove>与<c:set>标签第一种语法格式的value属性值为null时的作用相同。
例子:c_remove.jsp
<c:set value=“org.it 315” var=“company”scope=“request”/>
<c:set var=“password” scope=“session”>
a123456
</c:set>
(1) 没有使用remove标签前,变量值为:
company:<c:out value=“${company}”/><br/>
password:<c:out value=“${password}”/><br/>
<c:remove var=“company” scope=“request”/>
<!—c:set var= “company”scope=“request”此行与上面红色部分作用是一样的-->
<c:remove var=”password”scope=“session”/><br/>
(2) 使用remove标签后的变量的值:
company:<c:out value=“${company}”/><br/>
password:<c:out value=“${password}”/><br/>
运行结果:
(1) company:org.it315
password:a123456
(2)company:
password:
<c:catch>标签:
用于捕获嵌套在标签体中的内容抛出的异常。
语法:
<c:catch [var=“varName”]>
nsted actions
</c:catch>
var属性用于标识<c:catch>标签捕获的异常对象,其值是一个静态的字符串,不支持动态属性值,<c:catch>标签将捕获的异常对象以var指定的名称保存到page这个web域中。如果没有指定var属性,则<c:catch>标签仅捕获异常,不在page域保存异常对象。如果<c:catch>标签体中的内容没有抛出异常,<c:catch>标签将从page域中删除var属性指定的属性。
<c:catch>标签可以捕获任何标签抛出的异常,并且可以同时处理多个标签抛出的异常,这样可以对jsp页面的异常进行统一处理,显示给用户一个更友好的页面。Jsp处理异常的通用机制是出现重要异常后跳转到错误处理页面,建议尽量不使用<c:catch>标签来代替jsp的错误处理机制。只对一些次要异常才使用<c:catch>标签进行捕获处理。
例子:c_catch.jsp
<c:catch var=“myex”>
<%
int i=0;
int j=10;
out.println(j+”/”+i+“=”+j/i);
%>
</c:catch>
(1) 异常:<c:out value=“${myex}”/><br/>
(2) 异常:myex.getMessage: <c:out value=“${myex.message}”/><br/>
(3) 异常:myex.getCause: <c:out value=“${myex.cause}”/><br/>
(4) 异常:myex.getStackTrace: <c:out value=“${myex.StackTrace}”/><br/>
<c:catch>标签内嵌套的脚本元素抛出了异常,<c:catch var=“myex”>将捕获到这个异常,调用<c:out value=“${myex.message}”/>相当于调用<%=myex.getMessage()%>
运行结果:
(1) java.lang.ArithemticException: /by zero
(2) myex.getMessage: /by zero
(3) myex.getCause:
(4) myex.getStackTrace:[L java.lang.StackTraceElement:@b 3319f
URL相关的标签:<c:param>,<c:url>,<c:redirect>,<c:import>
先建一个jsp文件:register.jsp
<%
String name = request.getParamter(“name”);
name = new String(name.getBytes(“iso-8859 -1” ),“gb 2312 ” );
session.setAttribute(“name”,name);
String country = request.getParamter(“country”);
country = new String(country.getBytes(“iso-8859 -1” ),“gb 2312 ” );
session.setAttribute(“country”, country);
%>
name=${name};
country=${country}<br/>
<c:param>标签:可以嵌套在<c:url>,<c:redirect>,<c:import>标签内,为这些标签使用的url地址附加参数。<c:param>标签在为一个url地址附加参数时,将自动对参数进行url编码。
例如:如果传递的参数值为“中国”,则转换为%d6%d0%b9%fa后,附加到url地址后面。
语法:
(1)<c:param name=“name”value=“value”/>
(2) <c:param name=“name”>
paramter value
</c:param>
<c:param>标签的属性
属性名 | 是否支持EL | 属性类型 | 属性描述 |
name | true | String | 参数的名称 |
value | true | String | 参数的值 |
<c:url>标签:
用于在jsp页面中构造一个url地址,主要目的是实现url重写,url重写就是将会话标识以参数形式附加在url地址后面。
语法:
(1)没有标签体:
<c:url value=”value”
[context=”context”]
[var=”varName”]
[scope=”{page|request|session|application}”] />
(2) 有标签体,在标签体中指定构造的url的参数:
<c:url value=”value”
[context=”context”]
[var=”varName”]
[scope=”{page|request|session|application}”] >
<c:param>标签
</c:url>
<c:url>标签的属性
属性名 | 是否支持EL | 属性类型 | 属性描述 |
value | true | String | 指定要构造的url |
context | true | String | 当要使用相对路径导入同一个服务器下的其他web应用程序中的url地址时,context属性指定其他web应用程序的名称 |
var | false | String | 指定将构造出的url结果保存到web域中的属性名称 |
scope | false | String | 指定将构造出的url结果保存在哪个web域中 |
value属性所指定的url可以是相对路径和绝对路径
使用<c:url>标签构造url时,可以通过嵌套的<c:param>标签指定参数或在value属性中直接指定参数。
例子:url.jsp
(1) 使用绝对路径构造url:
<c:url value=”http://localhost:8080/JSTL/URL/register.jsp” var=”myUrl 1” >
<c:param name=”name” value=”张三”/>
<c:param name=”country” value=”${param.country}”/>
</c:url>
<a href=”${ myUrl1}”>ha1</a><br/>
(2) 使用相对当前jsp页面的路径构造url:
<c:url value=”register.jsp?name=wangwu&country=France” var=”muUrl 2” />
<a href=”${ myUrl2}”>ha2</a><br/>
(3) 使用相对当前web应用的路径构造url:
<c:url value=”URL/register.jsp?name=zhaoliu&country=England” var=”muUrl 3” />
<a href=”${ myUrl3}”>ha3</a><br/>
结果:在浏览器地址栏输入http://localhost:8080/JSTL/url.jsp?country=china后
(1)
<a href=”http://localhost:8080/JSTL/URL/register.jsp?name=%d5%d0%&country=China”>ha1</a><br/>
(2) <a href=” register.jsp?name=wangwu&country=France”>ha2</a><br/>
(3) <a href=” /JSTL/URL/register.jsp?name=zhaoliu&country=England”>ha3</a><br/>