EL、OGNL、JSTL和struts标签的区别

 (一)JSTL来源:
       我们使用JSP开发信息展现非常方便,也可嵌入java代码用来实现相关逻辑,但同样带来了很多问题:
              jsp维护难度增加
              出事提示不明确,不容易提示
              分工不明确等
       解决上面的问题可以使用定制标签库,Jstl使JSP开发开发者可以减少对脚本元素的需求,甚至可以不需要它们。
 
    定义
       JSTL(JSP StandardTagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat4.x。在JSP 2.0中也是作为标准支持的。

    使用方法
       引入jar包:jstl.jarstandard.jar
       引入标记库:<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
       2.5版本需要加入:<%@page isELIgnored="false"%>  不忽略EL表达式

 
    表达方式

  • JSTL核心库 [基本的I/O, 流程控制, 循环 等功能]   
  • 数据库标签库 [基本的数据库操作功能]   
  • XML操作标签库 [用来处理XML文档]   
  • 国际化和格式标签库   
  • 函数标签库   

     如:<c:out></c:out>、<c:set></c:set>
 
  实例 
       单纯的jsp中嵌入java代码:jsp语法与html标签混用,非常的混乱。      

  1. <span style="font-family:KaiTi_GB2312;font-size:14px;">   
  2. <span style="font-size:18px;">
  3. <%names = request.getAttribute("name");%>  
  1.     jsp代码  
  1.     <%for(int i=0;i<names.length;i++){  
  1.               String name=names.get(i);  
  1.     %>  
  1.     <tr>  
  1.         <td><%= name%></td>  
  1.     </tr>  
  1.   
  1.         <% }%></span></span>  

  
   引入Jstl与EL:在jsp语法中引入jstl和EL可以简化jsp的书写,更加的方便 

例如:

         以前编写jsp代码时,如果要获取表单中的用户名,一般使用  <%=request.getParameter("name")%> ,这样当然也可以获取到值,但是又把html代码和java代码混到一起,看起来比较乱套。现在使用EL表达式的话就比较简洁了:${param.name} 就可以解决了。
         注意:${表达式} 表达式部分不需要加引号,如果写成 ${"param.name"} ,那么页面上显示出来的就不是表单中name的值了,而是 "param.name" 这个字符串。表达式与开始符和终结符之间的空格被忽略不计。如果表达式的值为null,那么页面将显示一个空格而不是null。

        

 

 

 

  1. <span style="font-family:KaiTi_GB2312;font-size:14px;">  
  2.  <c:forEach var='name' items='${names}'>//此句是Jstl表达式  

 

  1.     <tr>  
  1.         <td>  
  1.                  ${name}//此句是El表达式  
  1.         </td>  
  1.     </tr>  
  1. </span>  

    作用
      1、在应用程序服务器之间提供了一致的接口,最大程度地提高了WEB应用在各应用服务器之间的移植。
      2、 简化了JSP和Web应用程序的开发。
与EL关系
      jstl是JSP标签,有点像html的标签,JSTL一般配合EL使用。jstl用来取值,而el用来展示。el也可直接取值展示作用域里对象变量。

jstl标签是为了解决EL表达式不能循环取出集合对象的问题,是建立在EL表达式基础上的语言,两者之间是互通的,

实例:<c:forEach var="item" items="${webFrameworkList}">${item}</c:forEach>
 
二、EL
     来源
       大家熟知的 Hibernate,使用HQL(Hibernate Query Language) 来完成数据库的操作,HQL 成了开发人员与复查的 SQL 表达式之间的一个桥梁。 在 web框架下,表达式语言起到了相似的目的。它的存在消除了重复代码的书写,使JSP写起来更加简单。
定义
       EL全名为ExpressionLanguage,它原来是JSTL1.0为了方便存取数据所定义的语言。到了JSP2.0以后,EL正式纳入成为标准规范之一。只要是支持Servlet2.4/JSP2.0的Container,都可以在JSP网页中直接使用EL。
 
    表达方式
     ${ ELexprission }
         两种形式:${bean.name } 或 ${ bean['name'] }

 
    实例
       两种运算符存储数据.和[]
             ${user.userName}
             ${user["userName"]}
        当要存取的属性名称中包含特殊字符
         如:${user.My-Name}因改为${user["My-Name"]}
         如果动态取值时,就可以用[]来做
         如:${user.list[0]}
    
      作用
            获取数据
                 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象,获取数据${map.key}
            执行运算
                  利用EL表达式可在JSP中执行一些基本的关系运算、逻辑运算和算数运算,以在JSP页面中完成一些简单操作
            获取web开发常用对象
                    EL表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松的获得对web常用对象的引用,从而获得这些对象中的数据(pageScope/pageContext)
                    常用对象:param、paramValues、
           调用Java方法
                  EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法
 
      寻找方式
          ${username}依次从Page、Request、Session、Application范围查找,找到后直接回传,如果全部范围都没有找到时就回传“”(不是null,而是空字符串)
 
       隐含对象
          pageScope、requestScope、sessionScope和applicationScope  等同于JSP中pageContext、request、session和application,这四个隐含对象只能用来获取范围属性getAttribute(Stringname)
    特点:
         如果在struts环境中,它除了有在上面的四个作用域的取值功能外,还能从值栈(valuestack)中取值.
         特点1:${name},name在值栈中的查找顺序是:先从对象栈中取,取到终止,否则,向map中取。
         特点2:在对象栈的查找顺序是,先从model中找是否有name这个属性,找到终止,否则,找action中是否有name这个全局变量。
         特点3:${#name},里面的是不带#号的。
         特点4:如果放在对象栈中的是一个自定义的对象,那么${property}里面可以直接去该对象的属性值,不用这样${object.property}
        注:EL表达式,需要引入JSTL标记库,因为Jsp把EL表达式加入时放在jstl中定义的  
 
三、ONGL
     Struts2的OGNL表达式主要涉及#%$三个特殊符号。这里我们需要强调的是实际上OGNL的范畴中只有#%两个特殊符号,而$并不属于OGNL。这是许多OGNL资料中造成误解的主要地方。
    %   将字符串变量的值按照OGNL表达式解析。也就是说字符串中#将按照特殊字符处理,仅此作用。 

其实非常简单以javaBean的getter/setter访问规则取到的对象就是栈顶顶节点,而非栈顶节点就是非顶节点。 

OGNL巧妙的用#符号标识了顶节点和非顶节点,如上述所说顶节点可不写#而且必须不写,非顶节点必须写#; 

使用OGNL时我们仅需要记住一点集合属性或集合元素都要使用# 。


     定义
        OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,OGNL是一个开源项目,读者可以访问其官方站点以获得源代码和相关资料。OGNL是一种功能强大的EL(Expression Language,表达式语言),可以通过简单的表达式来访问Java对象中的属性。
        webwork2和现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和model层某个类的某个属性绑定在一起,修改和显示自动同步。
     表达方式
       1、读取从后台传递的值
             %{#name}:表示从值栈的map中取值
             %{name}:表示从值栈的对象栈中取值
             %{#request.name}:表示从request域中取值

struts2 OGNL的查找范围为OGNL context和ActionContext。

其中parameters,request,session,application属于OGNL context范畴,

而valuestack属于ActionContext范畴。 

 

       (1).ValueStack即值栈对象
       ValueStack实际是一个接口,在Struts2中利用Ognl时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用Ognl的基础
       (2).ValueStack特点
       ValueStack贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个ValueStack对象),即用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象,然后把Action对象放入值栈中;最后再把值栈对象放入request中,传入jsp页面。相当于一个数据的中转站,在其中保存当前Action对象和其他相关对象。Struts2框架把ValueStack对象保存在名为“struts。valueStack”的request请求属性中。

(3)ValueStack存储对象

代码调试的时候,发现有一个root是compundRoot类,继承ArrayList,保存的是action对象;还有一个OgnlContext是继承Map,保存数据。
所以ValueStack存储对象时是分两个地方来存的,也即ValueStack对象的组成是由List栈和Map栈构成的:
ObjectStack:Struts把根元素,即action对象及全局属性存入ObjectStack中---List

list栈主要存储:action对象,Map对象(通过vs.set()设置),通过push方法设置的对象,以及其他代理对象

根元素的存储示例:


        //存储值栈对象
        ActionContext ac = ActionContext.getContext();
        
        ValueStack vs = ac.getValueStack();
        vs.set("user1",new User(100,"Jack1"));//Map
        vs.push(new User(100,"Jack2"));//栈顶

ContextMap:Struts把各种各样的映射关系(域数据)存入ContextMap中
Struts会把下面这些映射存入ContextMap中:

  • parameter:该Map中包含当前请求的请求参数
  • request:该Map中包含当前request对象中的所有属性
  • Session:该Map中包含当前Session对象中的所有属性
  • application:该Map中包含当前application对象中的所有属性
  • attr:该Map按如下顺序来检索某个属性:request,Session,application
    非根元素Map中存放数据的方法示例:

    
        //存储值栈对象
        ActionContext ac = ActionContext.getContext();
    
        //映射数据
        ac.getContextMap().put("request_data", "request_data");
        ac.getSession().put("session_data", "session_data");
        ac.getApplication().put("application_data","application_data");

从栈中取值的两种方式:


    //一、获取值栈对象的两种方式,是等价的
    public void getVs() {
        //获取值栈对象,方式1:
        HttpServletRequest request = ServletActionContext.getRequest();
        ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");


        /**************************************************/
        //获取值栈对象,方式2:
        ActionContext ac = ActionContext.getContext();
        ValueStack vs2 = ac.getValueStack();

        System.out.println(vs1==vs2);//true
    }

在jsp页面中,对不同ValueStack中的不同类型取值方法不同,
如果是根元素取值,直接写表达式;
非根元素(request,Session,application,att,parmeters)必须用#号,例#request.cn


       2、自己构建数据
             a,构建Map<s:iterator var="map"value="#{'key1':'value1','key2':'value2'}"/>
             b,构建List<s:iterator var="list"value="{'one','two','three'}">
      作用
         通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。
 
     三种符号
         1、#符号
           1)访问非根对象属性,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext();
           2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
           3)用来构造Map,例如示例中的#{’foo1′:’bar1′,’foo2′:’bar2′}。
          2、%符号
           %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:构造Map

  1. <span style="font-family:KaiTi_GB2312;font-size:14px;"><span style="font-size:18px;">s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />    
  1.   
  1. <p>The value of key “foo1″ is <s:property value=”#foobar['foo1']” /></p>    
  1.   
  1. <p>不使用%:<s:url value=”#foobar['foo1']” /></p>    
  1.   
  1. <p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>  </span></span>  

         3、$符号(两方面)
                 在国际化资源文件中,引用OGNL表达式
                 在Struts 2框架的配置文件中引用OGNL表达式
 
       既然有了EL为什么还需要ONGL?
       相对于其它的表达式语言而言,ONGL的功能更为强大,它提供了很多高级而必须的特性,例如强大的类型转换功能,静态或实例方法的执行,跨集合投影,以及动态lambda表达式定义等
 
与EL区别
     1、用法区别
        OGNL是通常要结合Struts 2的标志一起使用,如<s:property  value="#xx" /> struts页面中不能单独使用,el可以单独使用 ${sessionScope.username}
    2、取值      ognl是在webwork2.0和struts2.x中取代el的。 
      使用ognl ,struts2就无需将对象手动放值进request等范围,页面直接取值。
    3、js中的使用情况
       EL表达式能用在内部文件的js里(jsp被解释时,内部文件的js代码也被解释,然后发送到客户端,而外部js文件是在客户端执行的,所以EL表达式不能用在外部js文件里)
       ONGL只能结合struts2一起使用,不能单独使用ONGL表达式
    共同点:EL和OGNL都是表达式
  
     ONGL与JSTL区别
        ognl是struts2特有的表达式,jstl是标签库,比如c标签,用来前台页面的变量的定义、作用域里的变量对象的取值等。
 
四、Struts标签
       定义
       Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。
Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于任何表现层技术,也就是说strtus2提供了大部分标签,可以在各种表现技术中使用。包括最常用的jsp页面,也可以说Velocity和FreeMarker等模板技术中的使用。

 

<span style="color:#ff0000">在struts2字符串中用%{}指出,其内部是一个ognl表达式,需要解析。
如<s:textfield lable="user" name="user" value="%{#session.user}" />

不过有些标签默认认定,整个字符串就是一个表达式,所以不用%{}
如<s:property value="#session.user" />

在非struts2标签中,是不能用%{}的,可以用以下方法
<input name="user" value="${session.user}" />,这是el表达式。
<input name="user" value="<s:property value='#session.user' />" />,这是struts2表达式嵌套用法。

但是注意,不能在struts2标签中的字符串中,再次嵌套struts2标签。
如<s:textfield lable="user" name="user" value="<s:property value='#session.user' />" />
也不能在struts2标签中用el表达式,
如<s:textfield lable="user" name="user" value="${session.user}" /></span>


        
        引入标签库:  <%@taglib uri="/struts-tags" prefix="s"%>
        在web.xml中声明要使用的标签    

  1. <span style="font-size:14px;"><filter>  
  1.   
  1.      <filter-name>struts2</filter-name>  
  1.   
  1.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  1.   
  1. </filter></span>  

 
      表达方式
            控制标签:(if, elseif,else, iterator, append, merge, generator, subset, sort)
            数据标签:(bean, param,date, debug, include, set, url, push
          
     实例   

  1. <span style="font-size:14px;">   
  2.  1、jstl中使用struts2标签  
  1.   
  1.        <c:forEach var="ee" items="${requestScope.serviceList}" >    
  1.   
  1.            JSTL:<c:out value="${ee.id}"></c:out>    
  1.   
  1.            EL:${ee.id}     
  1.   
  1.            struts2: <s:property value="#attr.ee.id"/>  </span>  
  1.   
  1.         </c:forEach>    
  1.   
  1.        
  1.      2、jstl中取值  
  1.   
  1.         <c:set var="ctime" value="${el.createtime}" scope="request"/>    
  1.   
  1.         <c:set var="ctime2" value="${el.createtime}" />    
  1.   
  1.         <s:property value="#request.ctime"/>    
  1.   
  1.         <s:property value="#attr.ctime2"/>    
  1.   
  1.   
  1.       3、struts2标签中使用jstl  
  1.   
  1.       <s:iterator value="#request.serviceList" id="bs">    
  1.   
  1.            struts2:<s:property value="#bs.keyid"/>    
  1.   
  1.            EL:${bs.keyid}     
  1.   
  1.            JSTL:<c:out value="${bs.keyid}"></c:out>    
  1. </span>  
  1.       </s:iterator>    
  1.   
  1.   
  1.       4、struts2中取值  
  1.   
  1.         <!-- 字符串类型 -->     
  1.   
  1.         <s:set name="pp2" value="'abc'" scope="request"></s:set>    
  1.   
  1.              struts2标签结合OGNL表达式:<s:property value="#request.pp2"/>                     其中#request.pp2为ognl表达式   
  1.   
  1.              JSTL标签结合EL表达式:<c:out value="${pp2}"></c:out>   </span>  
  2.      其中${pp2}为EL表达式


与ONGL的关系
        Struts2默认的表达式语言是OGNL
 
总结:
        jstl和struts标签是一类产品,struts标签提供了更多的功能,并且struts标签依赖于Struts框架
        EL和ONGL都是表达式,ONGL为Struts的默认表达式。ONGL比EL更加强大

                   OGNL实际上最终发挥作用的是#,而%按照字符串转换#(省略#是顶节点),${}是传统的EL表达式 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位远方的诗人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值