OGNL表达式
一、OGNL介绍
OGNL全称是Object-Graph Navigation Language(对象图导航语言)是一个用来获取 和设置 java对象属性的表达式语言,需在Struts2标签中使用。
在OGNL的使用中,需访问一系列对象,这些对象都存放在OGNL的context(上下文)中,context是一个Map结构,
存放了一系列的key-value对,实际上,它和ActionContext类是相对应的。
在发送Http请求给Struts2框架后,Struts2框架会创建ActionContext、ValueStack和对应的action对象,而action对象会被放入ValueStack对象中,ValueStack对象则会放入ActionContext对象中。
在jsp页面中访问context的数据时,都需用”#”,但ValueStack是其根对象则不需要,因此,在访问action对象的属性时
不需要使用”#”。
二、主要功能
1.取数据,它可以利用一段简短的表达式取出各种各样丰富的数据.
2.附带了一些便捷的功能,如:方法调用、静态方法和属性调用、数值运算……
三、如何取数据
ognl会从两个地方取数据:一个是Action的实例属性;另一个是ValueStack(中文名叫值栈)。
ognl会先从前者里面取,如果没取到再到ValueStack里取。ValueStack里存储了request、session、application、response、action实例、parameters数组……
1.取action实例的属性数据
action实例的属性数据可以直接在struts2的标签中通过属性名取到。如:
注意:不要加#号。
2.取ValueStack中的数据。
struts2提供三种方式通过ognl表达式来取ValueStack中的数据:#、%{}、${}
#和%{}需要放到struts2提供的标签里才生效。如:
<s:property value="#name"/>、<s:property value="%{'hello struts2'}"/>
“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
<s:url value="%{#myMap['key1']}"/>
最常用的方式是:#
1.#能取request、session、application里的attribute,但需要加前缀。如: <s:property value="#session.name2"/>、 <s:property value="#application.name3"/>。 如果是取request范围的attribute,那么不需要加request前缀,加上反而取不到数据,ognl默认从request里取,如果没有取到并不会到session或application里取。 如:<s:property value="#name"/> 2.#能取request里的请求参数,但必须加parameters前缀,且取到的是一个数组,所以如果你要得到参数的第一项值,那么还要加下标。 如:<s:property value="#parameters.name[0]"/>。这相当于调用request.getParameterValues("name")[0]; 3.#加attr前缀能按request > session >application顺序获取attribute,这样当在request中取不到时,会自动向session里取,如果session里也取不到,会再向application里取。如果取到则返回,不再向上游历。 如:<s:property value="#attr.name"/> 4.#能构造Map, 如:<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /><s:property value="#foobar['foo1']" /> <s:radio list="#{'0':'男','1':'女'}" name="sex" label="性别" value="%{user.sex}"></s:radio> 5.#能用于过滤和投影(projecting)集合, 如:books.{?#this.price<100} 6、“$”有两种用途 (1)、在国际化资源文件中,引用OGNL表达式。 (2)、在Struts 2配置文件中,引用OGNL表达式: <action name="saveUser" class="userAction" method="save"> <result type="redirect">listUser.action?msg=${msg}</result> </action> <action name="saveUser" class="userAction" method="save"> <result type="redirect">listUser.action?msg=${msg}</result> </action>
三、代码实例
如:java:
/** * 通过ognl表达式从ognl上下文(context)获取值显示到jsp页面,ognl表达式只使用在struts2标签中 * ognl上下文(context) <=> ActionContext <- ValueStack <- action对象 * * 值栈 ValueStack 包含如下对象: * action实例、request、session、application、response、parameters数组 attr... * */ public class OgnlAction extends BaseServletAction{ private String name; private User user = new User(); private List<User> list = new ArrayList<User>(); @Override public String execute() throws Exception { ActionContext actionContext = ActionContext.getContext(); ValueStack valueStack = actionContext.getValueStack(); valueStack.push("ognl名称"); name="张三"; user.setName("李四"); user.setPassword("abcd"); list.add(new User("王二","456")); list.add(new User("小明","123")); actionContext.put("number", "request=1001"); session.setAttribute("age", "session=23"); return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; } }
jsp:
<body> <!-- 显示valuestack值栈内容 --> <s:property value="name"/> <s:property value="user.name"/> <s:property value="user.password"/> <hr> <s:iterator value="list" var="u"> <s:property value="#u.name"/><br> </s:iterator> <s:property value="#number"/> <s:property value="#session.age"/> <%-- <s:set var="name" value="小明" ></s:set> --%> <%--ognl 从action对象中取属性值 --%> <s:property value="name" default="默认值" /> <s:property value="user.username" default="默认值" /> <br>用户名: <s:property value="userLists[1].username" default="默认值" /> 密码: <s:property value="userLists[1].password" default="默认值" /> <br> <%--ognl 从ServletAPI request session .... 对象中取属性值 --%> <s:property value="#request.age" default="request默认值" /> <s:property value="#session.sex" default="session默认值" /> <!-- reqeust > session > application --> <s:property value="#attr.age" default="attr默认值" /> <%--ognl 从valueStack中取属性值 --%> <s:property value="stack2.username" default="valueStack默认值" /> ${stack2.password} <br> ${user.username} <br> <s:form action="ognltag.jsp" method="post"> <s:textfield label="用户名" name="user_name"></s:textfield> <s:password label="密码" name="pass_word"></s:password> <s:submit value="提交"></s:submit> </s:form> <s:property value="#parameters.user_name"/> <s:property value="#parameters.pass_word"/> <s:debug></s:debug> </body>
转载请注明来源:OGNL表达式