标准标签库概述
JSTL(JavaServer Pages Standard Tag Library)-JSP标准标签库,由SUN公司推出的,由Apache Jakarta 组织负责维护的用于编写和开发JSP页面的一组标准标签。用于替代功能重复并且包含Java代码的复杂HTML代码块,减少Java代码在页面中的数量提高开发效率
JSTL 的发布包有两个版本:Standard-1.0 Taglib 、Standard-1.1 Taglib
JSTL所提供的标签函数库主要分为五大类:核心标签库 (Core tag library) 、I18N 格式标签库 (I18N-capable formatting tag library) 、SQL 标签库 (SQL tag library) 、XML 标签库 (XML tag library) 和函数标签库 (Functions tag library)
引入标签库
使用JSP指令元素Taglib可以在JSP页面引入JSTL标准标签库
引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Taglib指令的属性:
prefix:表示在JSP页面里引用这个标签的前缀,一般用“c”
前缀不可以是jsp、jspx、java、javax、sunw等关键字
uri:用来表示标签库的地址,也就是告诉JSP容器怎么找到标签描述文件和标签库
通用标签
通用标签库用于在JSP页面里面操作JSP页面内的作用域变量
<c:set>标签用于在某个作用域(page、request、session和application)中设置变量
如果变量不存在,则会创建它,并给变量赋值
如果变量存在,则会重新赋值,覆盖原有数据
条件标签
JSTL 提供条件标签以支持 JSP 页面中的各种条件
条件标签包括:
<c:if test=‘’>标签用于条件的判断(test:条件表达式,var:指定存放本次条件表达式计算后的变量)
如果test属性为true,那么就计算标签体的内容
如果test属性为false,就忽略标签体的内容
<c:choose>标签的作用类似于Java语言的switch语句,在众多选项中做出选择
<c:choose>标签处理<c:when>标签的标签体,可以将多个<c:when>标签嵌入一个<c:choose>标签中。如果条件的值都为 false,则将处理<c:otherwise>的标签体。
<c:choose>标签没有属性
<c:when>标签只有一个属性test表示条件
<c:otherwise>标签没有属性表示以上情况都不满足时选择执行(类似switch中的default)
迭代标签
<c:forEach>标签用来遍历集合中的元素或者有条件地重复计算标签体的内容
<c:forEach items=‘被循环的信息’ begin=‘开始的元素(0是第一个元素)’ end =‘最后一个元素(0是第一个元素)’ step=‘每一迭代的步长(默认为1)’ var=‘代表当前条目的变量名称’ varStatus=‘代表循环状态的变量名称’>
varStatus属性的值:count保存迭代计数
<c:forTokens>标签通过指定分隔符将字符串分割为一个数组然后进行迭代
<c:forTokens items=‘red,green,blue’ delims=‘,’ var=‘color’>
<c:out value=‘${color}’ />
</c:forTokens>
EL表达式
EL(Expression Language,表达式语言)是在JSTL 1.0规范中引入的,作为JSTL的组成部分。在JSTL 1.1 规范中,JSP 2.0 容器已经能够独立的理解任何EL表达式,EL可以独立的出现在JSP页面的任何角落
EL不仅可以用来取代难以维护的Java 脚本或笨拙的jsp:userBean标签,更为重要的是,表达式语言支持下面的功能:
精确地访问存储对象
Bean属性的简略记法:点号记法与数组中括号记法
对集合的简单访问
对请求参数,Cookie和其他请求数据的简单访问
条件性输出
自动类型转换
空值取代错误
EL的语法:${ EL exprission } ${ bean.name } 或 ${ bean[‘name’] }
功能主要用于在JSP页面输出数据,类似:
脚本元素<jsp:getProperty />
表达式脚本<%= %>
EL表达式的出现主要用于简化JSP页面对Servlet共享数据的访问
EL表达式
${sessionScope.user.sex}
JSP Scriptlet
User user =(User)session.getAttribute(“user”);
String sex =user.getSex();
EL表达式中的常量包括布尔常量、整型常量、浮点数常量、字符串常量和NULL常量
布尔常量,用于区分事务的正反面,即true或false。
整型常量,与Java中定义的整型常量相同。
浮点数常量,与Java中定义的浮点数常数相同
字符串常量,是用单引号或双引号引起来的一连串字符。
NULL常量,用于表示引用的对象为空。页面什么都不会输出。
作为表现层的JSP页面的错误处理,往往会对用户有直观的体验为此EL提供了比较友好的处理方式:不提供警告,只提供默认值和错误,默认值是空字符串
EL表达式访问JavaBean
在 JSP 表达式语言中为访问 Bean 的属性提供了一种简单但十分强大的点号记法。如果我们某个 JavaBean 对象示例存放在某个作用域里,使用 EL 可以直接访问该对象的任何属性。例如,mybean 对象的 name 属性,只需要使用${mybean. name}即可实现
$ { mybean . name } 实质是调用bean的getName ( ) 方法
使用表达式语言时,也可以使用数组中括号记法(方括号)来替代点号记法
属性名必须使用单引号或双引号括起来
$ { mybean [ 'name' ] } 等同于 $ { mybean . name }
EL表达式访问集合元素
如果要访问数组、List或Map集合里的元素,可使用${对象名[索引]}。如果索引或键所采用的形式可以满足合法Java变量名的要求,则Bean的点号记法可以使用集合的括号记法代替。
${books[1]}其中books代表数组,List或Map集合,1代表元素索引
上面表示的是一维集合,如数组、List 等,若操作的集合为二维集合,如 HashMap,其值是 key 和 value 值对的形式,则值 (value) 可以这样显示:
${map.name}表示获取map集合中值为“name”的键值对也可以使用中括号来表示${map['name']}
EL表达式访问Servlet中的共享数据
EL表达式访问通过setAttribute方法存储在PageContext、HttpServletRequest、HttpSession或ServletContext中的对象
我们经常会碰到这种情况,某个 Servlet在代码中生成了数据或从数据库获取了数据, 之后又使用 RequestDispatcher 对象的 forward()方法或 response 对象的 sendRedirect()方 法将控制权转移给了相应的 JSP 页面。为了让其他的 JSP 页面能够访问到这些数据,该 Servlet 需要使用 setAttribute 方法将数据存储在某个标准位置:HttpServletRequest、 HttpSession 或 ServletContext。处于这些位置的对象称作是“作用域变量”,使用表达式 语言可以快速、容易地访问这些对象
EL 会依次从 PageContext、HttpServletRequest、HttpSession 和 ServletContext 对象中 查找名为 name 的属性。如果找到该属性,则调用它的 toString()方法并返回调用的结果。 如果没有找到任何属性,则返回空字符串
EL隐式对象
el表达式访问四大作用域
在Servlet之间共享数据,有时候Servlet的共享数据会出现同名的问题,那么这是时候我们该如何保证数据的有效访问?
EL表达式中有对应web程序运行环境中对应的四个作用域的EL隐式对象
pageScope对应pageContext中共享数据的作用域
requestScope对应HttpServletRequest请求对象共享数据的作用域
sessionScope对应HttpSession会话对象共享数据的作用域
applicationScope对应ServletContext共享数据的作用域
通过使用EL作用域隐式对象可以更精准的获取的Servlet中共享的数据
$ { rquestScope.stu.name } 表示获取request共享到servlet中的数据
$ { sessionScope.stu.name } 表示获取session共享到servlet中的数据
EL隐式对象param获取请求的参数
发送请求的页面
<form action="showInfo.jsp" method="post">
请输入你的注册信息: <br>
帐号:<input type="text" name="accId"><br>
名字:<input type="text" name="accName"><br>
密码:<input type="password" name="accPwd"><br>
开户金额:<input type="text" name="balance"><br>
<input type="submit" value="注册">
</form>
接收请求的页面
<body>
<%request.setCharacterEncoding("gbk"); %>
请确认以下的注册信息:<br>
帐号:${param.accId}<br>
名字:${param.accName}<br>
密码:${param.accPwd}<br>
开户金额:${param.balance}<br>
</body>
el表达式中的运算符
算术运算符
+和-:常规的加法和减法运算符
*和/:常规的乘法和除法运算符
%和mod:%(或与之等同的mod)运算符用来计算模数(余数),和Java变程语言中的%相同
关系运算符
==和eq:这两个相等性运算符检查参数是否相等
!=和ne:这两个相等性运算符检查参数是否不同
<和lt,>和gt,<=和le,>=和ge
逻辑运算符
&& (and) :逻辑与,运算符两边的表达式同时为真,则结果为真。其它情况结果为假
||(or):逻辑或,运算符两边的表达式同时为假,则结果为假。只要有一个是真,则结果为真
!(not):非,取反。运算符右边的表达式为真时,取反则为假。
空值判断运算符
empty
如果这个运算符的参数为null,空字符串,空数组,空Map或空集合,则返回true,否则返回false。
三目运算符
[条件表达式] ? [结果为真选择] : [结果为假选择]
EL表达式通过使用三目运算符可以实现复杂的逻辑处理