1.为什么需要EL
在JSP中使用Java脚本的局限
在JSP页面中嵌入大量的Java代码 访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换
<%Employeeemployee= (Employee) request.getAttribute("employee"); Computercomp=employee.getComputer(); Stringmanufacturer=comp.getManufacturer(); %>
EL表达式使JSP的开发变得更加简单
${requestScope.employee.computer.manufacturer}
2.EL表达式简介
(1)什么是EL
Expression Language(表达式语言)
2)EL的功能
替代JSP页面中数据访问时的复杂编码
(3)EL的特点
自动转换类型 EL得到某个数据时可以自动转换类型
(4)使用简单
3.EL表达式语法
(1)通过变量名取值
${变量名} 按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null ${ EL expression }
(2)获取对象的属性值
<%= ( (User) request.getAttribute("user") ) .getName() %>点操作符${user.name} [ ] 操作符${user["name"]}
3)获取集合元素
// 在Servlet或JSP中保存数据Listnames=newArrayList(); names.add(0, "LiYang"); names.add(1,"WangHua"); request.setAttribute("names",names); // 在JSP中访问数据姓名:${ names[0] }<br/>//使用[ ]指定元素下标姓名:${ names[1] }<br/>// 在Servlet或JSP中保存数据Mapnames=newHashMap(); names.put("one", "LiYang"); names.put("two", "WangHua"); request.setAttribute("names", names); // 在JSP中访问数据姓名:${ names.one }<br/>姓名:${ names["two"] }<br/>
属性范围 |
EL中的名称 |
page |
pageScope,例如${pageScope.username}表示在page作用域查找变量username,找不到返回null |
request |
requestScope |
session |
sessionScope |
application |
applicationScope |
4.application作用于案例实现网站访问数量
<%pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>application统计网站访问次数</title></head><body><%Integercount= (Integer)application.getAttribute("count"); if(count!=null){ count+=1; }else{ count=1; } application.setAttribute("count", count); %><!--页面显示--><%Integeri= (Integer) application.getAttribute("count"); out.println("您好,你是第"+i+"位访问本网站的用户!!" ); %></body></html>
4.EL隐式对象
EL隐式对象介绍
对象名称 |
说 明 |
pageScope |
与page作用域相关联的Map对象(只在当前页面使用) |
requestScope |
与request作用域相关联的Map对象 |
sessionScope |
与session作用域相关联的Map对象 |
applicationScope |
与application作用域相关联的Map对象 |
param |
按照请求参数名称返回单一值的Map对象 |
paramValues |
按照请求参数名称返回String数组的Map对象 |
pageContext |
提供对页面信息和JSP内置对象的访问 |
5.案例:问卷调查
<%pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>问卷调查</title></head><body><formaction="investigationEl.jsp"method="POST">昵称: <inputname="username"><br>所在城市: <inputname="city"><br>你所使用的开发语言:<inputtype="checkbox"name="language"value="JAVA">Java<inputtype="checkbox"name="language"value="C">C<inputtype="checkbox"name="language"value="C++">C++<inputtype="checkbox"name="language"value="PHP">PHP<inputtype="checkbox"name="language"value="ASP">ASP<br><br><inputtype="submit"value="提交"></form></body></html>
<%pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>使用EL展示问卷调查</title></head><body><%//设置字符集编码request.setCharacterEncoding("utf-8"); //获得语言集合String[] languages=request.getParameterValues("language"); %>你所填写的内容是:<br/>昵称:${param.username } <br>所在城市:${param.city } <br>使用的开发语言有:<%if(languages!=null){ for (inti=0; i<languages.length; i++) { if (i>0) { out.println("、"); } //将索引放到请求域中 request.setAttribute("i", i); %>${paramValues.language[i]} <% } } %></body></html>
6.什么是JSTL
JSP标准标签库(JSP Standard Tag Library) JSTL通常会与EL表达式合作实现JSP页面的编码
(1)JSTL的优点:
提供一组标准标签 可用于编写各种动态 功能
(2)使用JSTL的步骤
引入JSTL的jar文件和标签库描述符文件 在JSP页面添加taglib指令 使用JSTL标签
引入方式:(固定模式)<%tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>
7.JSTL标准标签库中的常用标签
8.通用标签
(1)set:设置指定范围内的变量值
语法:
将value值存储到范围为scope的变量
<c:set var="variable" value="value" scope="scope" />
将value值设置到对象的属性中
<c:settarget="target"property="property"value="value"/>// 在Servlet或JSP中设置JavaBeanUseruser=newUser(); request.setAttribute("user", user); // 在JSP中修改JavaBean的属性值<c:settarget="${user}"property="name"value="defaultName"/>
(2)out:计算表达式并将结果输出显示
语法:
不指定默认值
<c:out value="value" />
指定默认值
<c:outvalue="value"default="default"/>// 在Servlet或JSP中设置JavaBeanUseruser=newUser(); request.setAttribute("user", user); // 在JSP中输出JavaBean的属性值<c:outvalue="${user.name}"default="No UserName"/>
(3)out:计算表达式并将结果输出显示
语法:
转义特殊字符
<p>${ "<a href='http://www.baidu.com'>百度</a>" }</p><p><c:outescapeXml="false"value="<a href='http://www.baidu.com'>百度</a>"/></p><c:outvalue="<a href='http://www.baidu.com'>百度</a>"/>
(4)remove:删除指定范围内的变量
语法:
<!--设置之前应该是空值--><c:removevar="variable"scope="scope"/>设置变量之前的值是:msg=<c:outvalue="${msg}"default="null"/><br/><!--给变量msg设值--><c:setvar="msg"value="Hello World!"scope="page"></c:set>--->使用set标签设置属性<!--此时msg的值应该是上面设置的“HelloWorld!”-->设置新值以后:msg=<c:outvalue="${msg}"></c:out><br/>--->使用out输出属性显示<!--把msg变量从page范围内移除--><c:removevar="msg"scope="page"/>--->使用remove移除属性<!--此时msg的值应该显示null-->移除变量msg以后:msg=<c:outvalue="${msg}"default="null"></c:out>
(5)通用标签的使用
9.条件标签
(1)if:实现Java语言中if语句的功能
语法:
(2)使用if标签判断是否登录
<%pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!--引入标准标签库--><%taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Inserttitlehere</title></head><body><%session.setAttribute("user", "admin"); %><%--使用set设置一个boolean来区分是否登录--%><c:setvar="isLogin"value="${empty user}"></c:set><c:iftest="${isLogin }"><c:outvalue="对象不为空!"></c:out></c:if><c:iftest="${!isLogin }"><c:outvalue="对象为空!!"></c:out></c:if></body></html>
(3)choose:实现if - else if - else语句的功能
<c:choose><c:whentest="condition1">内容1</c:when><c:whentest="condition2">内容2</c:when>……<c:otherwise>内容n</c:otherwise></c:choose>
(4)forEach:实现对集合对象的遍历
(5)forEach:指定迭代的次数
语法:
<c:forEach begin="start" end="end" step= "stepSize"> …循环体代码… </c:forEach>
示例:
<c:forEach begin="1" end="5" step= "2"> <c:out value="*"></c:out> </c:forEach>
(6)使用foreach迭代循环生成表格,并实现表格隔行变色效果
<%pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"import="java.util.*,entity.*"%><%taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>使用foreach进行表格的隔行变色效果</title></head><body><%List<User>list=newArrayList(); list.add(newUser(1, "张三", "123456")); list.add(newUser(2, "张四", "123456")); list.add(newUser(3, "张五", "123456")); list.add(newUser(4, "张六", "123456")); request.setAttribute("list", list); %><tableborder="1"width="800px" ; align="center"><tr><th>编号</th><th>id</th><th>姓名</th><th>密码</th></tr><c:forEachitems="${list}"var="user"varStatus="s"><c:iftest="${s.count %2 ==0 }"><trstyle="background-color: red"><%--<td>${s.count}</td><td>${user.id }</td><td>${user.username }</td><td>${user.password }</td>--%></c:if><c:iftest="${s.count % 2 !=0 }"><trstyle="background-color: green"></c:if><td>${s.count}</td><td>${user.id }</td><td>${user.username }</td><td>${user.password }</td></c:forEach></table></body></html>
10.日期格式获取案例
<%pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><%taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Inserttitlehere</title></head><body><%Map<String, String>map=newHashMap<String, String>(16); map.put("tom", "张三"); map.put("lili", "李四"); map.put("jack", "王五"); request.setAttribute("map", map); request.setAttribute("date", newDate()); %><c:forEachitems="${requestScope.map }"var="name">${name.key} ${name.value}<br></c:forEach><br><fmt:formatDatevalue="${requestScope.date}"pattern="yyyy年MM月dd日 HH:mm:ss"></fmt:formatDate></body></html>
11.总结: