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>
原文地址:https://www.cnblogs.com/liuwt365/p/4210744.html