1.EL表达式总是放在大括号里,而且前面有一个美元符前缀。
person.name2.相似点:(1).都可以让我们在静态内蓉中插入动态信息。EL:室外温度是
{emp}度
JSP:室外温度是<%=temp%>度
PS:web容器会以同样的方式处理二者(一旦接受到请求,容器将计算表达式,将其转换为一个字符串,然后插入到响应输出流中)
(2).这些表达式同时还允许我们更改标准标记或自定义标记的属性。
< div style=
mystyle>HELLO</div>3.不同点:(1).所有EL表达式以“
{”开始,以“}”结尾,JSP是<% %>
(2)很细小,处理表达式内部变量的方式。
JSP:<%! Int i=100; %>
EL:表达式是不能在脚本中定义变量。如果上面的变量声明后,返回一个未定义的值。
PS:我们一般采用javabean的属性或者自定义标记库和标准标记库来定义变量,但是最简单的变量访问是使用JSP本身提供的隐私对象
4.EL表达式中使用隐式变量
EL中的隐式变量
类别 隐式变量名 描述
JSP pageContext 用来访问JSP隐式对象
作用域 pageScope 与page作用域属性的名称和值相关联的Map类
requestScope 与requset作用域属性的名称和值相关联的Map类
sessionScope 与session作用域属性的名称和值相关联的Map类
applicationScope 与application作用域属性的名称和值相关联的Map类
请求参数 Param 包含请求参数字符串的Map类
paramValue 包含请求参数字符串数组(String[])的Map类
请求头 Header 包含请求头自妇女换的Map类
headerValues 包含请求头字符串数组(String [])的Map类
Cookie Cookie 按名称存储请求附带的Cookie的Map类
PS:并没有直接赋予我们EL中直接访问真正的page、servletRequest、HttpSession以及ServletContext的权力,他们返回的只是一个与分别page作用域,Session作用域、application作用域有关的属性名和值的Map对象。
pageContext隐式变量相当于JSP中的javax.serlvet.jsp.PageContext对象
例:
pageContext.request.requsURL为了获得请求的HTTP方法例:
{pageContext.request.method}
JSP可以使用method方法
例:<%=request.getMethod() %>
(1)使用totalPrice属性处理用户的多个购买
sessionScope.totalPricePS:通过applicationScope隐式变量去访问ServletContext里的属性,而不是通过PageContext变量例:
{param.name}
header.accept(2)最后一个隐式变量cookie,用于返回servlet的getCookies()方法的结果PS:当容器解析EL表达式变量时,列如
{x}中的x,容器首先检查隐式变量。如果隐式变量中找不到x,它将一次查找page,request,session,application范围的属性,如果还没有找到x,就直接返回null
5.EL运算符
(1)用于访问属性和集合的EL运算符
A.a.b:返回a的属性b的值
B.a[b]:返回a的键或者索引为b的值
${header[“host”]}
Header是一个Map。调用header.get(“host”)方法来去的并显示这个EL表达式的结果。类似的,headerValues.host则会返回一个数组
(2)EL算术、关系、逻辑运算符
除 /或div
取模 %或mod
小于 <或lt
大于 >或gt
小于等于 <=或le
大于等于 >=或ge
是否为空 empty
6.EL函数
(1)将函数插入到JSP页面中的过程共包含创建和更改四个文件
1.方法类(.Java):包含需要在JSP中使用的Java方法
2.标记库描述文件(*.tld):映射每个Java方法到xml函数名
3. 部署描述文件(web.xml):饮食和TLD到标记库URL(注意:改变本文件不是必须的,但是推荐改变本文件)
4.JSP页面(*.jsp):使用标记库URL和函数名调用方法
(2)创建静态方法upper()和length()
PS:
1.方法必须被声明为public和static,而方法所属的类必须声明为public。这样servlet就可以直接访问该类及其方法,而不用创建一个对象。
2.方法的参数和返回值必须在EL中是有效的,否则,web容器将不能识别方法签名
3.类文件必须保存在/WEB-INFO/classes目录下
(3)创建标记库描述文件(TLD)
TLD的目标是将静态方法映射到可以再JSP中使用的函数名。EL中不允许直接调用Java方法
1.元素function中的内容用于定义如何将Java方法映射到函数,对于每个function函数,我们需要提供3类信息
(1)name元素定义要在JSP中使用的函数名
(2)Function-class元素定义方法所在的类的全名
(3)Function-signature元素定义静态方法及其参数和返回值的全数据类型
(4)更改部署描述文件
1.taglib元素中必须包含两个子元素
(1)taglib-uri元素定义用于servlet和JSP要访问该标记库的URL。这个URL可以是绝对的(http://….),可以是相对的(/….)
(2)taglib-location元素定义标记库描述文件的上下文路径。因为我们TLD是在WEB-INFO下面的myFunc目录下,所以元素值是/WEB-INF/myFunc/Functions.tld
(5)在JSP内访问EL函数
1.使用taglib指令访问TLD,并用于一个前缀代表该标记库
2.使用TLD前缀和函数名创建一个EL表达式,必须使用正确参数类型
7.JSP自定义标记库与标准标记库JSTL
JSTL标准标记库
功能范围 作用 URI 前缀
核心 一般用途处理的标记 http://java.sun.com/jsp/jstl/core c
Xml 解析、选择、转换xml数据的标记 http://java.sun.com/jsp/jstl/xml x
数据库 访问关系型数据库的标记 http://java.sun.com/jsp/jstl/sql sql
国际化 为国际化应用格式化数据的标记 http://java.sun.com/jsp/jstl/fmt Fmt
函数 处理字符串和集合的标记 http://java.sun.com/jsp/jstl/function fn
我们就可以使用前缀c来引用JSTL核心标准库中的JSTL标记
(1)通用标记
1.< c:catch>和< c:out>,catch标记不会自己执行这些例程,但是会将抛出的一场保存到catch标记的var属性中
2.Out有一个必要的属性value,标记的功能就是显示value的值
< c:out value=”${number}”/>
(2)变量支持标记
1.< c:set>:设置变量和对象的值
2.< c:remove>:将一个变量从其作用域中删除
(3)流程控制
1.JSTL条件处理:< c:choose>和< c:if>
(1)< c:choose>本身不包含任何属性。但是可以包含多个
< c:when>,when标记中实现比较与测试属性分离
2.循环:< c:forEach>和< c:forTokens>
(4)JSTL访问URL信息
1.核心标记库汇总最后一类是处理URL访问
(1)< c:url>重写URL并对其参数编码
(2)< c:import>访问web应用程序之外的内容
(3)< c:redirect>重定向到不同的URL
2.< c:url>
< c:url value=”/page.html” var=”pagename”/>
还可以用scope属性指定var访问(page,request,session,applicationx)
<c:url value=”/page.html” var=”pagename”>
<c:param name=”param1”value=”${2*2}”/>
</c:url>
3.< c:import>
通过JSP的include指令范文URL,但是如果访问servlet容器外的内容,就必须使用标记
<c:import url=”/content.html” var=”newstuff”scope=”session”>
<c:param name=”part1” value=”val1”/>
<c:param name=”part2” value=”val2”/>
</c:import>
4.< c:redirect>
和httpservlet的sendRedirect()方法相同,发送一个重定向响应到客户端
<c:redirect url=”/content.html”>
<c:param name=”par1”value=”val1”/>
<c:param name=”par2”value=”va2”/>
</c:redirect>