JSTL、EL、OGNL表达式的区别

 

EL表达式:
1.基本格式:${}
2.四种取值范围:pageScope,requestScope,sessionScope,applicationScope
    ${requestScope.user.name}
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,param和paramValues,header和headerValues,cookie,initParam和pageScope,requestScope,sessionScope,applicationScope共十一个
    *pageContext可获取jsp的request,response,out,session,config,servletContext等对象
     ${pageContext.session.uesr}
     header     ${header.host}
     *cookie    ${cookie.key}
OGNL表达式:  
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。  
  1、“#”符号有三种用途:   
   (1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:  

 

 名称

作用 

例子   

parameters包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id") 
request 包含当前HttpServletRequest的属性#request.userName相当于request.getAttribute("userName") 
session包含当前HttpSession的属性#session.userName相当于session.getAttribute("userName")
application 包含当前应用的ServletContext的属性#application.userName相当于application.getAttribute("userName") 


    
注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#this.price<100};构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。  
  
 (2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}    
 books.{?#this.price>35}  
 (3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}    
 #{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:   
 <s:property value="#myMap['foo1']"/>    
 <s:property value="#myMap['foo1']"/>  
  
 2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。  
这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :  
var oDiv = eval_r("document.all.div"+index)    
 var oDiv = eval_r("document.all.div"+index)  
当index变量为1时,语句就会被当作var oDiv = document.all.div1  var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:   
 <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>     
 <s:property value="#myMap['key1']"/>     
 <s:url value="#myMap['key1']" />   
 <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>  
 <s:property value="#myMap['key1']"/>  
 <s:url value="#myMap['key1']"/>   
上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。 如果将第3行改写成这样:  
 <s:url value="%{#myMap['key1']}"/>    
 <s:url value="%{#myMap['key1']}"/>  
则输出为“value1”。  


这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。  


3、“$”有两种用途  
 (1)、在国际化资源文件中,引用OGNL表达式。  
 (2)、在Struts 2配置文件中,引用OGNL表达式:   
 <action name="saveUser" class="userAction" method="save">  
 <result type="redirect">listUser.action?msg=${msg}</result>  
 </action>  
 <action name="saveUser" class="userAction" method="save">      
 <result type="redirect">listUser.action?msg=${msg}</result>  
 </action>


JSTL标签:
     页面需要引入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
     1.JSTL表达式标签:
     <c:out value="${1+1}" default="0"></c:out>
       输出
          属性:value--表示要显示的值;可以是字符串,也可以是EL表达式
                 escapeXml--是否转换特殊字符[默认是true]
                  default--当value中的对象空时的默认显示
      <c:set var="" value="" target="" property="" scope=""></c:set>
       变量赋值
           属性:var--变量名
                 value--值
                 target--目标对象,可以是javaBean,集合对象
                 property--指定到目标对象的属性
                 scope--变量的作用范围[page(默认),request,session,application]
      <c:remove var=""></c:remove>
      移除变量
     <c:catsh></c:catch>
      捕获异常
           属性:var--变量,用于存储异常信息
     2.条件表达式标签:
        <c:if test=""></c:if>
         条件判断      
             属性:test--条件表达式
                  var--变量表示条件表达式的值
                  scope--变量范围
         <c:choose>
              <c:when test="">第一种情况</c:when>
              <c:when test="">第二种情况</c:when>
              .....
              <c:otherwise>其他情况</c:otherwise>
          </c:choose>
       3.循环标签:
         <c:forEach></c:forEach>
          循环
             属性:items--循环类型
                   var--循环变量
                   begin--循环起始位置(从0算起)
                    end--循环结束位置
                   sep--每次循环的步长
                   varStatus--循环状态[索引:index,计数:count,是否是首次循环:first ,是否是末次循环:last]
         <c:forTokens></c:forTokens>
         字符串分割循环
             属性:iterms--循环对象
                   delims--分割字符
                   var--循环变量
                   begin,end,step,varStatus同forEach标签
      4.URL操作标签:
          <c:import url=""></c:import>
           文件导入
              属性:url--被导入资源的路径
                    charEncoding--被导入文件的编码格式
              说明:该标签不仅可导入本站的静态文件还可导入不同站点的资源文件
          <c:redirect url=""></c:redirect
           重定向
          <c:url></c:url>
           生成url地址标签

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值