EL表达式
EL表达式学习
1.什么是EL表达式
全称:Expression Language.一种写法非常简洁的表达式。语法简单易懂,便于使用。表达式语言的灵感来自于ECMAScript和XPath表达式语言。
2.EL表达式的作用
作用:让jsp书写起来更加的方便。简化在jsp中获取作用域或者请求数据的写法。也会搭配Jstl来进行使用。
3.使用EL表达式
语法结构:${expression}:提供 . 和 [] 两种运算符来存取数据。
使用:
a)使用EL表达式获取请求数据
- 获取用户请求数据(请求实体)
${param.键名}获取请求实体中一个键一个值的数据
${paramValues.键名}获取请求实体中同键不同值的数据,返回的是String数组,可以使用角标直接获取 例如:爱好
- 获取请求头数据
${header}返回所欲的请求数据,键值对形式
${header['键名']}返回指定的键的请求头数据
${headerValues[‘键名’]}
- 获取cookie数据
${cookie}获取所有cookie对象 键值对
${cookie.Cookie对象的键名} 获取了指定cookie数据的cookie对象
${cookie.Cookie对象的键名.name}获取存储了指定cookie数据的cookie对象的存储的键
${cookie.Cookie对象的域名.value}获取存储了指定cookie数据的cookie对象存储的值
b)使用EL表达式获取作用域数据
作用域对象:pageContext request session application
获取作用域数据:我们使用setAttribute方法存储的数据
获取:
普通字符串数据 ${键名}
对象数据 ${键名.属性名}
集合数据
list集合 ${键名[角标]}
Map集合 ${map集合作用域键名。map集合存储的数据的键名}
作用域查找顺序: 如果找到了则不再查找,如果找不到,则继续查找下一个作用域,如果四个作用域中都没有则什么都不显示。
pageContext---->request---->session--->application
指定作用域取数据:
${pageScope.键名} 指明获取pagecontext作用域中的数据
${requestScope.键名}指明获取request作用域中的数据
${sessionScope.键名}指明获取session作用域中的数据
${applicationScope.键名}指明获取application作用域中的数据
${cookie.user.username}
c)使用EL表达式运算
算术运算:+ - * / 在EL表达式中可以直接进行算术运算
关系运算: && || !
${逻辑表达式}
注意:没有单&单|
比较运算:== != >, >=, <,<=
${比较表达式}
三目运算符:
${条件?值:值}
d)EL表达式空值判断empty
${empty 键名}
作用:
判断该键是否存储有效数据。
<%@ page language="java" import="java.util.*,wq.pojo.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- 将流转数据显示到浏览器中,使用传统的方式 --> <%=request.getAttribute("str")%><br> <%=((User)request.getAttribute("user")).getFav()%><br> <%=((ArrayList)request.getAttribute("list")).get(2)%><br> <%=((User)((ArrayList)request.getAttribute("list")).get(3)).getFav()%><br> <%=((HashMap)request.getAttribute("hs")).get("b1")%><br> <%=((User)((HashMap)request.getAttribute("hs")).get("c1")).getFav()%> <hr> ${str}<br> ${user.fav}<br> ${list[2]}<br> ${list[3].fav}<br> ${hs.b1}<br> ${hs.u.fav}<br> <hr> <h3>获取请求实体数据(请求实体)</h3> <%=request.getParameter("uname")%>---${param.uname}<br> <%=request.getParameterValues("fav")[1]%>--${paramValues.fav[1]}<br> <%=request.getHeader("User-Agent")%>---${header["User-Agent"]}--${headerValues["Accept-Language"][0]}<br> <h3>获取cookie数据</h3> ${cookie}<br> ${cookie.name}<br> ${cookie.JSESSINI.name}--${cookie.JSESSIONID.value} <h3>EL获取作用域数据时作用域的查找顺序</h3> <% pageContext.setAttribute("hello", "hello pageContext"); request.setAttribute("hello","hello rquest"); session.setAttribute("hello", "hello session"); application.setAttribute("hello", "hello application"); %> ${requestScope.hello}--${a} <h3>EL表达式的逻辑运算</h3> <% request.setAttribute("a", "2"); %> ${1+2}---${2*3}--${a+3}---${1+"5"} ${2>3&&4<5}---&{2>3||4<5}--${!(2>3)} ${2==2}---${3>2}<br> ${2>3?"男":"女"} <h3>EL表达式的empty</h3> <% request.setAttribute("str", ""); User u=new User(); request.setAttribute("name", u); ArrayList la=new ArrayList(); request.setAttribute("la", la); %> ${empty str}<br> ${u}<br> ${la}<br>
JSTL标签库
1.什么是jstl标签库
- jstl是apache对EL表达式的扩展(也就是jstl依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与jsp动作标签一样,只不过他不是jsp内置标签,需要我们自己导包,以及指定标签而已。
- 如果你使用MyEclipse开发javaWeb,那么在把项目发布到tomcat时,你会发现,myeclipse会在lib目录下存放jstl的jar包!如果你没有使用myeclipse开发那么需要自己来导入这个jstl的jar包:jstl-1.2.jar
2.JSTL标签库的作用
- 用来提升在jsp页面的逻辑代码的编码效率,使用标签来代替逻辑代码的直接书写,高效,美观,整洁,易读。
3.使用JSTL标签库
a)内容:
- i.核心标签库(学习)(学习)
- ii.格式化标签库
- iii.函数标签库
- iv.XML标签库
- v.SQL标签库
b)使用:
i.导包
ii.使用taglib标签引入资源
iii.核心标签库。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
内容:
out标签:<c:out value="${表达式}" default="默认值" ></c:out>
作用:结合EL表达式将数据响应给浏览器。如果EL表达式没有取到数据则可以使用default属性声明默认值。
set标签: <c:set value="数据" var="键名" scope="作用域名"></c:set>
作用:将数据存储到指定的作用域中,默认值pageContext作用域
remove标签:<c:remove var="要删除数据的键名" scope="作用域名"/>
作用:删除作用域中的数据,默认是删除四个作用域中符合要求的数据。
但是可以通过scope属性指明要删除的作用域数据
注意:
使用pageContext.removeAttribute("键名"); 此方法将四个作用域中符合的数据都会删除
使用pageContext.removeAttribute(String name,int scope);
要删除的作用域中的数据scope的值为1.pageContext,2.request,3.session,4.application
使用request.removeAttribute("键名"); 删除当前作用域中符合要求的数据
使用session.removeAttribute("键名"); 删除当前作用域中符合要求的数据
使用application.removeAttribute("键名");删除当前作用域中符合要求的数据
逻辑标签:
单分支判断标签:<c:If test="${表达式}">数据</c:if>
作用:可以根据el表达式进行一定程度的单分支逻辑判断。
注意:
test属性中书写的是EL表达式,或者说是EL表达式。
该标签只能进行EL表达式相关的逻辑判断,不能进行EL表达式不能获取的数据的逻辑处理。
多分支判断标签:
<c:hoose>
<c:when test="${表达式}"><c:when>
<c:when test=" ${表达式}"><c:when>
..
<c:otherwise></c:otherwise>
注意:
符合条件后执行一个分支,其他分支不会执行。
循环标签:
<c:foreach>
循环体
</c:foreach>
属性:
begin:声明循环的开始位置
end:声明循环的结束位置
step:声明循环的步长
varStatus:声明变量记录循环状态,例如变量:i
注意:记录的数据存储到作用域中可以直接使用EL表达式进行获取
实例:${i.index} 获取当次循环的下标
${i.count} 获取当次循环的次数
${i.first} 判断是否第一次循环
${i.last}判断是否是最后一次循环
items:声明要遍历的数据,可以是集合和数组等
注意:要使用EL表达式来获取
var:声明变量记录每次遍历的结果。可以做循环体中使用EL表达式获取遍历出来的数据。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setAttribute("str", "jstl"); %> <%request.setAttribute("str1","jstl学习");%> -----------${str1} --------------<c:out value="${str2}" default="404"></c:out> <hr> <!-- set标签学习 --> <% request.setAttribute("s1", "set标签学习"); %> <c:set value="set标签学习2" var="s2" scope="request"></c:set> <c:set value="hello pageContext" var="hello" scope="page"></c:set> <c:set value="hello request" var="hello" scope="request"></c:set> <c:set value="hello session" var="hello" scope="session"></c:set> <c:set value="hello application" var="hello" scope="application"></c:set> ${s1}---${requestScope.s2}---${pageScope.hello} <br> ${hello} <hr> <!-- remove标签学习 --> <%-- <c:out value="${hello}"></c:out> --%> <% pageContext.removeAttribute("hello"); request.removeAttribute("hello"); %> ${pageScope.hello} ${hello} <hr> <!-- 单分支判断标签 --> <c:set var="a" value="12"></c:set> <% int a=Integer.parseInt((String)pageContext.getAttribute("a")); if(a>8){ %> <b>今天天气真好,适合学习1</b> <% } %> <c:if test="${a>8}"> <b>今天天气真好,适合学习2</b> </c:if> <hr> <!-- 多分枝逻辑判断 --> <c:set var="scope" value="100"></c:set> <c:choose> <c:when test="${scope>=90}"> <i>苹果</i> </c:when> <c:when test="${scope>=70&&score<80}"> <i>苹果</i> </c:when> <c:when test="${scope>=80&&scope<70}"></c:when> <c:otherwise> <i>男女混合双打</i> </c:otherwise> </c:choose> <br> <hr> <!-- 循环标签 --> <c:forEach begin="0" end="5" step="1" varStatus="i"> <c:if test="${i.count==3}"> <u>我是第三次循环</u> </c:if> 111111-${i.index}--${i.count}---${i.first}---${i.last}<br> </c:forEach> <!-- 循环标签遍历集合 --> <% //创建测试数据list ArrayList<String> list=new ArrayList<String>(); list.add("苹果"); list.add("榴莲"); list.add("荔枝"); request.setAttribute("list", list); %> <c:forEach items="${list}" var="s" varStatus="i"> ${s}--${i.index}---${i.count}<br> </c:forEach> <!-- 遍历map集合 --> <% //声明map集合测试数据 HashMap<String,String> hs=new HashMap<String,String>(); hs.put("s1", "唱歌"); hs.put("s2", "跳舞"); hs.put("s3", "敲代码"); //将数据存储到作用域中 request.setAttribute("hs", hs); %> <c:forEach items="${hs}" var="s"> ${s.key}---${s.value}<br> </c:forEach>