<c:set var="ctx" value="${pageContext.request.contextPath}"/>
一、什么是 EL 语言。
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语音。
二、EL 语言的作用。
为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。
三、使用 EL 语言前的配置。
1、导入standard.jar。
2、在需要使用 EL 语音的页面加上<%@ page isELIgnored="false" %>。
注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
3、对于整个JSP应用程序,要修改WEB.XML配置(tomcat5.0.16默认是支持EL的)
- <jsp-property-group>
- <description> For config the ICW sample application </description>
- <display-name>JSPConfiguration </display-name>
- <url-pattern>/jsp/datareset.jsp </url-pattern>
- <el-ignored>true< / el-ignored> < / el-ignored>
- <page-encoding>UTF-8</page-encoding>
- <scripting-invalid>true</scripting-invalid>
- <include-prelude>/jsp/prelude.jspf</include-prelude>
- <include-coda>/jsp/coda.jspf</include-coda>
- </jsp-property-group>
四、如何使用 EL 表达式。
1、EL 的内置对象。
首先我们要知道 EL 的内置对象有哪些----pageScope、requestScope、sessionScope、applicationScope,如果未指定scope,默认从 pageScope 到 applicationScope一次扩大范围查找属性名,也可以使用 xxxScope.属性名 直接指定在某个 scope 查找,如:
- ${ requestScope.tom }
2、语法结构。
- ${expression}
3、[ ]与.运算符。
EL 提供.和[]两种运算符来存取数据。如:
- ${student.name}
- ${studentList[0].name}
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。如:
- ${ student.My-Name} <!-- ${ student.My-Name} 写法不正确,应该改为下面这种 -->
- ${ student["My-Name"] }
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。如:
- ${ sessionScope.student[property] } <!-- 其中 property 是一个变量,动态取对象的属性,如"id", "name"等等 -->
4、使用 EL 取出内置对象的数据。
(1)、普通对象和对象属性。
服务器端:
- request.setAttribute("student", student);
在浏览器上打印出服务器端绑定的数据:
- ${ student } <!-- 相当于执行了 student.toString(); -->
- ${ student.name } <!-- 相当于执行了 student.getName(); -->
- ${ student.teacher.name } <!-- 相当于执行了 student.getTeacher().getName(); -->
- ...
(2)、数组中的数据。
服务器端:
- String[] nameArray = new String[]{"Tom", "Lucy", "Lilei"};
- request.setAttribute(“nameArray”,nameArray);
- Student[] students = new Student[3];
- students[0] = stu1;
- students[1] = stu2;
- students[2] = stu3;
- request.setAttribute(“students”,students);
在浏览器上打印出服务器端绑定的数组数据:
- ${ nameArray[0] } <!-- Tom -->
- ${ nameArray[1] } <!-- Lucy -->
- ${ nameArray[2] } <!-- Lilei -->
- ${ students[0].id } <!-- 输出第一个学生的ID -->
- ${ students[1].name } <!-- 输出第二个学生的name -->
- ${ students[2].teacher.name } <!-- 输出第三个学生的老师的name -->
(3)、List中的数据。
服务器端:
- List<Student> studentList=new ArrayList<Student>();
- studentList.add(stu1);
- studentList.add(stu2);
- studentList.add(stu3);
- request.setAttribute(“studentList”,studentList);
在浏览器上打印出服务器端绑定的List数据:
- ${ studentList[0].id } <!-- 输出第一个学生的ID -->
- ${ studentList[1].name } <!-- 输出第二个学生的name -->
- ${ studentList[2].teacher.name } <!-- 输出第三个学生的老师的name -->
(4)、Map中的数据。
服务器端:
- Map<String, Student> studentMap = new HashMap<String, Student>();
- studentMap.put("Tom", stu1);
- studentMap.put("Lucy", stu2);
- studentMap.put("Lilei", stu3);
- request.setAttribute(“studentMap”,studentMap);
在浏览器上打印出服务器端绑定的Map数据:
- ${ studentMap.Tom.id } <!-- 输出第一个学生的ID -->
- ${ studentMap.Lucy.name } <!-- 输出第二个学生的name -->
- ${ studentMap.Lilei.teacher.name } <!-- 输出第三个学生的老师的name -->
5、使用 EL 取出隐式对象中的数据。
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用。可使用的隐式对象如下:
page Context | JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。 |
此外,还提供几个隐式对象,允许对以下对象进行简易访问:
术语定义
param | 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param . name) 相当于 request.getParameter (name)。 |
paramValues | 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name) 相当于 request.getParamterValues(name)。 |
header | 将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header. name} 相当于 request.getHeader(name)。 |
headerValues | 将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。 |
cookie | 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues. name} 表达式。 |
initParam | 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。 |
除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:
术语定义
pageScope | 将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope .objectName. attributeName} 访问对象的属性。 |
requestScope | 将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope. objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope. objectName. attributeName} 访问对象的属性。 |
sessionScope | 将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如: ${sessionScope. name} |
applicationScope | 将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。 |
五、EL 操作符
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
术语定义
算术型 | +、-(二元)、*、/、div、%、mod、-(一元) |
逻辑型 | and、&&、or、||、!、not |
关系型 | ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。 |
空 | empty。空操作符是前缀操作,可用于确定值是否为空。 |
条件型 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 |
例如:
- 1+2=${1+2}
- 10/5=${10/5}
- 10 div 5=${10 div 5}
- 10%3=${10%3}
- 10 mod 3=${10 mod 3}
- ${empty scope中的属性名}
- ${!empty scope中的属性名}
六、什么是 JSTL 表达式。
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
七、JSTL 表达式的作用。
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。JSTL标签库可分为5类:
- 核心标签库
- I18N格式化标签库
- SQL标签库
- XML标签库
- 函数标签库
八、JSTL 表达式在页面的配置。
1、导入standard.jar和jstl.jar。
2、在JSP页面上引入 JSTL 的引用。如:
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3、jsp 中basePath
九、JSTL 的使用。
1、核心标签库
JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。如:
- 表达式控制标签:out标签、set标签、remove标签、catch标签。
- 流程控制标签:if标签、choose标签、when标签、otherwise标签。
- 循环标签:forEach标签、forTokens标签。
- URL操作标签:import标签、url标签、redirect标签。
下面,演示各个标签的使用。
1.1、表达式控制标签。
(1)、<c:out>标签:用来显示数据对象(字符串、表达式)的内容或结果。相当于 <% out.println(“字符串”)%> 或 <%=表达式%>。
语法如下:
- 【语法1】:<c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]>
- 【语法2】:<c:out value=”要显示的数据对象” [escapeXml=”true|false”]>默认值</c:out>
其中,
value:指定要输出的变量或表达式。
escapeXml:设定是否转换特殊字符(如<、>等一些转义字符),在默认值为true的情况下直接在输出<的,如果改为false将会进行转义输出“<”等。
default:为默认输出结果。如果使用表达式得到的结果为null(注意与空区别),将会输出默认结果。
例如:
- <%@ page pageEncoding="utf-8" %>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <html>
- <head>
- <title>out标签的使用</title>
- </head>
- <body>
- <ul>
- <li>(1)<c:out value="普通一行字符串"></c:out></li>
- <li>(2)<c:out value="<未使用字符转义>" /></li>
- <li>(3)<c:out value="<未使用字符转义>" escapeXml="false"></c:out></li>
- <li>(4)<c:out value="${null}">使用了默认值</c:out></li>
- <li>(5)<c:out value="${null}"></c:out></li>
- </ul>
- </body>
- </html>
输出:
- 普通一行字符串
- <未使用字符转义>
- <未使用字符转义>
- 使用了默认值
(2)、<c:set>标签:主要用于将变量存取于JSP范围中或JavaBean属性中。
- 【语法1】:
- <c:set value=”值1” var=”name1” [scope=”page|request|session|application”]>
- 【语法2】:
- <c:set var=”name2” [scope=”page|request|session|application”]>
- 【语法3】:
- <c:set value=”值3” target=”JavaBean对象” property=”属性名”/>
- 【语法4】:
- <c:set target=”JavaBean对象” property=”属性名”>值4</c:set>
提示:从功能上分语法1和语法2、语法3和语法4的效果是一样的只是把value值放置的位置不同至于使用那个根据个人的喜爱,语法1和语法2是向scope范围内存储一个值,语法3和语法4是给指定的JavaBean赋值。
(3)、<c:remove>标签:主要用来从指定的JSP范围内移除指定的变量。
- 【语法】:
- <c:remove var=”变量名” [scope=”page|request|session|application”]/>
例如:
- <%@ page language="java" pageEncoding="utf-8"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <html>
- <head>
- <title>remove标签的使用</title>
- </head>
- <body>
- <ul>
- <li><c:set var="name" scope="session">张三</c:set>
- <li><c:set var="age" scope="session">22</c:set>
- <li><c:set var="sex" scope="session">男</c:set>
- <li><c:out value="${sessionScope.name}"></c:out>
- <li><c:out value="${sessionScope.age}"></c:out>
- <li><c:out value="${sessionScope.sex}"></c:out>
- <li><c:remove var="age"/>
- <li><c:out value="${sessionScope.name}"></c:out>
- <li><c:out value="${sessionScope.age}"></c:out>
- <li><c:out value="${sessionScope.sex}"></c:out>
- </ul>
- </body>
- </html>
输出:
- 张三
- 22
- 男
- 张三
- 男
1.2、流程控制标签。
流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:<c:if>标签、<c:choose>标签、<c:when>标签和<c:otherwise>标签。下面将介绍这些标签的功能和使用方式。
(1)、<c:if>标签:同程序中的if作用相同,用来实现条件控制。
- 【语法1】:
- <c:if test=”条件1” var=”name” [scope=”page|request|session|application”]>
- 【语法2】:
- <c:if test=”条件2” var=”name” [scope=”page|request|session|application”]>结果2</c:if>
【参数说明】:
I、test属性用于存放判断的条件,一般使用EL表达式来编写。
II、var指定名称用来存放判断的结果类型为true或false。
III、scope用来存放var属性存放的范围。
(2)、<c:choose>、<c:when>和<c:otherwise>标签:这3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。
- 【语法1】:3个标签的嵌套使用方式,<c:choose>标签只能和<c:when>标签共同使用。如:
- <c:choose>
- <c:when test="条件1">
- …..//业务逻辑1
- </c:when>
- <c:when test="条件2">
- …..//业务逻辑2
- </c:when>
- <span style="white-space: pre;"> </span><c:otherwise>
- …..//业务逻辑3
- </c:otherwise>
- </c:choose>
- 【语法2】:<c:when>标签的使用方式,该标签都条件进行判断,一般情况下和<c:choose>共同使用。如:
- <c:when text=”条件”>
- 表达式
- </c:when>
- 【语法3】:<c:otherwise>不含有参数,只能跟<c:when>共同使用,并且在嵌套中只允许出现一次。如:
- <c:otherwise>
- 表达式
- </c:otherwise>
例如:
- <%@ page language="java" pageEncoding="gbk"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <html>
- <head>
- <title>JSTL: -- choose及其嵌套标签标签示例</title>
- </head>
- <body>
- <h4>choose及其嵌套标签示例</h4>
- <hr>
- <c:set var="score">85</c:set>
- <c:choose>
- <c:when test="${ score>=90 }">
- 你的成绩为优秀!
- </c:when>
- <c:when test="${ score>=70 && score<90 }">
- 您的成绩为良好!
- </c:when>
- <c:when test="${ score>60 && score<70 }">
- 您的成绩为及格
- </c:when>
- <c:otherwise>
- 对不起,您没有通过考试!
- </c:otherwise>
- </c:choose>
- </body>
- </html>
1.3、循环标签。
循环标签主要实现迭代操作。主要包含两个标签:<c:forEach>和<c:forTokens>标签,接下来将详细介绍这两个标签的用法。
(1)、<c:forEach>标签:该标签根据循环条件遍历集合(Collection)中的元素。
- 【语法】:
- <c:forEach var=”name” items=”Collection” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>
- 所有内容
- </c:forEach>
【参数解析】:
I 、var设定变量名用于存储从集合中取出元素。
I 、items指定要遍历的集合。
III 、varStatus设定变量名,该变量用于存放集合中元素的信息。
I V、begin、end用于指定遍历的起始位置和终止位置(可选)。
V、step指定循环的步长。
【循环标签属性说明】:
名称 | EL | 类型 | 是否必须 | 默认值 |
var | N | String | 是 | 无 |
items | Y | Arrays Collection Iterator Enumeration Map String []args | 是 | 无 |
begin | Y | int | 否 | 0 |
end | Y | int | 否 | 集合中最后一个元素 |
step | Y | int | 否 | 1 |
varStatus | N | String | 否 | 无 |
其中varStatus有4个状态属性,如下:
属性名 | 类型 | 说明 |
index | int | 当前循环的索引值 |
count | int | 循环的次数 |
frist | boolean | 是否为第一个位置 |
last | boolean | 是否为第二个位置 |
(2)、<c:forTokens>标签:该标签用于浏览字符串,并根据指定的字符将字符串截取。
- 【语法】:
- <c:forTokens items=”strigOfTokens” delims=””delimiters [var=”name” begin=”begin” end=”end” step=”len” varStatus=”statusName”] >
【参数说明】
I 、items指定被迭代的字符串。
II 、delims指定使用的分隔符。
III 、var指定用来存放遍历到的成员。
I V、begin指定遍历的开始位置(int型从取值0开始)。
V、end指定遍历结束的位置(int型,默认集合中最后一个元素)。
V I 、step遍历的步长(大于0的整型)。
V II 、varStatus存放遍历到的成员的状态信息。
注:<c:forToken>的属性varStatus的使用同<c:forEach>的使用方法相同,在此就再不表述。