Java基础 EL表达式

EL(Expression Language)是JSP2.0引入的一种表达式语言,用于替代jsp中的脚本,简化页面和提高安全性。EL主要作用包括获取域数据、执行运算、获取web常用对象和调用java方法。它可以方便地访问page、request、session和application域中的数据,支持处理数组、集合和Map等复杂数据类型,并提供了算术、关系、逻辑运算以及三目运算符。EL内置11个对象,如param、header等,同时与JSTL结合能实现更多功能。JSTL是jsp标准标签库,包含多个标签库,其中core标签库中的forEach标签常用于循环操作。
EL表达式
EL表达式介绍
什么是EL表达式?
EL是expression Language的缩写,它是jsp内置的一种表达式语言,从jsp2.0开始,就不让在使用java脚本,而是使用el表达式来替换jsp中java脚本。
El表达式格式  ${表达式}
使用el表达式的主要敘是代替jsp页面上的<%=%>,也就是说,el表达式主要作用是向浏览器输出数据,例如${1+2} 会浏览器输出3.
 
为什么使用el表达式
       主要目的是为了替换jsp页面上的脚本,使用jsp更加简单,安全。
       EL主要作用:
1.     获取数据(主要是域中数据)
2.     执行运算
3.     获取web常用对象
4.     调用java方法(EL函数)
 
El表达式使用时注意事项
EL表达式是在jsp2.0规范中的一门技术,要想使用el表达式必须使用支持jsp2.0技术的web服务器(tomcat)
Jsp2.0对应的servlet版本是servlet2.4 对应 javaEE1.4.
而我们现在使用的servlet版本是servlet2.5  javaEE5.0
如果在程序中发现el不可以使用:
1.     tomcat是否版本有问题,使用tomcat6以上
2.     在jsp页面上是否设置了isELIgnored="true"
 
El表达式获取数据
El表达式怎样获取域中数据
1.     page域----------------------${pageScope.name}
2.     request域----------------------${requestScope.name}
3.     session域----------------------${sessionScope.name}
4.     application域----------------------${applicationScope.name}
使用el表达式获取时,如果没有查找到结果,返回的不是null,而是一个””.
 
1.     获取域中简单数据
El表达式获取复杂数据
<%@page import="cn.itcast.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 
<title>My JSP 'index.jsp' starting page</title>
</head>
 
<body>
       EL获取域中复杂数据
       <hr>
       <%
              //定义一个数组
              String[] st = { "aa", "bb", "cc" };
              request.setAttribute("st", st);
       %>
       获取request域中st数组第二个值:
       <br> jsp:<%=((String[]) request.getAttribute("st"))[1]%><br>
       el:${requestScope.st[1]}
 
       <hr>
       <%
              //定义一个集合List
              List<String> list = new ArrayList<String>();
              list.add("111");
              list.add("222");
              list.add("333");
              request.setAttribute("list", list);
       %>
       获取request域中list集合中第二个值:
       <br> jsp:<%=((List<String>) request.getAttribute("list")).get(1)%>
       <br> el:${requestScope.list[1]}
 
       <hr>
       <%
              //定义一个Map集合
              Map<String, String> map = new HashMap<String, String>();
              map.put("one", "aaa");
              map.put("two", "bbb");
              request.setAttribute("map", map);
       %>
       获取request域中map集合key=two的value值
       <br> jsp:<%=((Map<String, String>) request.getAttribute("map"))
                                   .get("two")%>
       <br> el:${requestScope.map.two }
 
       <hr>
       <%
              //向request中存储一个javaBean
              User user = new User();
              user.setUsername("tom");
              user.setPassword("123");
              request.setAttribute("user", user);
       %>
       获取requst域中user对象的username属性值
       <br> jsp:<%=((User) request.getAttribute("user")).getUsername()%><br>
       el:${requestScope.user.username}
       <br>
 
       <hr>
       在el中使用"."与[]可以实现同样的效果:
       <br> ${user["username"]}
       <br> ${user.username}
       <br> 问题:.与[]有什么区别?
       <br> 注意:如果名称中不包含特殊符号,那么.与[]一样,但是如果名称中包含了特殊符号,那么我们就只能使用[]
       <br>
       <%
              request.setAttribute("login.msg", "用户名或密码错误");
       %>
       <br> ${requestScope.login.msg }
       <br> ${requestScope["login.msg"] }
 
       <hr>
       关于[]中名称如果不使用引号引起有什么问题?
       <br>
       <%
              request.setAttribute("username", "fox");
              request.setAttribute("fox", "这是一个好人");
       %>
       <br>
       ${requestScope["username"]}<br>
       ${requestScope[username]}
</body>
</html>
 
EL执行运算
在el表达式中可以使用运算符来进行操作
1.     算术运算符 + - * /(div)  %(mod)
对于算术运算符注意+,它永远执行的就是加法运算。
 
2.     关系运算符  >(gt) >=(ge) <(lt) <=(le) == (eq) !=(ne)
执行关系运算它得到的结果就是boolean
3.     逻辑运算符
&&(and)  ||(or)  !(not)
执行逻辑运算得到的结果也是boolean
 
4.     三目运算符
(表达式1)?(表达式2):(表达式3)
它与java中的三元运算符一样。
 
5.     empty
                 i.          如果是一个普通对象,它判断对象是否为null,如果为null返回true.否则返回false.
                ii.          如果是一个容器(数组或集合),它不仅判断对象是否为null,还判断是否有元素。
 
