EL表达式
1 EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为"",(注意不是null)。
${data}<%--显示abcd --%>
<%-- pageContext.findAttribute("data") page-->request-->session-->application--%>
原理: 从这四个域中以data为关键字按顺序查找
|
${person.name}<%--显示张三--%>
<%--pageContext.findAttribute("person")page-->request-->session->application--%>
原理: 从这四个域中以person为关键字按顺序查找
|
list.add(new person("张三")); list.add(new person("李四")); list.add(new person("王五")); ${list[2].name}<%--显示王五--%>
<%--pageContext.findAttribute("list")page-->request-->session->application--%>
原理: 从这四个域中以list为关键字按顺序查找,找到list后以角标为关键字查找
|
map.put("aa",new person("张三")); map.put("bb",new person("李四")); map.put ("11",new person("王五")); ${map.bb.name}<%--显示李四--%> ${map.[ ' 11' ].name}
<%--EL表达式在取数据时通常用点号(.),点号取不出来时,用方括号([ ])--%>
<%--pageContext.findAttribute("map")page-->request-->session->application--%>
原理: 从这四个域中以map为关键字按顺序查找,找到map后以bb为关键字查找
|
2 EL表达式中也可以使用${customerBean.address}的形式来访问JavaBean对象的属性。
Address add = new Address(); add.setCity("上海");
${p.address.city}<%--显示上海--%>
<%--pageContext.findAttribute("p")page-->request-->session->application--%>
原理: 从这四个域中以p为关键字按顺序查找
|
3 结合JSTL的forEach标签,EL表达式也可轻松获取各种集合中的元素(对集合进行迭代操作)。
对List集合中的数据进行迭代操作
list.add(new person("张三")); list.add(new person("李四")); list.add(new person("王五")); <c:forEach var="person" items="${list}"> ${person.name} <br/> </c:forEach>
显示:张三<br/>李四<br/>王五<br/>
|
对Map集合中的数据进行迭代操作
map.put("aa",new person("张三")); map.put("bb",new person("李四")); map.put ("11",new person("王五")); <c:forEach var="entry" items="${map}"> ${entry.key} : ${entry.value.name} <br/> </c:forEach>
显示:aa 张三<br/>bb 李四<br/>11 王五
迭代原理:使用foreach标签对map集合进行迭代,其实是map调用entrySet()方法得到Set集合,然后对Set集合进行迭代。
|
4 结合JSTL的if 标签,EL表达式也可使用类如${1==1}的形式进行简单的逻辑判断。
<c:if test="${user!=null}"> 欢迎您:${user.username} </c:if>
//代表用户未登录
<c:if test="${user=null}">用户名:<input type="name" value="name">
密码:<input type="password" value="password"> </c:if> |
5 EL表达式可以动态获取当前WEB应用的路径
${pageContext.request.contextPath}
原理:pageContext.getrequest().getContextPath()
JSTL标签库
JSTL是SUN公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码。
在页面中使用JSTL标签需完成以下2个步骤:
- 导入jstl.jar和standerd.jar这两个JSTL的jar文件。
- 在JSP页面中使用<%@tablib url="" prifix=""%>元素导入标签库。
url
地址写法:在standerd.jar包的META-INF目录下的c.tld文件(对标签的描述文件)中有一个url,此url绑定了JSTL标签库中所有的标签,引人这个url即导入了JSTL标签库。
prifix(前缀)的名称可以采用引入的url的文件的前缀名(如c).
JSTL标签库主要分为5个部分:
- 核心标签库 描述文件: c.tld
- 国际化标签 描述文件: fnt.tld
- 数据库标签 描述文件: sql.tld
- XML标签 描述文件: x.tld
- JSTL函数(EL函数) 描述文件: fn.tld
核心标签库
<c:out>标签
<c:out>标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
Value
|
true
|
Object
|
指定要输出的内容
|
escapeXml
|
true
|
Boolean
|
指定是否将>、<、&、'、"等特殊字符进行HTML编码转换后再进行输出。默认值为true。
|
default
|
true
|
Object
|
指定如果Value属性的值为null时所输出的默认值
|
<c:set>标签
<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
Value
|
true
|
Object
|
指定属性值
|
var
|
false
|
String
|
指定要设置的Web域属性的名称
|
scope
|
false
|
String
|
指定属性所在的Web域
|
target | true | Object | 指定要设置的属性的对象,这个对象必须是JavaBean对象或java.util.Map对象 |
property | true | String | 指定当前要为对象设置的属性名称 |
<c:remove>标签
<c:remove>标签用于删除各种Web域中的属性。
其语法格式如下:
<c:remove var="varName" [scope="{page|request|session|application}"]/>
<c:catch>标签
<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,
其语法格式如下:
<c:catch var="varName">nested actions</c:catch>
var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个Web域中。
<%@ page contentType="text/html;charset=GB2312"%>
<c:catch var="myex">
<%
int x = 10/0;
%>
</c:catch>
异常:<c:out value="${myex}"/> ${myex}<br/>
异常 myex.getMessage: <c:out value="${myex.message}"/><br/>
异常 myex.getCause: <c:out value="${myex.cause}"/><br/>
异常 myex.getStackTrace: <c:out value="${myex.stackTrace}"/><br/>
|
<c:if test="">标签可以构造简单的"if-then"结构的条件
表达式
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
test
|
true
|
boolean
|
决定是否处理标签体中的内容的条件表达式
|
var
|
false
|
String
|
指定将test属性的执行结果保存到某个Web域中的某个属性的名称
|
scope
|
false
|
String
|
指定将test属性的执行结果保存到哪个Web域中
|
<c:choose>标签
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。
使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似"if--else if--else"的复杂条件判断结构。
<%@ page contentType="text/html;charset=GB2312"%>
<c:set value="${param.count}" var="count"/>pageContext(count,2)
<c:choose>
<c:when test="${count==0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwisse>
符合您要求的记录共有${count}条
</c:otherwise>
</c:choose>
|
<c:forEach>标签
<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
var
|
false
|
String
|
指定将当前迭代到的元素保存到page这个Web域中的属性名称
|
varStatus
|
false
|
String
|
记住用于保存迭代信息的对象
|
items
|
true
|
任何支持的类型
|
将要迭代的集合对象
|
begin | true | int | 如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的元素索引值从0开始编号; 如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代 |
end | true | int | 参看begin属性的描述 |
step | true | int | 指定迭代的步长,即迭代因子的迭代增量 |
<style>
.odd{background-color: red;}
.even{background-color: blue;}
tr : hover{background-color: black;}
</style>
<table border="1" width="20%">
<c: forEach var="str" items="${list}" valStatus="status">
<tr class="${status.count%2==0?'even':'odd'}">
<td>${str}</td>
</tr>
</c:forEach>
</table>
|
<c:url>标签
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是会将会话标识号以参数形式附加在URL地址后面
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
Value
|
true
|
String
|
指定要构造的URL
|
var
|
false
|
String
|
指定将构造出的URL结果保存到Web域中的属性名称
|
scope
|
false
|
String
|
指定将构造出的URL结果保存到哪个Web域中
|
<c:redirect>标签
<c:redirect>标签用于实现请求重定向
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
url
|
true
|
String
|
指定要转发或重定向到的目标资源的URL
|
context
|
true
|
String
|
当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的资源时,
context属性指定其他web程序的名称
|
<c:param>标签
在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。
<c:param>标签可以嵌套在<c:import>、<c:url><c:redirect>标签内,为这些标签所使用的URL地址附加参数。
<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面。
<c:forTokens>标签
<c:forTokens>标签主要用来分割数据
属性名
|
是否支持EL
|
属性类型
|
属性描述
|
items
|
true
|
String
|
指定需要分割的数据
|
delims
|
true
|
String
|
指定以什么来分割数据
|
自定义标签
自定义标签主要用于移除JSP页面中的java代码。
要使用自定义标签移除JSP页面中的java代码,只需要完成以下两个步骤:
- 编写一个实现Tag接口的java类,把页面java代码移到这个java类中(标签处理器类)
- 编写标签库描述符(tld)文件,在tld文件中把标签处理器类描述成一个标签。