第7章 EL表达式和JSTL
目录
7.1 初识 JavaBean
7.1.1 什么是 JavaBean
JavaBean就是一个封装了需要重复使用的数据和功能的类。
JavaBean的规范:
-
它必须具有一个公共的、无参的构造方法,这个方法可以是编译器自动产生的默认构造方法。
-
它提供公共的setter方法和getter方法(至少提供其中一个),让外部程序设置和获取JavaBean属性。
7.1.2 访问 JavaBean 的属性
public String getName() {...}
public void setName() {...}
- getName()方法:称为getter方法或者属性访问器,该方法以小写的get前缀开始,后跟属性名,属性名的第1个字母要大写。
- setName()方法:称为setter方法或者属性修改器,该方法必须以小写的set前缀开始,后跟属性名,属性名的第1个字母要大写。
只读属性,只写属性,读写属性。
如果属性的类型为boolean,它的命名方式应该使用is/set,而不是get/set。
7.1.3 BeanUtils 工具
可以实现动态访地问Java对象的属性。
需要的包:
- commons-beanutils.jar
- commons-logging.jar
7.2 EL 表达式
它是一种简单的数据访问语言,可以简化JSP页面的书写。
7.2.1 初始 EL
${表达式}
7.2.2 EL 中的标识符
命名规范:
- 不能以数字开头。
- 不能是EL中的保留字,如and、or、gt。
- 不能是EL隐式对象,如pageContext。
- 不能包含单引号(`)、双引号(")、减号(-)和正斜杠(/)等特殊字符。
合法标识符
不合法标识符
7.2.3 EL 中的保留字
不能被作为标识符。
7.2.4 EL 中的变量
${product}
EL表达式中的变量不用事先定义就可以直接使用。
7.2.5 EL 中的常量
1.布尔常量
true和false
2.整型常量
与之间的整数。
3.浮点数常量
4.9E-324-1.8E308之间的浮点数。
4.字符串常量
单引号(\')
双引号(\")
反斜杠(\\)
只有字符串常量用单引号引起来时,字符串本身包含的单引号才需要进行转义,而双引号不必进行转义;只有字符串常量用双引号引起来时,字符串本身包含的双引号才需要进行转义,而单引号不必转义。
5.Null常量
对象为空。
7.2.6 EL 中的运算符
1.点运算符(.)
用于访问JSP页面中某些对象的属性。
${customer.name}
2.方括号运算符
用于访问JSP中某些对象的属性(属性名包含特殊符号"-","?"只能用这个)。
${user["My-Name"]}
- 点运算符和符号运算符在某种情况下可以互换,如${student.name}等价于${student["name"]}。
- 方括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${user[0]}用于访问集合或数组中第1个元素。在这种情况下,只能使用方括号运算,而不能使用点运算符。
- 方括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].userName}可以访问集合或数组中的1个元素的userName属性。
3.算术运算符
EL表达式中的算数运算符用于对整数和浮点数的值进行算术运算。
4.比较运算符
EL表达式中的比较运算符用于比较两个操作数的大小。
- 为了避免与JSP页面的标签产生冲突,对于后4中比较运算符,EL表达式中通常使用括号内的表示方式。
5.逻辑运算符
用于对结果为布尔类型的表达式进行运算。
6.empty运算符
EL表达式中的empty运算符用于判断某个对象是否为null或“ ”,结果为布尔类型。
${empty var}
7.条件运算符
用于执行某种条件判断,类似于if-else。
${A?B:C}
8.“()”运算符
用于改变其他运算符的优先级。
在应用EL表达式取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。
7.2.7 EL 隐式对象
EL中的隐式对象共有11个。
1.pageContext对象
可以获取其他10个隐式对象。示例如下:
${pageContext.response.characterEncoding}
pageContext对象用于获取response对象中的characterEncoding属性。
2.Web域相关对象
在Web开发中,PageContext、HttpServletRequest、HttpSession和ServletContext这4个对象之所以可以存储数据,是因为它们内部都定义了一个Map集合,这些Map集合是有一定作用范围的。我们习惯吧这些Map集合称为域,这些Map集合所在的对象称为域对象。在EL表达式中,为了获取指定域中的数据,提供了pageScope、requestScope、sessionScope和applicationScope4个隐式对象,示例代码如下。
${pageScope.userName}
${requestScope.userName}
${sessionScope.userName}
${applicationScope.userName}
EL表达式只能在这4个作用域中获取数据。
3.param和paramValues对象
param对象用于获取请求参数的某个值,它是Map类型。如果参数不存在,返回的是空字符串,而不是null。
${param.num}
如果一个请求参数有多个值,可以使用paramValues对象来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组。如果要获取某个请求参数的第1个值,可以使用如下代码
${paramValues.nums{0}}
4.Cookie 对象
获取cookie对象的信息:${cookie.userName}
获取cookie对象的名称:${cookie.userName.name}
获取cookie对象的值:${cookie.userName.value}
第1次访问服务器时,服务器会向浏览器会写一个Cookie,此时的Cookie信息是存储在浏览器中的。当刷新浏览器,第2次访问cookie.jsp页面时,由于浏览器中已经存储了名为userName的Cookie信息,当再次访问相同资源时,浏览器会将此Cookie信息一同发送给服务器,这时使用表达式${cookie.userName.name}和${cookie.userName.value}便可获取Cookie的名称和值。
7.3 JSTL
7.3.1 什么是JSTL
标准标签库。实际上这个标准标签库是由5个不同功能的标签共同组成的。
- Core是一个核心标签库,它包含了实现Web应用中通用操作的标签。例如,用于输出文本内容的<c:out>标签、用于条件判断的<c:id>标签、用于迭代循环的<c:forEach>标签。
- |18N是一个国际化/格式化标签,它包含实现Web应用程序的国际化标签和格式化标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。
- SQL是一个数据库标签库,它包含了用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据库中获得数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为表示层,一般不会在JSP页面中直接操作数据库,因此,JSTL中提供的这套标签库不经常使用。
- XML是一个操作XML文档的标签库,它包含对XML文档中的数据进行操作的标签。例如,解析XML文件、输出XML文档中的内容,以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单方便。
- Functions是一个函数标签库,它提供了一套自定义EL函数,包含了JSP网页制作者经常用到的字符串操作。例如,提取字符串中的子字符串、获取子字符串的长度等。
7.3.2 JSTL 的下载和使用
1.下载JSTL包
jstl.jar
standard
2.导入JSTL包
3.测试JSTL
由于在测试的时候使用的是<c:out>标签,因此,需要使用taglib指令带入Core标签库,具体代码如下。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
uri属性用于指定引入标签库描述符文件的URL,prefix属性用于指定引入标签库描述符文件的前缀,在JSP文件中使用这个标签库中的某个标签时,都需要使用这个前缀。
7.3.3 JSTL 中的Core标签库
1.<c:out>标签
该标签可以将一段文本内容或表达式的结果输出到客户端。
语法1:没有标签体的情况(需要使用default属性指定默认值)
<c:out value="value" [default="defaultValue"]
[escapeXml="{true|false}"]/>
语法2:有标签体的情况(在标签体中指定输出的默认值)
<c:out value="value" [escapeXml="{true|false}"]>
defaultValue
</c:out>
- value属性用于指定输出的文本内容。
- default属性用于指定当value属性为null时所输出的默认值,该属性是可选的(方括号中的属性都是可选的)。
- escapeXml属性用于指定是否将>、<、&、'、"等特殊字符进行HTML编码转换后再进行输出,默认值为true。
需要注意的是,只有当value属性值为null时,<c:out>标签才会输出默认值,如果没有指定默认值,则默认输出空字符串。
(1)使用<c:out>标签输出默认值
如果不想让<c:out>标签输出默认值,可以在客户端访问c_out1.jsp页面时传递一个参数,在浏览器地址栏中加上"?username=itcast",此时,浏览器窗口显示如下
(2)使用<c:out>标签的escapeXml属性(默认为true)对特殊字符进行转义
该属性可以将特殊的字符进行HTML编码转换后再输出。
如果想对页面输出的特殊字符进行转义,可以将escapeXml属性的值设置为true。
将<c:out>标签中escapeXml属性的值设置为true后,在JSP页面中输入的<meta>标签便会进行HTML编码转换,最终以字符串的形式输出了。
2.<c:if>标签
用来进行条件判断,相当于if。
语法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>
- test属性用于设置逻辑表达式
- var属性用于指定逻辑表达式中变量的名字
- scope属性用于指定var变量的作用范围,默认值为page。如果属性test的计算结果为true,那么标签体将被执行,否则标签体不会被执行。
判断表达式${visitCount==1}是否为true。如果为true就输出标签体中的内容,否则输出空字符串。由于使用了<c:set>标签将visitCount的值设置为1,因此,表达式${visitCount==1}的结果为true,便会输出<c:if>标签体中的内容。
3.<c:choose>标签
相当于if-else语句
<c:choose>
Body content(<when> and <otherwise> subtags)
</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>
传递一个参数username=itcast
4.<c:forEach>标签
语法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>
- var属性用于指定将当前迭代到的元素保存到page域中的名称。
- items属性用于指定将要迭代的集合对象。
- varStatus属性用于指定当前迭代状态信息的对象保存到page域中的名称。
- begin属性用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始。如果没有指定items属性,就从begin指定的值开始迭代,知道迭代结束为止。
- step属性用于指定迭代的步长,即迭代因子的增量。
<c:forEach>标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合中取出元素的状态信息。使用<c:forEach>标签的varStatus属性可以获取一下信息。
- count:表示元素在集合中的序号,从1开始计数
- index:表示当前元素在集合中的索引,从0开始计数。
- first:表示当前是否为集合中的第1个元素。
- last:表示当前是否为集合中的最后一个元素。
5.<c:param>标签和<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>
- name属性用于指定参数的名称。
- value属性用于指定参数的值,当使用<c:param>标签为一个URL地址附加参数时,它会自动对参数进行URL编码。
在访问一个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:url>
- value属性用于指定构造的URL。
- context属性指定导入同一个服务器下其他Web应用的名称。
- var属性用于指定将构造的URL地址保存到域对象的属性名称。
- scope属性用于指定将构造好的URL保存到域对象中。
上一篇: socket编程(udp)
下一篇: 第7章 函数
推荐阅读
-
js中el表达式的使用和非空判断方法
-
jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
-
SpringMVC中Model和ModelAndView的EL表达式取值方法
-
第75节:Java的中的JSP,EL和JSTL
-
PHP和正则表达式教程集合之一第1/2页
-
getParameter和getAttribute以及EL表达式中requestScope和param两个隐含对象的区别
-
第7章 EL表达式和JSTL
-
jsp详解,原理,九大内置对象,jsp指令,el表达式,jstl标签的使用
-
PHP和正则表达式教程集合之二第1/2页
-
JScript 和 VBScript 正则表达式第1/2页