OGNL表达式(#号的用法)

用法1:访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()

1、如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀

2、  如果访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象中的属性即可。

对象栈中的元素是有顺序的,底层是ArrayList封装容器。使用ognl搜索顺序自上而下

OGNL表达式%{}用法

%符号的用途是在标签的属性值被理解为字符串类型时,高数执行环境%{}里的是OGNL表达式

OGNL表达式${}形式用法:

用在两个地方:

一是在国际化资源文件中使用ognl表达式

二是在struts2配置文件中使用ognl表达式

例子:

test.jsp:

 <body>
测试值栈:<br/>
<a href="${pageContext.request.contextPath }/ognl/ValueStackAction_test.do">test</a><br/>
<br/>
<br/>
<br/>
测试ognl表达式的用法:<br/>
<a href="${pageContext.request.contextPath }/ognl/OgnlAction_test.do?cid=9">test</a><br/> 测试标签<br/>
<a href="${pageContext.request.contextPath }/ognl/OgnlTagAction_test.do?cid=9">test</a><br/>
</body>

OgnlAction.java:

public class OgnlAction extends ActionSupport {
private String cid; private String name="oname"; private String sex="male"; public String test(){
System.out.println("OgnlAction ************ test()"); HttpServletRequest req=ServletActionContext.getRequest();
req.setAttribute("username", "request_username"); Map<String,Object> sessionMap=ServletActionContext.getContext().getSession();
sessionMap.put("username", "session_username"); ServletContext application=ServletActionContext.getServletContext();
application.setAttribute("username","application_username"); ValueStack stack=ServletActionContext.getContext().getValueStack();
stack.set("error", "error_valueStack");
stack.set("msg", "msg_valueStack"); stack.getRoot().add(,new Person());
stack.getRoot().add(new Employee()); return "ognl";
} public void setCid(String cid) {
this.cid = cid;
} public String getCid() {
return cid;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setSex(String sex) {
this.sex = sex;
} public String getSex() {
return sex;
} }

ognlAction.jsp:

<body>
&lt;:ognl.jsp <br>
使用EL表达式取值---------------------------------<br/>
${requestScope.username }<br/>
${sessionScope.username }<br/>
${applicationScope.username }<br/><br/><br/>
使用Ognl表达式取值--------------------------------<br/>
# 如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。<br/>
<s:property value="#request.username"/><br/>
<s:property value="#session.username"/><br/>
<s:property value="#application.username"/><br/>
<s:property value="#application['username']"/><br/>
<s:property value="#parameters.cid[0]"/><br/>
<s:property value="#attr.username"/><br/><br/>
如果访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象中的属性即可。<br/>
<s:property value="cid"/><br/>
<s:property value="error"/><br/>
<s:property value="msg"/><br/><br/>
深入理解ObjectStack<br/>
对象栈中的元素是有顺序的,底层是ArrayList封装容器。使用ognl搜索顺序自上而下,搜索带了一个就返回<br/>
<s:property value="name"/><br/>
<s:property value="sex"/><br/>
<s:property value="age"/><br/>
<s:property value="salary"/><br/>
构造map:<br/>
<s:radio name ="sex" list="#{'01':'男','02':'女'}"></s:radio> <br/><br/> <!-- 这里一定要注意:必须给加上一个name属性或者id属性 --> %用法,告诉执行器里面是一个OGNL表达式(有的时候,执行器可能将""内的内容理解成字符串,这样就无法得到正确执行效果了,使用%{},有备无患。注意,无论什么表达式在struts2中使用这种形式都会被理解成ognl表达式):<br/>
<s:property value="#request.username"/><br/>
<s:property value="%{#request.username}"/><br/> <br/> $有两个主要的用途<br/>
用于国际化资源文件中,引用OGNL表达式<br/> <s:text name="ognl"></s:text><br/> 在struts2配置文件中,引用OGNL表达式<br/>
<s:property value="#parameters.msgxx[0]"></s:property><br/><br/> <s:debug></s:debug>
</body>

struts_ognl.xml:(这里使用了ognl表达式)

<struts>

     <package name="ognl" namespace="/ognl" extends="struts-default">
<action name="*_test" class="cn.itcast.ognl.{1}" method="test">
<result name="ValueStack">/ognl/ValueStackAction.jsp</result>
<result name="ognl">/ognl/ognlAction.jsp?msgxx=${msg}</result>
</action>
</package> </struts>

国际化资源文件:

resources.properties

items.username=username
items.psw=password
items.login=login
items.param=firstName\:{} lastName\:{}
ognl=${error}_ognl

resources_en_US.properties

items.username=username_en
items.psw=password_en
items.login=login_en
items.param=firstName_en\:{} lastName_en\:{}
ognl=${error}_ognl_en

resources_zh_CN.properties

items.username=\u7528\u6237\u540D
items.psw=\u5BC6\u7801
items.login=\u767B\u5F55
items.param=\u59D3\:{} \u540D\:{}
ognl=${error}_\u5BF9\u8C61\u56FE\u5F62\u5BFC\u822A\u8BED\u8A00

总结一下:

首先要理解好ognl的ValueStack概念。知道ognl存储的信息分为两个部分,一个是在context这个map里面,一个是在root这个集合里面。map里面存储了request--reuqest对应的map集合,session--session对应的map集合,application--对应的map集合,parameters--对应的map集合等。

第一种用法:不使用{}.使用#与没有#的区别:

注意一点:在struts2中ognl表达式需要在struts标签内使用。#表示的是context这个map,不使用#表示直接使用root中的元素,root中的元素是有序的。查找最先匹配的返回。例子上面有。

第二种用法%{ognl表达式}:

这个也没什么说的,就是为了防止执行器将ognl表达式当成普通的字符串加了一层保险,里面的ognl表达式其实是第一种的使用

这里其实我前面一直有疑惑:

怎么使用<s:property>标签输出字符串呢?毕竟执行器总是将我们的字符串想像成ognl,从第一种用法的时候就可以看出来。

比如:输出你好,可以这样试试:

<s:property value="%{'你好'}"/>

第三种用法${ognl表达式}:

只能在struts2配置文件或者国际化资源文件中使用,{}内内容就是第一种的使用

使用OGNL表达式的更多相关文章

  1. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  2. Struts2深入学习:OGNL表达式原理

    今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1

  3. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  4. struts2学习笔记--OGNL表达式1

    struts2标签库主要使用的是OGNL语言,类似于El表达式,但是强大得多,它是一种操作对象属性的表达式语言,OGNL有自己的优点: 能够访问对象的方法,如list.size(); 能够访问静态属性 ...

  5. struts2 OGNL表达式

    一.OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对 ...

  6. OGNL表达式

    一.什么是OGNL,有什么特点?     OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言 ...

  7. OGNL表达式(待解答)

    OGNL表达式的路径到底怎样的?下面代码看不懂为什么要这样?

  8. OGNL表达式struts2标签“%,#,$”

    一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言.OGN ...

  9. JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总

    一下纯属个人总结摘抄,总结一起方便查看,解决疑问,有遗漏或错误,还请指出.       1,JSTL标签总结: a).JSTL标签有什么用?          JSTL是由JCP(Java Commu ...

  10. Struts2的标签库(二)——OGNL表达式

    Struts2的标签库(二) --OGNL表达式 1.Struts2中的OGNL表达式增加了ValueStack的支持. 注:ValueStack--实际上是一个容器对象,该对象在启动Struts2框 ...

随机推荐

  1. 实用国际(XX)计量单位表

    很多实用附录简表:http://www.zdic.net/appendix/f1.htm 计量单位简表 时间的单位换算 : 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)  1秒=1,00 ...

  2. JS创建表单提交备份

    //保存 function saveFT() { var data = { createDate: GetDateStr(0), name: $("#txtName").val() ...

  3. AspectJ学习笔记2-Eclipse中AspectJ插件AJDT的正确安装方法

    接着之前一篇日志. 这个事情也挺无语的.简单记录一下. 在这里:http://www.eclipse.org/ajdt/ 能够下载最新的Eclipse Plugin.下载解压之后,一般来说.直接把解压 ...

  4. Linux学习日志--共享内存

    一:什么是共享内存             共享内存是属于IPC(Inter-Process Communication进程间通信)机制,其它两种是信号量和消息队列,该机制为进程开辟创建了特殊的地址范 ...

  5. 怎样推断 ios设备的类型(iphone,ipod,ipad)

    -(bool)checkDevice:(NSString*)name { NSString* deviceType = [UIDevice currentDevice].model; NSLog(@& ...

  6. 黑帽SEO手法

    黑帽SEO手法 0x00:概念 SEO全称搜索引擎优化,通过站内优化和站内优化方式来提升搜索引擎排名,有白帽SEO和黑帽SEO. 因为正规的SEO优化需要很长时间,黑帽SEO手法让站内快速提升排名的有 ...

  7. Appium python自动化测试系列之使用HTMLTestRunner生成测试报告(十三)

    ​13.1 测试报告概述 13.1.1 测试报告的定义 在前面章节我们已经讲了自动化基础的很多东西,如果说掌握了,而且自己动手去练习了,我相信在一些初级的面试中是没任何问题的,今天我们接触的应该算是一 ...

  8. 【selenium+Python unittest】之使用smtplib发送邮件错误:smtplib.SMTPDataError:(554)、smtplib.SMTPAuthenticationError(例:126邮箱)

    原代码如下: import smtplib from email.mime.text import MIMEText from email.header import Header #要发送的服务器 ...

  9. Android——4.2 - 3G移植之路之 reference-ril .pppd 拨号上网 (三)

    Android的RIL机制中的 reference-ril.c 即为厂商提供的驱动接口.这个驱动源代码各个厂商都是有提供的,网上也有下载.我如今用的就是huawei wcdma的.最后编译成libre ...

  10. 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流

    [BZOJ2597][Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之 ...