一:显示JSP
OGNL主要是显示时候的筛选公式,总结在一个JSP里,用法比较全了
<h2>结果:</h2> <br>
1.从valueStack中直接取得参数<br>
<a href="http://127.0.0.1:8080/Struts2Project/ognl?username=abc&password=123">http://127.0.0.1:8080/Struts2Project/ognl?username=abc&password=123</a><br/>
username:<s:property value="username" /> <br/>
password:<s:property value="password" /> <br/>
<br/><br/>
2.从valueStack中直接取得action对象的普通方法<br/>
(没有传参,且action不构造时,值为null)<br>
<a href="http://127.0.0.1:8080/Struts2Project/ognl?user.name=abc&user.age=123">http://127.0.0.1:8080/Struts2Project/ognl?user.name=abc&user.age=123</a><br/>
user.name:<s:property value="user.name" /> <br/>
user.age:<s:property value="user.age" /> <br/>
<br/><br/>
3.使用取得的对象中的方法<br/>
password.length():<s:property value="password.length()" /> <br/>
user.someMethod():<s:property value="user.someMethod()" /> <br/>
<br/><br/>
4.使用静态方法(必须要配置struct.xml的allowStaticMethodAccess)<br/>
@com.rt.demo.VO.VOUser@someStaticMethod():<s:property value="@com.rt.demo.VO.VOUser@someStaticMethod()" /> <br/>
@@max(1,2):<s:property value="@@max(1,2)" /> <br/>
<br/><br/>
5.使用构造方法<br/>
@com.rt.demo.VO.VOUser@someStaticMethod():<s:property value="new com.rt.demo.VO.VOUser('rt',23)" /> <br/>
<br/><br/>
6.访问集合<br/>
userList[0]:<s:property value="userList[0]" /> <br/>
userList.{name}(所有name的集合):<s:property value="userList.{name}" /> <br/>
userList[0].age:<s:property value="userList[0].age" /> <br/>
userSet:<s:property value="userSet" /> <br/>
userSet[1](这没值,因为哈希表的顺序没有任何意义):<s:property value="userSet[1]" /> <br/>
userMap:<s:property value="userMap" /> <br/>
userMap.map1:<s:property value="userMap.map1" /> |<s:property value="userMap['map1']" /><br/>
userMap.keys(遍历所有key):<s:property value="userMap.keys" /> <br/>
userMap.values(遍历所有v):<s:property value="userMap.values" /> <br/>
userMap.size():<s:property value="userMap.size()" /> <br/>
<br/><br/>
7.投影(筛选)<br/>
<!-- ?开头代表遍历所有List元素,取出age为4的元素的集合 -->
userList.{?#this.age==1}:<s:property value="userList.{?#this.age==4}" /><br/>
<!-- 要想从age为1的元素的集合中,取出一个值,要制定序号 -->
userList.{?#this.age==1}[0]:<s:property value="userList.{?#this.age==4}[0]" /><br/>
<!-- ^开头代表取出所求集合的第一个,$代表要这个集合最后一个 -->
userList.{^#this.age>1}:<s:property value="userList.{^#this.age>1}" /><br/>
userList.{$#this.age>1}:<s:property value="userList.{$#this.age>1}" /><br/>
<!-- 用这个方法看看集合中有没有值 -->
userList.{?#this.age>1} == null<s:property value="userList.{?#this.age>1} == null" /><br/>
<br/><br/>
8.[]中括号,可以取得valueStack<br/>
<!-- 中括号代表值栈,【0】就能访问到其中的那两个对象,【1】只能访问到偏向栈底的对象 -->
[0]:<s:property value="[0]" /><br/>
[1]:<s:property value="[1]" /><br/>
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
“#”主要有三种用途:
1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称 作用 例子
parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id")
request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName")
session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName")
application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName")
attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100};
3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
“%”的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
<hr />
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
“$”有两个主要的用途 :
1. 用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》
2. 在Struts 2配置文件中,引用OGNL表达式,如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
二:测试action
package com.rt.struts2.actionDemo;
import java.util.*;
import com.opensymphony.xwork2.ActionSupport;
import com.rt.demo.VO.VOUser;
public class OgnlAction extends ActionSupport
{
//普通属性
private String username;
private String password;
//inner
private VOUser user;// = new VOUser();如果这里或ognl中没有new、且没有传参进来,valueStack中的user就会是null
//集合
private List<VOUser> userList = new ArrayList();
private Set<VOUser> userSet = new HashSet();
private Map<String,VOUser> userMap = new HashMap();
public String execute() {
System.out.println("_OgnlAction_execute()");
//设置集合
userList.add(new VOUser("张三",3));
userList.add(new VOUser("李四",4));
userSet.add(new VOUser("王五",5));
userSet.add(new VOUser("赵六",6));
userMap.put("map1",new VOUser("钱七",7));
userMap.put("map2",new VOUser("孙八",8));
return SUCCESS;
}
//setter&getter
public String getPassword() {
return password;
}
public VOUser getUser() {
return user;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUser(VOUser user) {
this.user = user;
}
public void setUsername(String username) {
this.username = username;
}
public List<VOUser> getUserList() {
return userList;
}
public void setUserList(List<VOUser> userList) {
this.userList = userList;
}
public Set<VOUser> getUserSet() {
return userSet;
}
public void setUserSet(Set<VOUser> userSet) {
this.userSet = userSet;
}
public Map<String, VOUser> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, VOUser> userMap) {
this.userMap = userMap;
}
}
actin中用到的内置对象VO:
package com.rt.demo.VO;
import com.opensymphony.xwork2.ActionSupport;
public class VOUser
{
//普通属性
private String name;
private int age;
//构造
public VOUser()
{
}
public VOUser(String name,int age)
{
this.name = name;
this.age = age;
}
//重写
public String toString()
{
return ":"+ name +"-"+ age;
}
//普通方法
public String someMethod()
{
return "someMethod=>"+this.toString();
}
//静态方法
public static String someStaticMethod()
{
return " =>StaticMethod()";
}
//setter&getter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}