第七节 JavaBean、El表达式、JSTL
一、JSP JavaBean
- JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。
- JavaBean的特征:
1、提供一个默认的无参构造函数。
2、需要被序列化(序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。)并且实现了 Serializable 接口。
3、可能有一系列可读写属性。
4、可能有一系列的 getter 或 setter 方法。 - JavaBean 属性:
- 一个 JavaBean 对象的属性应该是可访问的。这个属性可以是任意合法的 Java 数据类型,包括自定义 Java 类。
- 一个 JavaBean 对象的属性可以是可读写,或只读,或只写。
- JavaBean 对象的属性通过 JavaBean 实现类中提供的两个方法来访问:
方法 描述: getPropertyName() 举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 getMyName() 来读取这个属性。这个方法也称为访问器。 setPropertyName() 举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。这个方法也称为写入器。 /释:一个只读的属性只提供 getPropertyName() 方法,一个只写的属性只提供 setPropertyName() 方法。
二、JavaBean 程序示例
-
这是 StudentBean.java 文件: package com.runoob; public class StudentsBean implements java.io.Serializable { private String firstName = null; private String lastName = null; private int age = 0; public StudentsBean() { } public String getFirstName(){ return firstName; } public String getLastName(){ return lastName; } public int getAge(){ return age; } public void setFirstName(String firstName){ this.firstName = firstName; } public void setLastName(String lastName){ this.lastName = lastName; } public void setAge(int age) { this.age = age; } }
-
访问 JavaBean 对象的属性
在<jsp:useBean>
标签主体中使用<jsp:getProperty/>
标签来调用 getter 方法,使用<jsp:setProperty/>
标签来调用 setter 方法,语法格式如下:<jsp:useBean id="id" class="bean 编译的类" scope="bean 作用域"> <jsp:setProperty name="bean 的 id" property="属性名" value="value"/> <jsp:getProperty name="bean 的 id" property="属性名"/> ........... </jsp:useBean> / name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。
接下来给出使用以上语法进行属性访问的一个简单例子:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>get 和 set 属性实例</title> </head> <body> <jsp:useBean id="students" class="com.runoob.StudentsBean"> <jsp:setProperty name="students" property="firstName" value="小强"/> <jsp:setProperty name="students" property="lastName" value="王"/> <jsp:setProperty name="students" property="age“ value="10"/> </jsp:useBean> <p>学生名字: <jsp:getProperty name="students" property="firstName"/></p> <p>学生姓氏: <jsp:getProperty name="students" property="lastName"/></p> <p>学生年龄: <jsp:getProperty name="students" property="age"/></p> </body> </html> 访问以上 JSP,运行结果如下: 学生名字: 小强 学生姓氏: 王 学生年龄: 10
三、BeanUtils工具
- BeanUtils工具包的官网首页地址为“
http://commons.apache.org/proper/commons-beanutils
”,登录到官网首页后,单击左边菜单栏【BEANUTILS】>>【Download】选项,即可跳转到BeanUtils的下载页面 - 在图中单击方框标识的链接就可以进行下载,解压下载后的文件便可获得BeanUtils开发所需的JAR包。
- 需要注意的是,BeanUtils工具包还需要一个logging包来配合使用,logging包中包装了各种日志API的实现,感兴趣的读者可以进入官网(
http://commons.apache.org/proper/commons-logging
)下载。 - BeanUtils工具中封装了许多类,其中最核心的是org.apache.commons.beanutils包下的BeanUtils类。
- BeanUtils类的常用方法:
static void populate(Object bean,Map<String,?extends Object>properties) 根据指定的名称/值对为相应的JavaBean属性设置值 static void setProperty(Object bean,String name,Object value) 设置指定的属性值,传入的类型要求能转换成相应属性的类型 static void getProperty(Object bean,String name) 返回指定bean指定属性的值,返回值类型为String类型
四、EL表达式
- 在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式。
- EL是Expression Language的缩写,它是一种简单的数据访问语言。
- EL表达式格式:
${表达式}
需要注意的是,“${表达式}
”中的表达式必须符合EL语法要求。 - EL中的标识符
在EL表达式中,经常需要使用一些符号来标记一些名称,如变量名、自定义函数名等,这些符号被称为标识符。 - EL表达式中的标识符可以由任意的大小写字母、数字和下划线组成,为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范:不能以数字开头;不能是EL中的保留字,如and、or、gt;
不能是EL隐式对象,如pageContext;不能包含单引号(’)、双引号(")、减号(-)和正斜线等特殊字符。 - EL中的变量
EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上,具体示例如下所示:${product}
在上述示例中,product就是一个变量。 - EL表达式中的变量不用事先定义就可以直接使用,例如,表达式
${product}
就可以访问变量product的值。 - EL中的常量
EL表达式中的常量又称字面量,它是不能改变的数据。在EL表达式中包含多种常量。 1.布尔常量 布尔常量用于区分一个事物的正反两面,它的值只有两个,分别是true和false。 2.整型常量 整型常量与Java中的十进制的整型常量相同. 它的取值范围是Java语言中定义的常量Long.MIN_VALUE到Long.MAX_VALUE之间, 即(-2)63~263-1之间的整数。 3.浮点数常量 浮点数常量用整数部分加小数部分表示,也可以用指数形式表示, 例如,1.2E4和1.2都是合法的浮点数常量。 它的取值范围是Java语言中定义的常量Double.MIN_VALUE到Double.MAX_VALUE之间, 即4.9E-324~1.8E308之间的整数。 4.字符串常量 字符串常量是用单引号或双引号引起来的一连串字符。 由于字符串常量需要用单引号或双引号引起来,所以字符串本身包含的单引号或双引号需要用反斜杠(\)进行转义, 即用`“\'”`表示字面意义上的单引号,用`“\"”`表示字面意义上的双引号。 如果字符串本身包含反斜杠(\),也要进行转义,即用“\\”表示字面意义上的一个反斜杠。 需要注意的是,只有字符串常量用单引号引起来时,字符串本身包含的单引号才需要进行转义,而双引号不必进行转义;只有字符串常量用双引号引起来时,字符串本身包含的双引号才需要进行转义,而单引号不必转义,例如"ab'4c\"d5\\e"表示的字符串是ab'4c"d5\e。 5.Null常量 Null常量用于表示变量引用的对象为空,它只有一个值,用null表示。
- EL中的运算符
-
EL表达式支持简单的运算,例如,加(
+
)、减(-
)、乘(*
)、除(/
)等。为此,在EL中提供了多种运算符,根据运算方式的不同。 -
点运算符
.
1、EL表达式中的点运算符,用于访问JSP页面中某些对象的属性,如JavaBean对象、List集合、Array数组等。
2、其语法格式:${customer.name}
3、在上述语法格式中,表达式${customer.name}
中点运算符的作用就是访问customer对象中的name属性。 -
方括号运算符
[]
1、EL表达式中的方括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性,当获取的属性名中包含一些特殊符号,如“-”或“?”等并非字母或数字的符号,就只能使用方括号运算符来访问该属性。
2、其语法格式:${user["My-Name"]}
3、需要注意的是,在访问对象的属性时,通常情况都会使用点运算符作为简单的写法,但实际上,方括号运算符比点运算符应用更加广泛。
4、接下来就对比一下这两种运算符在实际开发中的应用,具体如下:点运算符和方括号运算符在某种情况下可以互换,如
${student.name}
等价于${student["name"]}
。
方括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${users[0]}
用于访问集合或数组中第一个元素。在这种情况下,只能使用方括号运算符,而不能使用点运算符。
方括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].userName}
可以访问集合或数组中的第一个元素的userName属性。 -
算术运算符
1、EL表达式中的算术运算符用于对整数和浮点数的值进行算术运算。使用这些算术运算符可以非常方便地在JSP页面进行算术运算,并且可以简化页面的代码量。
2、所有的算术运算符:+、-、*、/(或div)、%(或mod)
3、表中,列举了EL表达式中所有的算术运算符,这些运算符相对来说比较简单。在使用这些运算符时需要注意两个问题,“-”运算符即可以作为减号,也可以作为负号,“/”或“div”运算符在进行除法运算时,商为小数。 -
比较运算符
1、EL表达式中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的运算符执行的结果都是布尔类型。2、接下来通过表来列举EL表达式中所有的比较运算符:
==(或eq)、!=(或ne)、<(或lt)、>(或gt)、<=(或le)、>=(或ge)
3、表中,列举了EL表达式中所有的比较运算符,在使用这些运算符时需要注意两个问题,具体如下:比较运算符中的“==”是两个等号,千万不可只写一个等号。 为了避免与JSP页面的标签产生冲突,对于后4种比较运算符,EL表达式中通常使用括号内的表示方式。 例如,使用“lt”代替“<”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格。 例如${1lt 2},但后面如果有其他符号时则可以不加空格,例如${1lt(1+1)}。
-
逻辑运算符
1、EL表达式中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。
2、所有的逻辑运算符:&&(and)、||(or)、!(not)
3、上表中,列出了EL表达式中的3种逻辑运算符,需要注意的是,在使用&&
运算符时,如果有一个表达式结果为false,则结果必为false,在使用||
运算符时,如果有一个表达式的结果为true,则结果必为true。 -
empty运算符
1、EL表达式中的empty运算符用于判断某个对象是否为null或””,结果为布尔类型。
2、其基本的语法格式如下所示:${empty var}
3、需要注意的是,empty运算符可以判定变量(或表达式)是否为null或””。例如,empty运算符的返回值为true:var变量不存在,即没有定义,例如表达式`{empty name},如果不存在name变量,就返回true。 var变量的值为null,例如表达式${empty customer.name},如果customer.name的值为null,就返回true。
4、var变量引用集合(Set、Map和List)类型对象,并且在集合对象中不包含任何元素。
-
条件运算符
1、EL表达式中条件运算符用于执行某种条件判断,它类似于Java语言中的if-else语句,其语法格式如下:${A?B:C}
2、在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B并返回B的值;如果表达式A的计算结果为false,就执行表达式C并返回C的值,例如表达式${(1==2)?3:4}的结果就为4。
-
( )
运算符
1、EL表达式中的圆括号用于改变其他运算符的优先级。
2、例如表达式${a*b+c}
,正常情况下会先计算a*b的积,然后再将计算的结果与c相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为${a*(b+c)}
,这样则先计算b与c的和,再将计算的结果与a相乘。
3、需要注意的是,EL表达式中的运算符都有不同的运算优先级,当EL表达式中包含多种运算符时,它们必须按照各自优先级的大小来进行运算。
4、接下来,通过表来描述这些运算符的优先级。
-
优先级 | 运算符 |
---|---|
1 | [ ] |
2 | ( ) |
3 | - not ! empty |
4 | * / div % mod |
5 | + - |
6 | < > <= >= lt gt le ge |
7 | == != eq ne |
8 | && and |
9 | or 与 双竖杠 |
10 | ? |
5、表列举了不同运算符各自的优先级大小。对于初学者来说,这些运算符的优先级不必刻意的去记忆。为了防止产生歧义,建议读者尽量使用“()”运算符来实现想要的运算顺序。
6、注意:
在应用EL表达式取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。
五、EL隐式对象
-
在学习JSP技术时,提到过隐式对象的应用。在EL技术中,同样提供了隐式对象。
-
EL中的隐式对象共有11个.
具体如表所示。 pageContext 对应于JSP页面中的pageContext对象 pageScope 代表page域中用于保存属性的Map对象 requestScope 代表request域中用于保存属性的Map对象 sessionScope 代表session域中用于保存属性的Map对象 applicationScope 代表application域中用于保存属性的Map对象 param 表示一个保存了所有请求参数的Map对象 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String类型数组 header 表示一个保存了所有HTTP请求头字段的Map对象 headerValues 表示一个保存了所有HTTP请求头字段的Map对象,返回String类型数组 cookie 用来取得使用者的cookie值,cookie的类型是Map initParam 表示一个保存了所有Web应用初始化参数的Map对象
-
pageContext对象
1、为了获取JSP页面的隐式对象,可以使用EL表达式中的pageContext隐式对象。
2、pageContext隐式对象的示例代码如下:${pageContext.response.characterEncoding}
3、在上述示例中,pageContext对象用于获取response对象中的characterEncoding属性。 -
Web域相关对象
1、在Web开发中,PageContext、HttpServletRequest、HttpSession和ServletContext这四个对象之所以可以存储数据,是因为它们内部都定义了一个Map集合。
2、这些Map集合是有一定作用范围的,例如,HttpServletRequest对象存储的数据只在当前请求中可以获取到。
3、习惯性的,我们把这些Map集合称为域,这些Map集合所在的对象称为域对象。
4、 在EL表达式中,为了获取指定域中的数据,提供了pageScope、requestScope、sessionScope和applicationScope4个隐式对象。
示例代码如下:${pageScope.UserName}
;${requestScope.UserName}
. -
param和paramValues对象
1、在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL表达式提供了param和paramValues两个隐式对象,这两个隐式对象专门用于获取客户端访问JSP页面时传递的请求参数。
2、param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。
3、param对象的语法格式比较简单,具体示例如下:${param.num}
4、如果一个请求参数有多个值,可以使用paramValues对象
来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值。
5、可以使用如下代码:${paramValues.num[0]}
-
cookie对象
1、在JSP开发中,经常需要获取客户端的Cookie信息,为此,在EL表达式中,提供了Cookie隐式对象,该对象是一个代表所有Cookie信息的Map集合。
2、Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象。
3、具体示例如下:获取cookie对象的信息:${cookie.userName} 获取cookie对象的名称:${cookie.userName.name} 获取cookie对象的值:${cookie.userName.value}
六、什么是JSTL
-
从JSP1.1规范开始,JSP支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性。
-
为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商制定可能是不同的,这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择。
-
为了解决这个问题,Sun公司制定了一套标准标签库(JavaServer Pages Standard Tag Library),简称JSTL。
-
JSTL虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签库共同组成的。在5. JSTL1.1规范中,为这5个标签库分别指定了不同的URI以及建议使用的前缀。
如下表所示: 标签库 标签库的URI 前缀 Core http://java.sun.com/jsp/jstl/core c l18N http://java.sun.com/jsp/jstl/fmt fmt SQL http://java.sun.com/jsp/jstl/sql sql XML http://java.sun.com/jsp/jstl/xml x Functions http:/java.sun.com/jsp/jstl/functions fn
表中,列举了JSTL中包含的所有标签库,以及JSTL中各个标签库的URI和建议使用的前缀。
-
标签库进行讲解。
1、Core是一个核心标签库,它包含了实现Web应用中通用操作的标签。
例如,用于输出文本内容的<c:out>
标签、用于条件判断的<c:if>
标签、用于迭代循环的<c:forEach>
标签。2、 I18N是一个国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签。
例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。3、SQL是一个数据库标签库,它包含了用于访问数据库和对数据库中的数据进行操作的标签。
例如,从数据库中获得数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为表示层,一般不会在JSP页面中直接操作数据库,因此,JSTL中提供的这套标签库不经常使用。4、XML是一个操作XML文档的标签库,它包含对XML文档中的数据进行操作的标签。
例如,解析XML文件、输出XML文档中的内容,以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单方便。5、Functions是一个函数标签库,它提供了一套自定义EL函数,包含了JSP网页制作者经常要用到的字符串操作。
例如,提取字符串中的子字符串、获取字符串的长度等
七、JSTL的下载和使用
- 下载JSTL包
- 从Apache的网站下载JSTL的JAR包。
- 进入
“http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”
网址下载JSTL的安装包jakarta-taglibs-standard-1.1.2.zip。 - 然后将下载好的JSTL安装包进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。
- 其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)。
- 安装JSTL
将jstl.jar和standard.jar这两个文件复制到chapter07项目的lib目录下。这个过程就相当于在chapter07项目中安装JSTL,安装完JSTL后,就可以在JSP文件中使用JSTL标签库。 - 测试JSTL
- JSTL安装完成后,就需要测试JSTL安装是否成功。由于在测试的时候使用的是
<c:out>
标签,因此,需要使用taglib指令导入Core标签库. - 具体代码如下:
<%@ taglib uri ="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- 在上述代码中,taglib指令的uri属性用于指定引入标签库描述符文件的URI,prefix属性用于指定引入标签库描述符文件的前缀,在JSP文件中使用这个标签库中的某个标签时,都需要使用这个前缀。
- JSTL安装完成后,就需要测试JSTL安装是否成功。由于在测试的时候使用的是
八、 JSTL中的core标签
-
<c:out>
标签-
在JSP页面中,最常见的操作就是向页面输出一段文本信息,为此,Core标签库提供了一个
<c:out>
标签,该标签可以将一段文本内容或表达式的结果输出到客户端。 -
如果
<c:out>标签
输出的文本内容中包含需要进行转义的特殊字符,例如>、<、&、'、"
等,<c:out>
标签会默认对它们进行HTML编码转换后再输出。<c:out>标签有两种语法格式,具体如下: 语法1:没有标签体的情况 <c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/> 语法2:有标签体的情况 <c:out value="value" [escapeXml="{true|false}"]> defaultValue </c:out>
-
在上述语法格式中,没有标签体的情况,需要使用default属性指定默认值,有标签体的情况,在标签体中指定输出的默认值。
-
可以看到
<c:out>
标签有多个属性,接下来针对这些属性进行讲解,具体如下:- value属性用于指定输出的文本内容;
- default属性用于指定当value属性为null时所输出的默认值,该属性是可选的(方括号中的属性都是可选的);
- escapeXml属性用于指定是否将>、<、&、’、" 等特殊字符进行HTML编码转换后再进行输出,默认值为true。
- 需要注意的是,只有当value属性值为null时,<c:out>标签才会输出默认值,如果没有指定默认值,则默认输出空字符串。
(1)使用<c:out>标签输出默认值 使用<c:out>标签输出默认值有两种方式, 一是通过使用<c:out>标签的default属性输出默认值, 二是通过使用<c:out>标签的标签体输出默认值。 (2)使用<c:out>标签的escapeXml属性对特殊字符进行转义 <c:out>标签有一个重要的属性escapeXml, 该属性可以将特殊的字符进行HTML编码转换后再输出。
-
-
<c:if>
标签- 在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的
<c:if>
标签,该标签专门用于完成JSP页面中的条件判断. - 它有两种语法格式,具体如下:
语法1:没有标签体的情况 <c:if test="testCondition" var="result" [scope="page|request|session|application"]/> 语法2:有标签体的情况,在标签体中指定要输出的内容 <c:if test="testCondition" var="result" [scope="page|request|session|application"]> body content </c:if>
- 在上述语法格式中,可以看到
<c:if>
标签有三个属性,具体讲解如下:test属性用于设置逻辑表达式; var属性用于指定逻辑表达式中变量的名字;
scope属性用于指定var变量的作用范围,默认值为page。如果属性test的计算结果为true,那么标签体将被执行,否则标签体不会被执行。
- 在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的
-
<c:choose>
标签- 在程序开发中不仅需要使用if条件语句,还经常会使用if-else语句,为了在JSP页面中也可以完成同样的功能.
- Core标签库提供了
<c:choose>
标签,该标签用于指定多个条件选择的组合边界,它必须与<c:when>、<c:otherwise>
标签一起使用。 - <c:choose>标签没有属性,在它的标签体中只能嵌套一个或多个<c:when>标签和零个或一个<c:otherwise>标签,并且同一个<c:choose>标签中所有的<c:when>子标签必须出现在<c:otherwise>子标签之前。
其语法格式如下: <c:choose> Body content(<when> and <otherwise> subtage) </c:choose>
<c:when>
标签只有一个test属性,该属性的值为布尔类型。test属性支持动态值,其值可以是一个条件表达式,如果条件表达式的值为true,就执行这个<c:when>标签体的内容,其语法格式如下: <c:when test="testCondition" Body content </c:when> <c:otherwise>标签没有属性,它必须作为<c:choose>标签最后分支出现,当所有的<c:when>标签的test条件都不成立时,才执行和输出<c:otherwise>标签体的内容,其语法格式如下: <c:otherwise> conditional block </c:otherwise>
-
<c:forEach>
标签-
在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个
<c:forEach>
标签。 -
该标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容,
它有两种语法格式,具体如下: 语法1:迭代包含多个对象的集合 <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forEach> 语法2:迭代指定范围内的集合 <c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]> body content </c:forEach>
-
在上述语法格式中,可以看到<c:forEach>标签有多个属性。具体讲解如下:
var属性——用于指将当前迭代到的元素保存到page域中的名称;
items属性——用于指定将要迭代的集合对象;
varStatus——用于指定当前迭代状态信息的对象保存到page域中的名称;
begin属性——用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止;
step属性——用于指定迭代的步长,即迭代因子的增量。 -
<c:forEach>
标签的begin、end和step属性分别用于指定循环的起始索引、结束索引和步长。 -
<c:forEach>
标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量。这个变量包含了从集合中取出元素的状态信息。 -
使用<c:forEach>标签的varStatus属性可以获取以下信息:
count:表示元素在集合中的序号,从1开始计数;
index:表示当前元素在集合中的索引,从0开始计数;
first:表示当前是否为集合中的第一个元素;
last:表示当前是否为集合中的最后一个元素;
-
-
<c:param>
标签和<c:url>
标签-
在开发一个Web应用程序时,通常会在JSP页面中完成URL的重写以及重定向等特殊功能,为了完成这些功能。
-
这些标签包括
<c:param>、<c:redirect>和<c:url>
。其中<c:param>
标签用于获取URL地址中的附加参数。 -
<c:url>标签用于按特定的规则 重新构造URL,<c:redirect>标签负责重定向。
-
<c:param>标签用于在URL地址中附加参数,它通常嵌套在<c:url>标签内使用。
<c:param>标签有两种语法格式,具体如下: 语法1:使用value属性指定参数的值 <c:param name="name" value="value"> 语法2:在标签体中指定参数的值 <c:param name="name" parameter value </c:param>
-
在上述语法格式中,可以看到<c:param>中有两个属性。具体讲解如下:
name属性——用于指定参数的名称;
value属性——用于指定参数的值,当使用<c:param>标签为一个URL地址附加参数时,它会自动对参数值进行URL编码。 -
例如,如果传递的参数值为“中国”,则将其转换为“%e4%b8%ad%e5%9b%bd”后再附加到URL地址后面,这也是使用**<c:param>**标签的最大好处。
-
在访问一个JSP页面时,通常会在URL中传递一些参数信息,为了方便完成这种功能,Core标签库中提供了一个
<c:url>
标签。
该标签可以在JSP页面中构造一个新的地址,实现URL的重写。 -
<c: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:rul>
-
在上述语法格式中,可以看到<c:url>标签中有多个属性。
具体讲解如下: value属性用于指定构造的URL; context属性用于指定导入同一个服务器下其他Web应用的名称; var属性用于指定将构造的URL地址保存到域对象的属性名称; scope属性用于指定将构造好的URL保存到域对象中。
-
End.