EL:
EL是JSP内置的表达式语言。Java 2.0开始,不让再使用Java脚本。而是使用EL表达式和动态标签来代替Java脚本。EL代替的是<%= ... %>,也就是说,EL只能做输出。
EL表达式来读取四大域:
${xxx}:全域查找名为xxx的属性,若不存在,输出空字符串,而不是null。
查找优先级:pageContext、request、session、application。
${pageScope.xxx }、${requestScope.xxx }、${sessionScope.xxx}、${applicationScope.xxx}:指定域查找。
EL十一个内置对象:
十一个内置对象,其中10个是Map类型,pageContext不是Map,它就是PageContext类型
1、pageScope
2、requestScope
3、sessionScope
4、applicationScope
5、param:对应参数。是Map类型,其中key对应参数名,value对应单个参数值。适用于单值的参数。
6、paramValues:对应参数。是Map类型,其中key对应参数名,value对应多个参数值。适用于多值的参数。
7、header:对应请求头。适用于单值的请求头。
8、headerValues:对应请求头。适用于多值的请求头。
9、initParam:获取<context-param>内的参数。
10、cookie:是Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象。取值:${cookie.xxx.name}、${cookie.xxx.value}
11、pageContext:是PageContext类型。${pagecontext.request.contextPath}项目名。
EL函数库:
由JSTL提供。使用EL函数库需要导入标签库。
<% taglib prefix="fn" uri="" %>
EL自定义函数库:
自定义一个Java类,类中可以定义0~N个静态方法,并且有返回值。
在WEB-INF目录下创建一个tld文件,并录入:
<function> <name>fun</name> <function-class></function-class> <function-signature></function-signature> </function>
在JSP页面中导入标签库<%@taglib prefix="fn" uri="/WEB-INF/tlds/xxx.tld"%>;在JSP页面中使用自定义的函数。
JSTL:
JSTL是标签语言;是apache对EL表达式的扩展。依赖与EL。
JSTL四大标签库:
core:核心标签库
fmt:格式化标签库
sql:数据库标签库。已过时
xml:xml标签库。已过时
core:又称c标签。
out和set:
<c:out>:输出
<c:out value="输出的值" />
<c:out value="${xxx}" default="默认输出值" />:当xxx不存在时,输出default的值。
<c:set>:设置;初建域的属性
<c:set var="变量名" value="变量值,可以是EL表达式" scope="域" />
remove:
<c:remove>:删除域变量
<c:remove var="变量名" scope="域" />:若不给出scope,则删除所有域的该名称的变量。若指定,则只删除该域的变量。
url:
<c:url value="路径" />:指定一个路径,它会在路径前自动添加项目名。
子标签:<c:param>:用来给url后添加参数。
例:
<c:url value="路径">
<c:param name="x" value="X" />
</c:url>
<c:url value="路径" var="变量名" scope="域" />
var:指定变量名,添加该属性后,那么url标签就不会再输出该页面,而是把生成url保存到域中。
scope:它与var一起使用,用来保存url。
if:
<c:if>:对应if语句
<c:if test="布尔类型">
...
</c:if>
当test的值为true时,指定标签体内容。
choose:
<c:choose>:对应if/else if/....../else语句。
<c:choose>
<c:when test="布尔类型"></c:when>
<c:when test="布尔类型"></c:when>
...
<c:otherwise></c:otherwise>
<c:choose>
forEach:
<c:forEach>:循环
例:
<c:forEach var="i" begin="1" end="10" step="2">
${i}
</c:forEach>
<c:forEach items="" var="str">
${str}
</c:forEach>
var:循环变量
begin:设置循环变量开始值
end:设置循环变量结束值
step:设置步长;默认1。等同于循环中的i++/i+=2
items:指定要遍历的值
循环状态:
可以使用varStatus来创建循环状态变量;循环状态变量由一下属性:
count:元素个数。index:下标。first:第一个元素。last:最后一个元素。current:当前元素。
fmt:格式化库
<fmt:formatDate>:格式化输出。通常需要格式化的由时间、数字。
<fmt:formatDate value="${date}" partten="yyyy-MM-dd HH:mm:ss">
自定义标签:
步骤:
1、标签处理类:标签也是一个对象,那么就需要先由类。
2、tld文件,它时一个xml。
3、页面中使用<%@taglib%>来指定tld文件的位置
标签处理类:
SimpleTag接口下的方法:
doTag();每次指定标签时都会调用这个方法。
JspTag getParent();返回父标签;非生命周期方法。
setParent(JspTag);设置父标签
setJspBody(JspFragment);设置标签体
setJspContext(JspContext);设置JSP上下文对象,JspContext有个子类PageContext
其中doTag()会在其他三个setXXX()方法后被tomcat调用。
配置tld文件:
tld文件一般都放到web-INF之下,这样保证客户端访问不到。
<tag> <name></name> <!--指定当前标签的名称--> <tag-class></tag-class> <!--指定当前标签的标签处理类--> <body-content>empty</body-content> <!--指定标签体的类型,empty:空--> </tag>
页面中指定tld文件位置:<%@taglib prefix="" uri="/WEB-INF/tlds/xxx.tld"%>
标签体内容:
empty:无标签体
JSP:jsp 2.0已经不再支持这个类型,表示标签体内容可以是:Java脚本、标签、EL表达式。
scriptless:只能是EL表达式,也可以是其他的标签。
tagdependent:标签体内容不会被执行,而是直接赋值标签处理类。
不再执行标签下面内容的标签:
在标签处理类中的doTag()中使用SkipPageException来结束。
tomcat会调用标签处理类的doTag(),然后tomcat会得到SkipPageException,就会跳过本页面的其他内容。
带有属性的自定义标签:
步骤:
1、给自定义标签处理类添加属性
为标签处理类添加属性,属性至少要有一个set方法。这个set方法会在doTag()之前被tomcat调用执行;所以在doTag()中可以使用属性。
2、在tld文件中对属性进行配置
配置方法:
<attribute> <name></name> <!--指定属性名--> <required></required> <!--指定属性是否为必填项--> <rtexprvalue></rtexprvalue> <!--指定属性是否可以使用EL表达式--> </attribute>