首页 > 代码库 > Struts2 之 ognl

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="http://www.mamicode.com/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=http://www.mamicode.com/“#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_valueStack3 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=http://www.mamicode.com/“#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="http://www.mamicode.com/#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     233 </s:if>4 <s:elseif test="#age==21">5     216 </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=http://www.mamicode.com/<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=http://www.mamicode.com/<s:property value="#map.value"/> <br>12    </s:iterator>

 

Struts2 之 ognl