OGNL

Posted Beyondづ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OGNL相关的知识,希望对你有一定的参考价值。

一、OGNL全称是Object Graph Navigation Language,即对象导航图语言

 OGNL在框架中主要做两件事情:表达式语言和类型转换器

OGNL在框架中的作用以及数据的流入流出:

 


 

二、ValueStack值栈

定义:是内存中的一块空间,栈和堆之外的空间,它具有栈的特征,可以存放多个对象,如果存放多个对象,他们是按照先后顺序压入堆栈的。框架在处理每个请求时,都会创建该请求对应的运行环境,这时会创建值栈和请求对应的Action实例,并将Action实例压入值栈中  


 三、实现思路

可通过单列(Root)、双列(Context)集合获取ValueStack

单列集合:

创建Action类继承自ActionSupport,首先通过ServletActionContext获取到request对象,其次创建UserInfo对象,通过ValueStack对象的getRoot方法拿到UserInfo对象info

复制代码
public class ValueStackAction extends ActionSupport {
    @Override
    public String execute() throws Exception {

        HttpServletRequest request = ServletActionContext.getRequest();
        ValueStack vs = (ValueStack) request.getAttribute("struts.valueStack");

        UserInfo info = new UserInfo();
        info.setUsername("呵呵");
        info.setPassword("12345");
            
        vs.getRoot().add(info);
        
        return SUCCESS;
    }
复制代码

index.jsp页面进行取数据:

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP \'index.jsp\' starting page</title>
    
  </head>
  
  <body>
    valueStack
      <s:property value="username"/> 
   
    <s:debug></s:debug>
  </body>
</html>
复制代码

 


双列集合:

 

 

index.jsp页面:需注意的是双列集合通过#获取数据

 

使用ognl表达式:

1)“#”符号有三种用途

a、访问非根对象(struts中值栈为根对象),eg:OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

名称   作用域 

eg:

1-1)parameters :包含当前HTTP请求参数的Map

#parameters.id[0]=>作用相当于request.getParameter("id")

 

1-2)request:包含当前HttpServletRequest的属性(attribute)的Map

#request.userName=>作用相当于request.getAttribute("userName");

 

1-3)session:包含当前HttpSession属性(attribute)的Map

#session.userName=>session.getAttribute("userName");

 

1-4)application:包含当前应用的ServletContext的属性(attribute)的Map

#application.userName=>application.getAttribute("userName");


时间是一切财富中最宝贵的财富。 —— 德奥弗拉斯多

 

以上是关于OGNL的主要内容,如果未能解决你的问题,请参考以下文章

Struts2中OGNL表达式的用法

什么是OGNL,什么是struts2标签?学的有点混淆了,感觉struts2标签包含了OGNL,别说定义,定义都知道。

Ognl 和 EL 和jstl区别

案例45-crm练习改写客户列表使用struts2&OGNL

- Errorsettingexpression'book.author' withvalue'[Ljava.lang.String;@14ab51b'ognl.Ogn

Struts2使用OGNL遍历各种map总结