您的位置:首页 > 编程语言 > Java开发

黑马程序员---struts2学习笔记之八(ognl原理及使用)

2015-08-08 15:15 1086 查看

-----------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日笔记----------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: