• Struts2 之 ognl


    OGNL表达式语言(#号的用法)

      用法1:访问OGNL上下文和Action上下文,#相当ActionContext.getContext()
        1、  如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀

        

            也可写为#request[‘userName’]或#session[‘userName’]或#appliction[‘userName’]

       2 、OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象的属性即可

        

    1 Action中代码: 
    2   ValueStack valueStack=ServletActionContext.getContext().getValueStack();
    3   valueStack.set("msg", "msg_xxx"); 
    4 Jsp页面:
    5     valueStack:<s:property value="msg"/><br>

     用法2:集合的投影(过滤)
        1、集合的投影(只输出部分属性)  
                   collectionName.{ expression }

          

      

    1 <s:iterator value="#request.persons.{name}" var="person">
    2       <s:property value="#person"/><br>
    3 </s:iterator>

        2、集合的过滤
           1) 集合的过滤有以下三种方式:
               a.“?#”:过滤所有符合条件的集合,如:users.{?#this.age > 19};
               b.“^#”:过滤第一个符合条件的元素,如:users.{^#this.age > 19};
               c.“$#”:过滤最后一个符合条件的元素,如:users.{$#this.age > 19}
          2) this   表示集合中的元素;

      

    1 <s:iterator value="#request.persons.{?#this.age>24}" var="person">
    2        <s:property value="#person"/><br>
    3 </s:iterator>

       3、集合的投影和过滤
             投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素,如:users.{?#this.age > 19}[0]

    1 <s:iterator value="#request.persons.{?#this.age>24}.{name}" var="person">
    2       <s:property value="#person"/><br>
    3 </s:iterator>

      用法3:构造Map,如#{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。

          这种方式常用在给radio或select、checkbox等标签赋值上  

      

    1 jsp页面:
    2       <s:radio list=“#{‘male’:‘男’,‘female’:‘女’}”  name=“sex”  label=“性别” /> 
    3 运行结果是
    4      <input type="radio" name="sex" id="sexmale" value="male"/>5      <input type="radio" name="sex" id="sexfemale" value="female"/>
     1 Action中的代码:
     2        Map map=new HashMap();
     3        map.put("male", "男");
     4        map.put("female", "女");
     5        ServletActionContext.getRequest().setAttribute("map", map);
     6   jsp页面:
     7         <s:radio list="#request.map" name="sex" label="性别" />
     8   运行结果是
     9         <input type="radio" name="sex" id="sexfemale" value="female"/>10         <input type=“radio” name=“sex” id=“sexmale” value=“male”>

    OGNL表达式语言(%用法)

      %”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。

     1 形式一: { }中ognl表达式
     2   Action中的代码:
     3       ServletActionContext.getRequest().setAttribute("username", "username_request");                                                                           
     4   jsp页面:
     5       <s:textfield name="name" label="%{#request.username} "/>
     6  运行结果是
     7     username_request : <input type="text" name="name" value="" id="name"/>
     8 
     9 形式二: { }中值用 ’  ’引起来,这是不再是ogle表达式,而是普通的字符串
    10 jsp页面:
    11       <s:textfield name="name" label="%{'foo'}"/>
    12 运行结果是
    13     foo : <input type="text" name="name" value="" id="name"/>

    OGNL表达式语言($用法)

      “$”有两个主要的用途
          *  用于在国际化资源文件中,引用OGNL表达式
          *  在Struts 2配置文件中,引用OGNL表达式

     1 在struts2配置文件中引用ognl表达式 ,引用request等作用域中的值 
     2  Action中的代码:
     3         ServletActionContext.getRequest().setAttribute("msgxx", "msg_request");
     4  struts.xml文件中
     5         <package name="ognl"   namespace="/ognl" extends="struts-default" >
     6               <action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
     7                           <result name="ognl">/ognl/ongl.jsp?msg=${#request.msgxx}</result>
     8               </action>
     9         </package>
    10  jsp页面:
    11         parameters Msg:<s:property value="#parameters.msg[0]"/>
    12  运行结果是
    13         msg_request
     1 在struts2配置文件中引用ognl表达式 ,引用值栈的值 
     2  Action中的代码:
     3         valueStack.set("msgxx", "msg_valueStack");
     4  struts.xml文件中
     5         <package name="ognl"   namespace="/ognl" extends="struts-default" >
     6               <action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
     7                           <result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
     8               </action>
     9         </package>
    10  jsp页面:
    11         parameters Msg:<s:property value="#parameters.msg[0]"/>
    12  运行结果是
    13        msg_valueStack

    OGNL标签

      property标签

        property标签用于输出指定值:
          <s:property value=“#name" default="a default value" />     
              * default: 可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
              *  escape:可选属性,指定是否格式化HTML代码。 escape=“false”时,hr作为html标签使用
              *  value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。

     

    1       <s:property  value="#request.username"/>:输出栈顶的值
    2             输出: username=username_valueStack, msgxx=msg_valueStack
    3 
    4       <s:property  value="#request.username111" default="default value"/>
    5     <s:property value="%{'<hr> hr的使用'}"  escape="false"  />
    6             输出:<hr> hr的使用
    7             注:escape=“false”时,hr作为html标签使用

     set标签

      set标签用于将某个值放入指定范围。
            var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代
            scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在action中。
              value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。

    1       <s:set value="#request.username"  var="xxx“ scope=“request” /><br>
    2       <s:property value=“#request.xxx" /><br>
    3 
    4       
    5       <s:set value="#request.username"  var="xxx" scope="page" /><br>
    6       <s:property value="#attr.xxx" /><br>
    7 
    8       <s:set value="#request.username"  var="xxx" /><br>
    9       <s:property value="xxx" /><br>

     push标签

     push:将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。
         value:要push到堆栈中的值 。

    <s:push value="#request.username">
               <s:property/>
         </s:push>
         <br>
         测试删除: <s:property/>

    action标签
    Action:通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action
           name:action名字(不包括后缀,如.action)
           namespace:action所在命名空间
           executeResult:Action的result是否需要被执行,默认值是false不执行

    1 <package name="ognl"   namespace="/ognl" extends="struts-default" >
    2         <action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
    3            <result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
    4         </action>   
    5  </package>   
    6 
    7 <s:action name="ognlAction_test" namespace="/ognl" executeResult="true" />

    iterator标签

    Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。

    value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。

    var:    可选属性,引用变量的名称.

    status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:

      int getCount(),返回当前迭代了几个元素。

      int getIndex(),返回当前迭代元素的索引。

      boolean isEven(),返回当前被迭代元素的索引是否是偶数

      boolean isOdd(),返回当前被迭代元素的索引是否是奇数

      boolean isFirst(),返回当前被迭代元素是否是第一个元素。

      boolean isLast(),返回当前被迭代元素是否是最后一个元素。

    <s:iterator value="%{#request.persons}" var="person">
       <s:property value="#person"/><br>
    </s:iterator>
    <s:iterator value="%{#request.persons}" var="person">
       <s:property value="#person.id"/>~<s:property value="#person.name"/>~<s:property value="#person.age"/>
    </s:iterator>
    
    <s:iterator value="%{#request.persons}" var="person" status="st">
       返回当前迭代了几个元素. <s:property value="#st.count"/><br>
       返回当前迭代元素的索引.<s:property value="#st.index"/><br>
       返回当前被迭代元素的索引是否是偶数.<s:property value="#st.even"/><br>
       返回当前被迭代元素的索引是否是奇数.<s:property value="#st.odd"/><br>
       返回当前被迭代元素是否是第一个元素.<s:property value="#st.first"/><br>
       返回当前被迭代元素是否是最后一个元素.<s:property value="#st.last"/><br><br>
    </s:iterator>    
    
    <table border="1">
       <s:iterator value="%{#request.persons}" var="person" status="st">
          <tr class="<s:property value="#st.even?'evenClass':'oddClass'"/>">
             <td><s:property value="#person.id"/></td>
             <td><s:property value="#person.name"/></td>
             <td><s:property value="#person.age"/></td>
          </tr>
       </s:iterator>    
    </table>

    if/elseif/else标签  

      if/elseif/else  基本的流程控制.‘If’标签可单独使用也可以和‘Else If’标签和(或)一个多个‘Else’一起使用

    1 <s:if test="#age==23">
    2     23
    3 </s:if>
    4 <s:elseif test="#age==21">
    5     21
    6 </s:elseif>
    7 <s:else>
    8     都不等
    9 </s:else> 

    url标签

    url:该标签用于创建url,可以通过"param"标签提供request参数.

         value:如果不提供就用当前action,使用value后缀必须加.action

         action:用来生成url的action,如果没有则使用value

         namespace :命名空间

         var:引用变量的名称.

     1 <s:url action="ognlTagAction_test" namespace="/ognl" var="myurl">
     2          <s:param name="name" value="%{'张老师'}"></s:param>
     3          <s:param name="id" value="12"></s:param>
     4     </s:url>
     5 
     6     <a href='<s:property  value="#myurl" />' >xxxx</a><br>
     7     <a href='<s:property  value="%{#myurl}" />' >xxxx</a><br>
     8     
     9     使用value<br>
    10     <s:url value="ognlTagAction_test.action" namespace="/ognl" var="myurl">
    11          <s:param name="id" value="12"></s:param>
    12          <s:param name="cnname" value="%{'zhang'}"></s:param>
    13     </s:url>
    14 
    15     <a href='<s:property  value="#myurl" />' >xxxx</a><br>

    ognl操作集合

    使用ognl操作list和数组

     1 Action中:
     2    List<Person> list = new ArrayList<Person>();
     3       for(int i=0;i<10;i++){
     4          Person p = new Person();
     5          p.setId(i);
     6          p.setName("lucy"+i);
     7          p.setAge(20+i);
     8          list.add(p);
     9       }
    10    request.setAttribute("persons", list);
    11 Jsp:
    12        集合的长度:<s:property value="#request.persons.size"/><br>

    使用ognl操作list和数组

      ognl也可直接创建集合对象. 利用下拉列表框:

    1 Jsp:
    2  <s:iterator value="{1,2,3,4}">
    3      <s:property/>   <br>
    4   </s:iterator>
    5    
    6   <s:iterator value="{'s1','s2','s3','s4'}" var="s">
    7      <s:property value="#s"/>  <br>
    8   </s:iterator>

    使用ognl操作map
        ognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.
        创建map与创建list语法很相似,不同的是map前需要加"#"号.

     1 <s:iterator value="#{'key01':'value01','key02':'value02'}">
     2         <s:property/>   <br>
     3    </s:iterator>
     4   
     5    <s:iterator value="#{'key01':'value01','key02':'value02'}">
     6         key=<s:property value="key"/>   value=<s:property value="value"/> <br>
     7    </s:iterator>
     8    
     9    
    10    <s:iterator value="#{'key01':'value01','key02':'value02'}" var="map">
    11         key=<s:property value="#map.key"/>   value=<s:property value="#map.value"/> <br>
    12    </s:iterator>
  • 相关阅读:
    XMEGA IO口外部中断操作
    博客开通了
    cocos2d-x CCParticleSystem粒子系统
    获得web api 返回的Dataset 绑定到网格控件上
    DbHelperSQL—— 动软生成DbHelperSQL类
    Silverlight 调用 web api
    await运算符只能用于异步方法中。请考虑用async修饰符标记此方法,并将其返回类型更改为Task
    js如何获取url的参数
    cvbfbd
    【转】selenium及webdriver的原理
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4210744.html
Copyright © 2020-2023  润新知