-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
ognl表达示语言
Ognl:是Object-GraphNavigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能.
1.优势
*支持对象方法调用,
*支付类的静态方法调用,
*支付赋值操作和表达式串联
*访问OGNL上下文
*操作集合对象
2.在研究OGNL时需要先对ValueStscd进行研究
ValueStscd(值栈):贯穿带个action(action类,多例的)的生命周期,每个action都拥有一个ValueStscd,相当于一个数据的中转站,在其中保存当前action对象和其它相关对象。
ValueStscd是一个接口,程序在实际运行中由框架负责根据底层的实现进行实例化(OgnlValueStscd),存在放Request中。因此可以通过rep.getAttribute("struts.valueStack")得到ValueStscd对象。
ServletActionContext.getContext().getValueStack()是ValueStscd对象的第二种方法。
ValueStscd对象中有再从个逻辑部分:
ObjectStack:Struts把动作和相关的对象压入ObjectStack中的List;
ContexMap:Struts把各种各样的映射关系压入ContexMap中。
3.Ognl使用方法
访问Ognl上下文和action上下文,#相当于ActionContext.getContext();
3.1通过#+域对象+.+Key或#+域对象+[‘Key’]的表达式就可以获取得到后台存放进来相应域对象的值,例如:
后台代码:分别在Request,session及servletContext域对象中存放key值为username的数据:
***************************************************************
HttpServletRequestrep = ServletActionContext.getRequest();
rep.setAttribute("username", "name_Request");
Map<String,Object> sessionMap = ServletActionContext.getContext()
.getSession();
sessionMap.put("username", "name_sessionMap");
ServletContextservletContext = ServletActionContext
.getServletContext();
servletContext.setAttribute("username", "name_servletContext");
***************************************************************
Jsp页面上代码:通过OGNL表达式将后台存放的数据获取
***************************************************************
方式一:<s:property value="#request.username"/><br>
方式二:<s:property value="#session[‘username’]/><br>
方式一:<s:property value="#application.username"/><br>
***************************************************************
3.2获得请求中带的参数,例如:
***************************************************************
……/ognl/OgnlAction_test?userid=10086(链接)
<s:property value="#parameters.userid"/>(获得传过来的参数值)
***************************************************************
3.3从对象栈中获取对象的属性:
后台代码:
***************************************************************
valueStack.push(newPerson("bbb","wm"));//将对象压入栈顶
valueStack.getRoot().set(0,new Person("aaa", "m"));//将对象放到对象栈的第X个位置,X为0时与压栈一样
valueStack.getRoot().add(newPerson("cccc", "????"));//将对象添加到对象栈后面
***************************************************************
前台代码
***************************************************************
<s:property value="name" />
<s:property value="sex" />
<s:property value="age" />
前台代码直接通过对象的发生名取舍,框架会从对象栈的上到下依次查找,查到就停止。
***************************************************************
3.4操作map集合
构造Map:<s:radiolist="#{'01':'男','02':'女'}"></s:radio>
3.5%号的用法:在标签的属性值被理解为字符型时,告诉执行环境%{}里的是OGNL表达式。
***************************************************************
<s:property value="#request.username" />
可以写成:
<s:property value="%{#request.username}" />
***************************************************************
%{}是万能用法,无论里面的表达式是不是ognl表达式,都会强制理解为ognl表达式,%{}的两种用法:
A.用于在国际化资源文件中,引用OGNL表达式:(非重点,不详细说明);
B.在Struts 2配置文件中,引用OGNL表达式:
后台配置:
***************************************************************
<action name="OgnlAction_test" class="com.struts2.ognl.OgnlAction"
method="test">
<result name="ogln_test_ok">/ognl/OgnlAction.jsp?msg=%{#request.username}</result>
<result name="input">/error.jsp</result>
</action>
***************************************************************
前台可以按获取参数的方式拿到msg的值。
----------------------------------------------------------2015年8月7日笔记----------------------------------------------------------------------