El获取web常用对象
       主要是通过el内置对象来操作,它一共有11个内置对象
       pageScope  requestScope  sessionScope  applicationScope
      
       以下两个可以用于获取请求参数:
       param:获取一个Map<String,String> key就是请求参数名称,value是值
       paramValues:获取一个Map<String,String[]>它与request.getParameterMap()结果一样。
 
       header:获取一个Map<String,String>它封装的是所有的http请求头信息
       headerValues:获取一个Map<String,String[]>它封装的是所有的http请求头信息
 
       initParam 获取一个Map<String,String>它封装了所有的全局初始化参数
 
cookie:获取一个Map<String,Cookie> 它封装了所有的http请求的中cookie信息,key就是cookie的名称,value就是这个cookie对象。
      
       pageContext 它与jsp页面上内置对象pageContext一样。
       我们在el中使用pageContext一般使用:
       ${pageContext.request.contextPath}
      
      
El函数
       Jstl标签库,在jstl标签库中有已经定义好的一些EL函数。
       EL函数它的本质是调用了一个java类的方法。
       在jsp页面上要使用EL函数必须导入jstl标签库。
      
在jsp页面上就可以使用el函数,例如
 
注意:如果在开发中,我们使用的不是myeclipse,那么我们在使用el函数时,必须导入jstl的jar包。因为我们使用的是myeclipse,它会默认导入javaee5.0的库,在这个库中包含了jstl标签库的jar文件,所以不用导入了。

JSTL标签库
JSTL介绍
JSTL(jsp standard tag Library) jsp标准标签库,它是apache对el表达式的扩展,jstl与el结合可以完成更强大的功能。
JSTL它是一种标签语言,它不是jsp内置标签,所以在使用JSTL需要导入相关的jar包。但是我们使用myeclipse开发,在创建web project时,会导入javaee5.0的类库,它已经包含了JSTL标签jar包所以我们不需要导入了,但是如果你使用的不是myeclipse,那么在使用jstl标签时,需要手动导入JSTL标签库。
注意,我们使用JSTL1.0版本以上才支持在JSTL中使用el表达式。
 
JSTL它的作用:
1.     core 核心标签库,重点学习
2.     fmt 格式化标签库,不使用,简单介绍
3.     sql 数据库标签库,过时不使用
4.     xml xml标签库,过时不使用
5.     jstl中包含了el函数库。
 
怎样在jsp页面上使用jstl标签:
1.     导入jstl的jar包
2.     在jsp页面上使用taglib指令来导入jstl
注意:没有jsp的是jstl1.0版本,它不支持el表达式,我们要使用带jsp,它是jstl1.0以上版本,支持el表达式。
3.     在jsp页面上使用jstl标签。
 
重点学习jstl的core标签库。
 
Jstl中核心标签
       一共有12个标签
1.     out
2.     set
3.     remove
4.     catch
5.     if
6.     choose when otherwise
7.     forEach(重要)
它的主要作用是用于循环操作。
简单使用
介绍c:forEach基本使用1
<br>
<c:forEach begin="1" end="10" var="n" step="1">
      ${n}<br>
</c:forEach>
<%--
      上述代码相当于是
      for(int n=1;n<=10;n++){
             out.println(n);
      }
      begin:循环开始变量
      end:循环结束变量
      var:定义一个变量,用于接收循环
      step:步长
     --%>
 
<hr>
介绍c:forEach基本使用2
<br>
<c:forEach begin="1" end="10" var="n" step="1" varStatus="vs">
      ${n}--${vs.count }--${vs.index}--${vs.first}--${vs.last}--${vs.current}<br>
</c:forEach>
<%--
        varStatus它是用于记录循环状态,它是一个对象,可使用的属性有
        count:用来记录循环的元素的个数
        index:用来记录所循环的容器中的元素的下标
        first:判断当前是否是第一个元素
        last:判断当前是否是最后一个元素
        current:代表当前循环的元素
 --%>
高级使用
c:forEach高级使用:
    <hr>
    <h1>遍历数组</h1>
    <%
           String[] st = { "aaa", "bbb", "ccc" };
           request.setAttribute("st", st);
    %>
    <c:forEach items="${st}" var="s" varStatus="vs">
           ${s}---${vs.index }<br>
    </c:forEach>
    <%--
           items:用于接收一个容器
           var:它是用于接收从容器中迭代出来元素
           上面代码相当于增强for循环
           for(String s:st){
           }
          
     --%>
    <hr>
    <h1>遍历List集合</h1>
    <%
           List<String> list = new ArrayList<String>();
           list.add("111");
           list.add("222");
           list.add("333");
           request.setAttribute("list", list);
    %>
    <c:forEach items="${list}" var="n">
           ${n}<br>
    </c:forEach>
   
    <hr>
    <h1>遍历Map集合</h1>
    <%
           Map<String,String> map=new HashMap<String,String>();
           map.put("one", "111");
           map.put("two", "222");
           request.setAttribute("map", map);
    %>
    <c:forEach items="${map}" var="entry">
           ${entry.key}--${entry.value}<br>
    </c:forEach>
   
    <%--
           对map集合遍历,它相当于是使用entrySet()方法遍历
          
           Set<Map.Entry<String,String>> entry=map.entrySet();
           for(Map.Entry<String,String> me:entry){
                  me.getKey()  me.getValue():
           }            
     --%>
 
8.     forToken
9.     import
10.   url ----param
11.   redirect
 
Jstl核心标签案例-显示商品信息
1.     创建一个Product类
类中有以下属性
2.     创建一个test.jsp页面
在页面上显示商品信息
生成数据
展示数据
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值