OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。
1、“#”符号有三种用途:
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();如:#parameters,#request,#session,#application,#attr
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}
(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}
2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。很有点类似javascript里面的eval_r()功能。如果有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。
3、“$”有两种用途
(1)、在国际化资源文件中,引用OGNL表达式。
SampleAction.java
运行效果:http://localhost:7080/MyDynamicWeb/Sample.action?curUserId=309
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。
1、“#”符号有三种用途:
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();如:#parameters,#request,#session,#application,#attr
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}
(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}
2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。很有点类似javascript里面的eval_r()功能。如果有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。
3、“$”有两种用途
(1)、在国际化资源文件中,引用OGNL表达式。
(2)、在Struts 2配置文件中,引用OGNL表达式。
Sample.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>OGNL例子</title>
<style>
.block1 {
border: 1px dashed #c76c3e;
width: 500px;
padding: 5px;
margin-top: 3px;
}
</style>
</head>
<body>
Array:
<div class="block1">
<b>sampleArray :</b>
<s:property value="sampleArray" />
<br> <b>sampleArray.length :</b>
<s:property value="sampleArray.length" />
<br> <b>sampleArray[0] :</b>
<s:property value="sampleArray[0]" />
<br> <b>[0].sampleArray :</b>
<s:property value="[0].sampleArray" />
<br> <b>top.sampleArray :</b>
<s:property value="top.sampleArray" />
</div>
List:
<div class="block1">
<b>sampleList :</b>
<s:property value="sampleList" />
<br> <b>sampleList.size :</b>
<s:property value="sampleList.size" />
<br> <b>sampleList[0] :</b>
<s:property value="sampleList[0]" />
</div>
Map:
<div class="block1">
<b>sampleMap[1] :</b>
<s:property value="sampleMap[1]" />
<br> <b>sampleMap.size :</b>
<s:property value="sampleMap.size" />
<br>
<s:select list="#{'make1':'Ford', 'make2':'Honda', 'make3':'Toyota'}"
name="carMake" label="Select "></s:select>
<br> <b>sexMap[11] :</b>
<s:property value="sexMap[11]" />
<br> <b>sexMap[RY] :</b>
<s:property value="sexMap['RY']" />
<br> <b>URL:</b>
<s:url value="%{sexMap['RY']}" />
<br> <b>%:</b>%{sexMap['RY']} <br> <b>EL:</b>${sexMap['RY']}
</div>
Self Class:
<div class="block1">
<b>电子邮件EL:</b>${user.email} <br> <b>电子邮件:</b>
<s:property value="user.email" />
<br> <b>quote :</b>
<s:property value="quote" />
</div>
#访问非根对象(struts中值栈为根对象):
<div class="block1">
curUserId:
<s:property value="#parameters['curUserId']" />
<br> quote:
<s:property value="#parameters['quote']" />
</div>
#用于过滤和投影(projecting)集合:
<div style="width: 100%; overflow: scroll; border: 1px solid;">
<table border="1" style="width: 100%">
<caption>用户列表</caption>
<tr>
<td />
<td>编号</td>
<td>名称</td>
<td>电话号码</td>
<td>邮箱</td>
<td style="width: 100px">出生日期</td>
<td>性别</td>
<td>性别2</td>
</tr>
<s:iterator value="users.{?#this.userId>1}" status="st" id="user">
<tr <s:if test="#st.odd">style="background-color:#cccccc" </s:if>>
<td><s:radio name="uradio" list="{#user.userId}"
theme="simple" listValue="''" /></td>
<td><s:property value="#user.userId" /></td>
<td><s:property value="#user.name" /></td>
<td><s:property value="#user.phoneNumber" /></td>
<td><s:property value="#user.email" /></td>
<td><s:property value="#user.birthday" /></td>
<td><s:select value="#user.gender"
list="#{'':'', '00':'女', '11':'男'}" theme="simple"
disabled="true" /></td>
<td><s:property value="sexMap[#user.gender]" /></td>
</tr>
</s:iterator>
</table>
</div>
构造Map,"%"的作用:
<div class="block1">
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}" />
<s:property value="#myMap['key1']" />
<s:url value="#myMap['key1']" />
<s:url value="%{#myMap['key1']}" />
</div>
Others:user.serialNumber.replaceAll(' ','')
<div class="block1">
${user.name} <br> ${user.serialNumber} <br>
<%=java.lang.String.format("foo %s", "bar")%>
<br>
<s:checkboxlist name="user.serialNumber"
list="#{1:'value1',2:'value2',3:'value3',4:'value4'}"
listKey="value" listValue="key" value="%{[1,3]}" />
</div>
</body>
</html>
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="main" namespace="/" extends="struts-default">
<action name="User_*" class="lian.UserAction" method="{1}">
<result name="input">/jsp/UserEdit.jsp</result>
<result name="list">/jsp/Users.jsp</result>
<result name="edit">/jsp/UserEdit.jsp</result>
<result name="ognl">/jsp/OgnlElStruts2.jsp</result>
</action>
<action name="Sample" class="lian.SampleAction">
<result name="success">/jsp/Sample.jsp?quote=${quote}</result>
</action>
</package>
</struts>
SampleAction.java
package lian;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SampleAction {
private String[] sampleArray;
{
sampleArray = new String[] { "item1", "item2", "item3" };
}
public String[] getSampleArray() {
return sampleArray;
}
private List<String> sampleList = new ArrayList<String>();
{
sampleList.add("listItem1");
sampleList.add("listItem2");
sampleList.add("listItem3");
}
public List<String> getSampleList() {
return sampleList;
}
private Map<Integer, String> sampleMap = new HashMap<Integer, String>();
{
sampleMap.put(new Integer(1), "one");
sampleMap.put(new Integer(2), "two");
sampleMap.put(new Integer(3), "three");
}
public Map<Integer, String> getSampleMap() {
return sampleMap;
}
private Map<String, String> sexMap = new HashMap<String, String>();
{
sexMap.put("00", "女");
sexMap.put("11", "男");
sexMap.put("RY", "人妖");
}
public Map<String, String> getSexMap() {
return sexMap;
}
private User user = new User();
{
user.setName("Eswar");
user.setEmail("mulanxi@yeah.net");
user.setSerialNumber("1,3");
}
public String execute() {
users = userMgr.listAll();
return "success";
}
public String getQuote() {
return "Don't think, just do";
}
public User getUser() {
return user;
}
private List<User> users;
private UserMgr userMgr = new UserMgr();
public List<User> getUsers() {
return users;
}
}
运行效果:http://localhost:7080/MyDynamicWeb/Sample.action?curUserId=309