EL表达式和JSTL表达式

来源:互联网 发布:网络大电影排名 编辑:程序博客网 时间:2024/06/06 07:39

EL:Expression Language(表达式语言)

EL的功能:

替代JSP页面中数据访问时的复杂编码
<!-- EL功能体现:替换小脚本//在JSP中使用Java脚本的局限//在JSP页面中嵌入大量的Java代码//访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换--><%      Employee employee = (Employee) request.getAttribute("employee");    Computer comp = employee.getComputer();    String manufacturer = comp.getManufacturer();%><!-- EL只需要一句,就可以替代java脚本 -->${requestScope.employee.computer.manufacturer}

EL的特点:

自动转换类型 EL得到某个数据时可以自动转换类型 简单易用 

EL的语法:

${ EL expression }

EL的4种取值范围:

pageScope,requestScope,sessionScope,applicationScope
属性范围 EL中的名称 page pageScope request requestScope session sessionScope application applicationScope

注意:

1、${pageScope.username}表示在page作用域查找变量username,找不到返回null2、如果在表达式中不标明作用域,则按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null

EL取值方式:

1、通过变量名取值:

${变量名} 推荐写为:${作用域.变量名}

2、获取对象的属性值:

<%=((User)request.getAttribute("user")).getName() %>①、点操作符:${user.name}②、[]操作符:${user["name"]} //注意中括号里的双引号,如果不写则表示变量名

注意:JavaBean中需要有相应getter方法才能用EL表达式这样取值

3、获取集合元素:

List

// 在Servlet或JSP中保存数据List names = new ArrayList();names.add(0, "LiYang");names.add(1,"WangHua");request.setAttribute("names",names);// 在JSP中访问数据姓名:${ names[0] }<br/>姓名:${ names[1] }<br/>//注意:使用[ ]指定元素下标

Map

// 在Servlet或JSP中保存数据Map names = new HashMap();names.put("one", "LiYang");names.put("two", "WangHua");request.setAttribute("names", names);// 在JSP中访问数据姓名:${ names.one }<br/>姓名:${ names["two"] }<br/>

注意:

1、Map建议使用String做key,如果使用纯数值格式则只能使用长整形
    Map names = new HashMap();    names.put(1L, "LiYang");    names.put("two", "WangHua");    request.setAttribute("names", names);
2、Map中key的类型:
//对于String类型的key${names["two"]}和${names.two}//对于Long类型的key仅可使用${names[1]}

执行表达式

关系操作符、逻辑操作符、empty操作符
关系操作符 说明 示例 结果 ==或者eq 等于 ${23==5}${23 eq 5}
${"a" =="a"}${"a" eq "a"} false
true !=或者ne 不等于 ${23!=5}${23 ne 5} true <或者lt 小于 ${23<5}${23 lt 5} false >或者gt 大于 ${23>5}${23 gt 5} true <=或者le 小于等于 ${23<=5}${23 le 5} false >=或者ge 大于等于 ${23>=5}${23 ge 5} ture

empty操作符

①、若变量 anull,或长度为零的String,或size为零集合,则${ empty a }返回的结果为true

②、${ not empty a }${ ! empty a }返回的结果为false

逻辑操作符 说明 示例 &&或者and 逻辑与 如果A为true,B为false,则${ A && B }或者${ A and B } |或者or 逻辑或 如果A为true,B为false,则${ A || B}或者${ A or B } !或者not 逻辑非 如果A为true,则${ ! A }或者${ not A }

EL隐式对象

1、作用域访问对象

对象名称 说 明 pageScope 与page作用域相关联的Map对象 requestScope 与request作用域相关联的Map对象 sessionScope 与session作用域相关联的Map对象 applicationScope 与application作用域相关联的Map对象

2、参数访问对象

对象名称 说 明 param 按照请求参数名称返回单一值的Map对象 paramValues 按照请求参数名称返回String数组的Map对象

3、JSP隐式对象

pageContext 提供对页面信息和JSP内置对象的访问

开启和关闭EL表达式

1、开启方法

servlet2.4之后默认方法为false,即可以不写或写成<%@ page isELIgnored="false" %>

2、关闭方法

<%@ page isELIgnored="true" %>

3、批量禁用EL的方法

在WEB-INF/web.xml中使用jsp-property-group标签批量禁用el,web.xml中进行如下配置:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="    http://java.sun.com/xml/ns/j2ee     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">    <jsp-config>        <jsp-property-group>            <url-pattern>*.jsp</url-pattern>            <el-ignored>true</el-ignored>        </jsp-property-group>    </jsp-config></web-app>

EL总结:

EL表达式:

1、基本格式:${}

2、4种取值范围:pageScope,requestScope,sessionScope,applicationScope

3、基本运算:.[].用于取属性、[]用于取Array,List,Map,Set

${requestScope.map['apple']}${requestScope.list[1]}

4.花括号内允许的运算:算术运算,关系运算,逻辑运算,empty/not empty空判断

${1+1}${user.age<18}${(user.age>18)&&(user.sex=='男')}${empty user}判断user对象是否为空

5、EL的11个隐含对象:

