什么是EL
JSP2.0要把html和css分离、要把html和javascript分离、要把Java代码块替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。
EL表达式的格式:${…},例如:${1+2}。
在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式。
如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“”,例如:${1+2}。
EL运算符
(数学和逻辑|&!)
.运算符:调用.之前的getter方法.只要有get方法, . 就能调
[]运算符:.能做的,它都能做; .不能做的,它也能做.
empty运算符:判断一个对象是否是null或者"",如果是,返回true;
如果对象是一个集合,即使对象本身不是null,没有元素也返回true.
1 <body> 2 3 <% pageContext.setAttribute("p", null); %> 4 5 <!-- empty判断是否为空,为空打印true --> 6 7 ${empty p }<br/> 8 9 <% 10 11 List list = new ArrayList(); 12 13 list.add("p"); 14 15 pageContext.setAttribute("list", list); 16 17 %> 18 19 ${empty list }<hr/> 20 21 ${empty cart }<br/> 22 23 <!-- empty进行 3元运算 --> 24 25 ${1!=1?"等于":"不等于" }<br/> 26 27 ${empty list?"您没有购买任何商品":"您买了以下商品" }<br/> 28 29 <% 30 31 session.setAttribute("user", new Person("向阳")); 32 33 %> 34 35 ${empty user?"您没有登录":"欢迎访问" } 36 37 <% 38 39 pageContext.setAttribute("gender", "0"); 40 41 %> 42 43 <input type="radio" name="gender" value="1" ${gender=='1'?'checked="checked"':''}/>男 44 45 <input type="radio" name="gender" value="1" ${gender=='0'?'checked="checked"':''}/>女 46 47 </body>
运算符 |
说明 |
范例 |
结果 |
+ |
加 |
${17+5} |
22 |
- |
减 |
${17-5} |
12 |
* |
乘 |
${17*5} |
85 |
/或div |
除 |
${17/5}或${17 div 5} |
3 |
%或mod |
取余 |
${17%5}或${17 mod 5} |
2 |
==或eq |
等于 |
${5==5}或${5 eq 5} |
true |
!=或ne |
不等于 |
${5!=5}或${5 ne 5} |
false |
<或lt |
小于 |
${3<5}或${3 lt 5} |
true |
>或gt |
大于 |
${3>5}或${3 gt 5} |
false |
<=或le |
小于等于 |
${3<=5}或${3 le 5} |
true |
>=或ge |
大于等于 |
${3>=5}或${3 ge 5} |
false |
&&或and |
并且 |
${true&&false}或${true and false} |
false |
!或not |
非 |
${!true}或${not true} |
false |
||或or |
或者 |
${true||false}或${true or false} |
true |
empty |
是否为空 |
${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”} |
true |
EL操作操作对象的方式
l 操作List和数组:${list[0]}、${arr[0]};
l 操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法;
l 操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)。
List:按照索引取
Map:按照key取绑定的对象。
<!-- 获取Map中的数据 --> <% Map<String,Person> map = new HashMap<String,Person>(); map.put("p1", new Person("刘艳伟")); map.put("p2", new Person("宋旭东")); map.put("p3", new Person("李梅")); pageContext.setAttribute("mm", map); %> <!-- 获取map中的数据,先获取键,再name --> ${mm.p3.name }<hr/>
注意: *在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点 与使用request.getParameter()方法是不同的。
* *${EL表达式}, ${pp.address.city} == ${pp['address']["city"]} 当参数名中间有-号非法字符时,应用[]来取,否则应为有-而报错
EL隐藏对象
请不要与JSP内置对象混淆,一个是表示对象本身,其余表示的都是Map
---------------------------------------------------------------------------------------------------
EL内置对象名称 表示的类型
pageContext javax.servlet.jsp.PageContext
pageScope java.util.Map
requestScope java.util.Map
sessionScope java.util.Map
applicationScope java.util.Map
param java.util.Map
paramValues java.util.Map
header java.util.Map
headerValues java.util.Map
cookie java.util.Map
initParam java.util.Map
1 参数隐藏对象
这些隐藏对象都是Map类型!
l param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同。
注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。
l paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它。
l header:header是Map<String,String>类型,用来获取请求头。
l headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。
l initParam:initParam是Map<String,String>类型。它对应web.xml文件中的<context-param>参数。
l cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。
2 域隐藏对象
使用EL表达式最为常用的就是获取域对象中保存的数据。例如:${pageScope.xxx},表示获取在pageContext保存的数据。当然${pageScope[‘xxx’]}是相同的!
l pageScope:pageScope是Map<String,Object>类型,${pageScope.xxx}的功能相等与pageContext.getAttribute(“xxx”)。两者的区别在于,前者在数据不存在时返回空字符串,而后者返回null。
l requestScope:requestScope是Map<String, Object>类型,装载了request对象中的所有数据;
l sessionScope:sessionScope是Map<String, Object>类型,装载了session对象中的所有数据;
l applicationScope:applicationScope是Map<String, Object>类型,装载了application对象中的所有数据;
当EL中给出的不是隐藏对象时,表示在四个域中查找数据。例如:${a},表示
l 在${pageScope.a}中查找,如果找到就返回;
l 在${requestScope}中查找,如果找到就返回;
l 在${sessionScope}中查找,如果找到就返回;
l 在${applicationScope}中查找,如果找到就返回,找不到就返回空字符串。
3 页面上下文隐藏对象
l pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest,可以${pageContext.request}。
Expression |
说明 |
${pageContext.request.queryString} |
pageContext.getRequest().getQueryString(); |
${pageContext.request.requestURL} |
pageContext.getRequest().getRequestURL(); |
${pageContext.request.contextPath} |
pageContext.getRequest().getContextPath(); |
${pageContext.request.method} |
pageContext.getRequest().getMethod(); |
${pageContext.request.protocol} |
pageContext.getRequest().getProtocol(); |
${pageContext.request.remoteUser} |
pageContext.getRequest().getRemoteUser(); |
${pageContext.request.remoteAddr} |
pageContext.getRequest().getRemoteAddr(); |
${pageContext.session.new} |
pageContext.getSession().isNew(); |
${pageContext.session.id} |
pageContext.getSession().getId(); |
${pageContext.servletContext.serverInfo} |
pageContext.getServletContext().getServerInfo(); |
JSTL(core和fn)
JSTL概述
1 什么是JSTL
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!
既然是第三方的东西,那么就需要导包。但是如果你使用的是MyEclipse,那么MyEclipse会帮你导包的。
2 JSTL标签库结构
3 导入标签库
导入标签库需要使用taglib指令!
<%@ taglib prefix="c" uri=" http://java.sun.com/jsp/jstl/core"" %>
JSTL核心库
1 out和set(重点)
out
<c:out value=”aaa”/> |
输出aaa字符串常量 |
<c:out value=”${aaa}”/> |
与${aaa}相同 |
<c:out value=”${aaa}” default=”xxx”/> |
当${aaa}不存在时,输出xxx字符串 |
<% request.setAttribute("a","<script>alert('hello');</script>"); %> <c:out value="${a }" default="xxx" escapeXml="false" /> |
当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。 |
set:set标签的var、value、scope是一组,而target、property、value是一组。
<c:set var=”a” value=”hello”/> |
在pageContext中添加name为a,value为hello的数据。 |
<c:set var=”a” value=”hello” scope=”session”/> |
在session中添加name为a,value为hello的数据。 |
<jsp:useBean id="user" class="cn.itcast.domain.User"/> <c:set target="${user }" property="username" value="qdmmy6"/> <c:set target="${user }" property="password" value="123456"/> <c:out value="${user }" /> |
给user的username属性赋值qdmmy6,给user的password属性赋值123456。 |
2 remov
<% pageContext.setAttribute("a", "pageContext"); request.setAttribute("a", "session"); session.setAttribute("a", "session"); application.setAttribute("a", "application"); %> <c:remove var="a"/> <c:out value="${a }" default="none"/> |
删除所有域中name为a的数据! |
<c:remove var="a" scope=”page”/> |
删除pageContext中name为a的数据! |
3 url
url标签会在需要URL重写时添加sessionId。
<c:url value="/"/> |
输出上下文路径:/day08_01/ |
<c:url value="/" var="a" scope="request"/> |
把本该输出的结果赋给变量a。范围为request |
4 if和choose(重点)
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
<c:set var="a" value="hello"/> <c:if test="${not empty a }"> <c:out value="${a }"/> </c:if> |
choose标签对应Java中的if/else if/else结构
when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容
<c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> <c:when test="${score >= 90 }">A级</c:when> <c:when test="${score >= 80 }">B级</c:when> <c:when test="${score >= 70 }">C级</c:when> <c:when test="${score >= 60 }">D级</c:when> <c:otherwise>E级</c:otherwise> </c:choose> |
5 forEach(重点)
forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。
<c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10"> <c:set var="sum" value="${sum + i}" /> </c:forEach> <c:out value="sum = ${sum }"/> <c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10" step ="2"> <c:set var="sum" value="${sum + i}" /> </c:forEach> <c:out value="sum = ${sum }"/>
还可以使用forEach来遍历数据或集合,遍历数组:
<% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns } "> <c:out value="name: ${item }"/><br/> </c:forEach> |
遍历List
<% List<String> names = new ArrayList<String>(); names.add("zhangSan"); names.add("liSi"); names.add("wangWu"); names.add("zhaoLiu"); pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach> |
遍历Map
<% Map<String,String> stu = new LinkedHashMap<String,String>(); stu.put("number", "N_1001"); stu.put("name", "zhangSan"); stu.put("age", "23"); stu.put("sex", "male"); pageContext.setAttribute("stu", stu); %> <c:forEach var="item " items="${stu }"> <c:out value="${item.key }: ${item.value } "/><br/> </c:forEach> |
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
l count:int类型,当前以遍历元素的个数;
l index:int类型,当前元素的下标;
l first:boolean类型,是否为第一个元素;
l last:boolean类型,是否为最后一个元素;
l current:Object类型,表示当前项目。
<c:forEach var="item" items="${ns }" varStatus="vs"> <!-- varStatus 把循环状态赋给vs --> <c:if test="${vs.first }">第一行:</c:if> <!--如果是第一行,那么${vs.first}为true --> <c:if test="${vs.last }">最后一行:</c:if> <c:out value="第${vs.count }行: "/> <!-- 返回行数,从1开始--> <c:out value="[${vs.index } ]: "/> <!-- 返回行数,从0开始--> <c:out value="name: ${vs.current } "/><br/> <!--当前项,与${item}相同 --> </c:forEach> |