OGNL表达式的使用

<span style="font-size: large;"><span style="font-size: large;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
<%@ taglib uri="/struts-tags" prefix="s" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
    <title>OGNL的使用</title>  
  </head>  
  <body>  
<h3>OGNL的使用</h3><hr/>  
 访问Action中的普通属性: <s:property value="loginname"/><br/>  
 访问Action中的对象属性: <s:property value="user.birthday"/><br/>  
 访问Action中的Set属性: <s:property value="courseSet.toArray()[0]"/><br/>  
 访问Action中的List属性: <s:property value="list[0]"/><br/>  
 访问Action中的Map属性的键: <s:property value="map.keys.toArray()[1]"/><br/>  
 访问Action中的Map属性的值: <s:property value="map.values.toArray()[1]"/><br/>  
访问Action中的Map属性的指定键对应的值: <s:property value="map['z']"/><br/>   
访问Action中的Map属性的大小: <s:property value="map.size"/><br/>   
<hr/>  
访问ActionContext中的普通属性:<s:property value="#inte"/><br/>  
访问ActionContext中的对象属性:<s:property value="#user2.loginname"/><br/>  
<hr/>  
访问Action中的普通方法:<s:property value="getAppName()"/><br/>  
访问ActionContext中的某个对象上的普通方法:<s:property value="#user2.info()"/><br/>  
<hr/>  
访问静态属性:<s:property value="@java.lang.Math@PI"/><br/>  
访问静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/>  
访问Math类中的静态方法:<s:property value="@@floor(44.56)"/><br/>  
<hr/>  
调用java.util.Date的构造方法:<s:date name="new java.util.Date()" format="yyyy-MM-dd HH:mm:ss"/><br/>  
调用java.util.Date的构造方法创建对象,再调用它的方法:<s:property value="new java.util.Date().getTime()"/><br/>  
<hr/>  
投影查询:获取userList中所有loginname的列表:<s:property value="userList.{loginname}"/><br/>  
选择查询:获取userList中所有score大于60的loginname列表:<s:property value="userList.{?#this.score>60.0}.{loginname}"/><br/>  
选择查询:获取userList中所有score大于60并且gender为true的loginname列表:<s:property value="userList.{?(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>  
选择查询:获取userList中所有score大于60并且gender为true的第一个元素的loginname:<s:property value="userList.{^(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>  
选择查询:获取userList中所有score大于60并且gender为true的最后一个元素的loginname:<s:property value="userList.{$(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>  
<hr/>  
访问名为xxx的请求参数对应的第一个值:<s:property value="#parameters.xxx[0]"/><br/>  
访问通过ActionContext中放入Request中的属性:<s:property value="#request.reqAtt"/><br/>  
访问通过ServletActionContext中放入Request中的属性:<s:property value="#request.reqAtt2"/><br/>  
  
访问通过ActionContext中放入Session中的属性:<s:property value="#session.sesAtt"/><br/>  
访问通过ServletActionContext中放入Session中的属性:<s:property value="#session.sesAtt2"/><br/>  
访问通过ActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt"/><br/>  
访问通过ServletActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt2"/><br/>  
  
直接访问属性域中指定名称的属性对应的值:<s:property value="#attr.sesAtt2"/><br/>  
<br/><br/><hr/>  
<s:iterator value="userList" status="vs">  
    <s:if test="%{#vs.odd}">  
        <span style="color: red">  
            <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>  
        </span>  
    </s:if>  
    <s:else>  
        <span style="color: blue">  
            <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>  
        </span>  
    </s:else>  
</s:iterator>  
  
<hr/><s:debug/>  
  </body>  
</html></span></span>

总结:


在上边大家都好奇为什么都用struts的S标签,因为OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等






 Action类与JSP页面之间的数据传递


 1) 通过HttpServletRequest,HttpSession,ServletContext来传递数据。


    a) Action中传数据:在Action类的请求处理方法中先获取各个作用域对象


    ServletActionContext.getRequest();


    ServletActionContext.getRequest().getSession();


    ServletActionContext.getServletContext();


          然后调用相应的setAttribute(String "键", Object 值);


    b) 在JSP页面中取数据:可以使用EL表达式或代码片段来取出对应作用域中属性值。


    c) 页面中的请求参数传递到Action中时,Action中直接定义对应名称的属性,并提供setter方法即可封装此数据。


    


 2) 通过ActionContext实例来传递数据。 ActionContext针对每个正在执行Action的线程中绑定一份。


   a) Action中通过ActionContext传递数据。


      ActionContext提供了put(String "键", Object 值);  //数据不会映射到HttpServletRequest中。


      ActionContext提供的getSession().put(String "键", Object 值);  //数据会自动映射到HttpSession中。


      ActionContext提供的getApplication().put(String "键", Object 值); //数据会自动映射到ServletContext中。


   b) 在JSP页面取数据:struts2推荐使用OGNL来取ActionContext中的数据。










1. Struts2中的OGNL的使用。






2. OGNL:对象图导航语言。通过OGNL表达式可以获取对象的属性,调用对象的方法,或构造出对象。


  1) OGNL上下文中有一个根对象。这个根对象可以直接获取。不需要#。


  2)支持常量:


         字符串常量、字符常量、


         数值常量:int、long、float、double


         布尔常量:true、false


    Null常量 : null


         支持操作符:支持Java的所有操作符,还支持特有的操作符: ,、 {}、in、not in;






 Struts2中的OGNL:


  1) Struts2将ActionContext设置为OGNL上下文,并将值栈(ValueStack)作为OGNL的根对象放置到ActionContext中。


  2) Struts2总是把当前Action实例放置在值栈的栈顶。所以,在OGNL中引用Action中的属性也可以省略“#”。


  


 常用标签


 1) <s:property value="OGNL"/>


 2) <s:date name="OGNL" format=""/>


 3) <s:if test="OGNL"></s:if><s:elseif test="OGNL"></s:elseif><s:else></s:else>


★4) <s:iterator value="OGNL" status="vs">...</s:iterator>


 5) <s:debug/>


 






struts2中#、%和$这三个符号的使用方法【摘自max struts2教程】 


 


一、"#"的用法 


   1、 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: 


        parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id") 


       request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName")


       session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName") 


       application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName") 


       attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止 


     2、用于过滤和投影(projecting)集合,如books.{?#this.price<100}; 


     3、构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。 






二、"%"的用法 


    “%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码: 


    <h3>%的用途</h3> 


    <p><s:url value="#foobar['foo1']" /></p> 


    <p><s:url value="%{#foobar['foo1']}" /></p> 






三、"$"的用法 


    1、用于在国际化资源文件中,引用OGNL表达式 


    2、在Struts 2配置文件中,引用OGNL表达式 


     例如: 


         <action name="AddPhoto" class="addPhoto"> 


            <interceptor-ref name="fileUploadStack" />            


            <result type="redirect">ListPhotos.action?       albumId=${albumId}</result> 


        </action>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值