OGNL表达式

    |     2016年12月29日   |   struts2   |     0 条评论   |    1680

一、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提供的标签里才生效。如:[java]<s:property value="#name"/>、<s:property value="%{‘hello struts2’}"/>[/java]
  “%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 [java]<s:url value="%{#myMap[‘key1’]}"/>[/java]
 最常用的方式是:#
 [java] 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]

三、代码实例

如:java:
[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;
}
}
[/java]

jsp:
[java]<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>[/java]

转载请注明来源:OGNL表达式
本文链接地址:https://ai.zhousir.top/?p=1875

上一篇:

下一篇:

回复 取消