隐含对象名称 描述 pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) pageScope 代表page域中用于保存属性的Map对象 requestScope 代表request域中用于保存属性的Map对象 sessionScope 代表session域中用于保存属性的Map对象 applicationScope 代表application域中用于保存属性的Map对象 param 表示一个保存了所有请求参数的Map对象 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回string[]数组 header 表示一个保存了所有http请求头字段的Map对象 headerValues 返回string[]数组。如果头里面有-,则需要用到headerValues
例:Accept-Encoding,则要headerValues[“Accept-Encoding”] cookie 表示一个保存了所有cookie的Map对象 initParam 表示一个保存了所有web应用初始化参数的map对象

JSTL:JSP标准标签库(JSP Standard Tag Library)

1、提供一组标准标签2、可用于编写各种动态 功能EL表达式封装了数据访问的功能JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能JSTL通常会与EL表达式合作实现JSP页面的编码

JSTL的环境搭建

1、引入JSTL的jar文件和标签库描述符文件

如果使用MyEclipse,创建web project 时选择 Java EE 5.0或 Java EE 6.0单选按钮,则可集成了JSTL

2、在JSP页面添加taglib指令

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

3、使用JSTL标签

通用标签:

set:设置指定范围内的变量值

1、将value值存储到范围为scope的变量variable中

<c:set  var="variable"  value="value"  scope="scope" />

2、将value值设置到对象的属性中

<c:set  target="target"  property="property"  value="value" />// 在Servlet或JSP中设置JavaBeanUser user = new User(); request.setAttribute("user", user);// 在JSP中修改JavaBean的属性值<c:set target="${user}" property="name" value="defaultName" />

out:计算表达式并将结果输出显示

1、不指定默认值

语法:<c:out  value="value" />

2、指定默认值

语法:<c:out  value="value"  default="default" />// 在Servlet或JSP中设置JavaBeanUser  user = new  User(); request.setAttribute("user",  user);// 在JSP中输出JavaBean的属性值<c:out  value="${user.name}"  default="No UserName" />

3、转义特殊字符

<p>${"<a href='http://www.baidu.com'>百度</a>"}</p><p><c:out escapeXml="false" value="<a href='http://www.baidu.com'>百度</a>" /></p><c:out  value="<a href='http://www.baidu.com'>百度</a>" />//前两个显示百度链接,而第三个则为一串字符串"<a href='http://www.baidu.com'>百度</a>"

注意:

1、<c:out>标签,类似于JSP中的<%=%><c:out>标签可以指定默认值,<%=%>则不能,最好添加默认值

remove:删除指定作用域内的变量

语法:<c:remove  var="variable"  scope="scope" />

例子:

<!-- 设置之前应该是空值 -->设置变量之前的值是:msg=<c:out  value="${msg}"  default="null" /><br/><!-- 给变量msg设值 --><c:set  var="msg"  value="Hello  World!"  scope="page"></c:set><!-- 此时msg的值应该是上面设置的“Hello World!” -->设置新值以后:msg=<c:out  value="${msg}"></c:out><br/><!-- 把 msg变量从page范围内移除--><c:remove  var="msg"  scope="page" /><!-- 此时msg的值应该显示null -->移除变量msg以后:msg=<c:out  value="${msg}"  default="null"></c:out>

if条件标签:

<c:if   test="codition"   var="variable"  scope="scope" >    …</c:if>test属性:判断条件表达式返回true/false var属性:该变量用于保存返回的true/false   scop属性:指定var变量的作用域   

表单1:使用if标签判断是否登录

<c:set var="isLogin" value="${empty sessionScope.user}"/><c:if test="${isLogin}">…登录表单</c:if><c:if test="${! isLogin}">…已经登录</c:if>

when 、otherwise与choose的使用规则

//choose:实现if - else if - else语句的功能<c:choose>    <c:when test="condition1">        内容1    </c:when>    <c:when test="condition2">        内容2    </c:when>    ……    <c:otherwise>        内容n    </c:otherwise></c:choose >

迭代标签:

1、forEach:实现对集合对象的遍历

<c:forEach items="collection" var="varName"  begin="start" end="end" step="stepSize"    varStatus="status">        …循环体代码…</c:forEach>items属性:指定要遍历的集合对象var属性:指定当前成员的引用begin属性:指定从集合的第几位开始end属性:指定迭代到集合的第几位结束step属性:指定循环的步长varStatus属性:用于存放var引用的成员的相关信息,如索引等

2、forEach:指定迭代的次数

<c:forEach  begin="start"  end="end"  step= "stepSize">    …循环体代码…</c:forEach>

3、通过迭代标签显示商品列表,并且隔行变色

// 在Servlet或JSP中准备集合数据List products = GoodsDao.getAllProducts();request.setAttribute("products", products);// 在JSP中展示数据<!-- 循环输出商品信息 --><c:forEach  items="${requestScope.products}"  var="product"         varStatus="status">    <!-- 如果是偶数行,为该行换背景颜色 -->    <tr <c:if test="${status.index % 2 == 1 }">            style="background-color:rgb(219,241,212);"</c:if>>        <td>${product.name }</td>        <td>${product.area }</td>        <td>${product.price }</td>    </tr></c:forEach><!-- 注意对比varStatus的index和count属性的区别 -->

4、通过迭代标签遍历Map

// 在Servlet或JSP中准备数据Map<String, String> map = new HashMap<String, String>();map.put("tom",  "美国");map.put("lily",  "英国");map.put("jack", "中国");request.setAttribute("map",  map);// 在JSP中展示数据<c:forEach  items="${requestScope.map}" var="entry">     ${ entry.key }     ${ entry.value }<p></c:forEach>