OGNL的使用

  1. 访问Action中的普通属性: <s:property value="loginname"/><br/>
  2. 访问Action中的对象属性: <s:property value="user.birthday"/><br/>
  3. 访问Action中的Set属性: <s:property value="courseSet.toArray()[0]"/><br/>
  4. 访问Action中的List属性: <s:property value="list[0]"/><br/>
  5. 访问Action中的Map属性的键: <s:property value="map.keys.toArray()[1]"/><br/>
  6. 访问Action中的Map属性的值: <s:property value="map.values.toArray()[1]"/><br/>
  7. 访问Action中的Map属性的指定键对应的值: <s:property value="map[‘z‘]"/><br/>
  8. 访问Action中的Map属性的大小: <s:property value="map.size"/><br/>
  9. <hr/>
  10. 访问ActionContext中的普通属性:<s:property value="#inte"/><br/>
  11. 访问ActionContext中的对象属性:<s:property value="#user2.loginname"/><br/>
  12. <hr/>
  13. 访问Action中的普通方法:<s:property value="getAppName()"/><br/>
  14. 访问ActionContext中的某个对象上的普通方法:<s:property value="#user2.info()"/><br/>
  15. <hr/>
  16. 访问静态属性:<s:property value="@[email protected]"/><br/>
  17. 访问静态方法:<s:property value="@[email protected](44.56)"/><br/>
  18. 访问Math类中的静态方法:<s:property value="@@floor(44.56)"/><br/>
  19. <hr/>
  20. 调用java.util.Date的构造方法:<s:date name="new java.util.Date()" format="yyyy-MM-dd HH:mm:ss"/><br/>
  21. 调用java.util.Date的构造方法创建对象,再调用它的方法:<s:property value="new java.util.Date().getTime()"/><br/>
  22. <hr/>
  23. 投影查询:获取userList中所有loginname的列表:<s:property value="userList.{loginname}"/><br/>
  24. 选择查询:获取userList中所有score大于60的loginname列表:<s:property value="userList.{?#this.score>60.0}.{loginname}"/><br/>
  25. 选择查询:获取userList中所有score大于60并且gender为true的loginname列表:<s:property value="userList.{?(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
  26. 选择查询:获取userList中所有score大于60并且gender为true的第一个元素的loginname:<s:property value="userList.{^(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
  27. 选择查询:获取userList中所有score大于60并且gender为true的最后一个元素的loginname:<s:property value="userList.{$(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
  28. <hr/>
  29. 访问名为xxx的请求参数对应的第一个值:<s:property value="#parameters.xxx[0]"/><br/>
  30. 访问通过ActionContext中放入Request中的属性:<s:property value="#request.reqAtt"/><br/>
  31. 访问通过ServletActionContext中放入Request中的属性:<s:property value="#request.reqAtt2"/><br/>
  32. 访问通过ActionContext中放入Session中的属性:<s:property value="#session.sesAtt"/><br/>
  33. 访问通过ServletActionContext中放入Session中的属性:<s:property value="#session.sesAtt2"/><br/>
  34. 访问通过ActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt"/><br/>
  35. 访问通过ServletActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt2"/><br/>
  36. 直接访问属性域中指定名称的属性对应的值:<s:property value="#attr.sesAtt2"/><br/>
  37. <br/><br/><hr/>
  38. <s:iterator value="userList" status="vs">
  39. <s:if test="%{#vs.odd}">
  40. <span style="color: red">
  41. <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
  42. </span>
  43. </s:if>
  44. <s:else>
  45. <span style="color: blue">
  46. <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
  47. </span>
  48. </s:else>
  49. </s:iterator>
  50. <hr/><s:debug/>
  51. </body>
  52. </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>

时间: 2024-10-03 20:59:09

OGNL的使用的相关文章

Study之Ognl

使用Ognl需要导入两个包: 测试小程序: package helloWorld; import ognl.Ognl;import ognl.OgnlException; public class TestOgnl { public static void main(String[] args) {                Person person=new Person();        person.setName("Abby");        try {        

request.setAttribute(&quot;username&quot;, username);//一定要保存,OGNL才能获取${username}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username= request.getParameter("username"); request.setAttribute("use

ognl.OgnlException

问题描述: Action 类代码: public class Login2Action implements Action {     // 领域对象     private Users user;     public Users getUsers() {         return user;     }     public void setUsers(Users user) {         this.user = user;     }     - } 错误提示: 警告: Erro

MyBatis中的OGNL教程

MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis有关的,虽然和Struts中的用法类似但是换种方式理解起来就有难度. MyBatis常用OGNL表达式 e1 or e2 e1 and e2 e1 == e2,e1 eq e2 e1 != e2,e1 neq e2

Struts2配置使用参数接收,转发与重定向,多方法,ognl使用与值传递,struts标签使用

本文档包括了 (1)首先加入jar包(最小jar组合) (1)   在web.xml中注册Struts2 这是一个前控制器作用是提供一个统一的入口,所有的请求都先经过前控制器就是这里,然后由他在做进一步处理 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

Ognl中根元素与非根元素的关系

Ognl中根元素与非根元素的关系 根元素:可以理解为全局变量 非根元素:局部变量 从两者获取其属性的方式看: Object obj = Ognl.parseExpression(“[1]”); [1]根元素:不用写#号,填写属性 非根元素:用写#号,填写对象名字 注:从填写内容能看出全局和局部了 返回得到的obj就是在全文中从上到下搜索到的[1],比如说全局和局部名称一致了,你填写属性那肯定就是全局,都没到局部那个地方就搜索到了. OgnlContext 这就是上下文.上下文干啥的,可以理解下英

Java实战之01Struts2-04拦截器、上传下载、OGNL表达式

十二.Struts2中的拦截器 1.拦截器的重要性 Struts2中的很多功能都是由拦截器完成的.比如:servletConfig,staticParam,params,modelDriven等等. 是AOP编程思想的一种应用形式. 2.拦截器的执行时机: \ 3.自定义拦截器 3.1.拦截器的类试图(初级版本): 3.2.编写步骤: a.编写一个类,继承AbstractInterceptor类或者实现Interceptor接口.重写intercept方法. 1 public class MyI

OGNL表达式语言中的&quot;#&quot;和&quot;$&quot;的区别

Struts2使用标准的Context来进行OGNL表达式语言求值,OGNL的顶级对象是一个Context,这个Context对象就是一个Map类型实例,其根对象就是ValueStack,如果需要访问ValueStack里的属性,直接通过如下方式即可:    //取得ValueStack中bar属性    ${bar}除此之外,Struts2还提供了一些命名对象,但是这些命名对象都不是Stack Context的跟对象,它们只是存在于StackValue中.所以访问这些对象时需要使用“#”前缀来

Ognl表达式 值栈对象ValueStack

ValueStack值栈主要包含另个部分: 1.map栈(非根元素) context:主要存储域对象. 2.list栈(根元素) root:主要存储 (1)通过值栈的push()方法存放的对象 (2)Map对象(通过值栈的set()方法存放的数据) (3)Action对象 (4)其他代理对象. 测试类OgnlDemo2 <span style="font-size:14px;"><span style="font-family:Courier New;&qu

Struts2学习之路(六)—— OGNL表达式

OGNL全称为Object-Graph Navigation Language,可译为对象图导航语言.此处介绍的OGNL表达式内容,仅限于在struts2标签中应用,形式如下: <s:property value="xxx" /> 以下为列举的一些应用形式: 1.访问值栈中action的普通属性: <s:property value="username" /> 2.访问值栈中对象的属性(setter getter方法): <s:prop