Struts2基础之十一:OGNL实例



一:显示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;
	}
	
	
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值