(7)值栈和OGNL

----------------------------------------------------------------------------------------ActionContext----------------------------------------------------------------------------------------

1、值栈是对每个请求的内存数据中心,它能够线程安全的为每个请求提供数据存取服务。

2、一个请求对应一个值栈,值栈对该请求中的数据进行了封装。

3、关于值栈中所存放的值:

        a、Action的实例,可以通过OGNL来访问Action中的属性值。

        b、OGNL表达式运算的值,可以设置到值栈中,可以主动访问值栈对象,强行设置。

        c、OGNL表达式产生的中间变量,比如在Struts2标签中的循环标签,其中的循环变量就存放在值栈中。

4、关于ActionContext的基本信息:

       a、它是Action运行的上下文,每个ActionContext是一个基本的容器,包含Action运行需要的数据,如请求参数,并且它是线程安全的。

       b、其内主要存放Request的parameters、Attribute,Session中的Attribute,Application中的Attribute,以及ValueStack;

       c、 attr:依次在page、reqeust、session、application总搜索。

5、ActionContext的基本使用:

       a、获取ActionContext的两种方式:A:ActionContext.getContext()      B:actionInvocation.getInvocationContext();

       b、ActionContext主要是用来存取数据的,需要相应的put和和set方法。

                 A:定义MyPreResult.java

package listener;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;
/**
 * 在Result之前修改test这个属性
 */
public class MyPreResult implements PreResultListener {

    @Override
    public void beforeResult(ActionInvocation actionInvocation, String arg1) {
        actionInvocation.getInvocationContext().getValueStack().setValue("test", "updated...");//修改ValueStack中的Action属性中中test的值
}
          

             B:定义ChainAction.java

package action;

import listener.MyPreResult;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ChainAction extends ActionSupport{
    private String test;
    
    public String getTest() {
        return test;
    }
    public void setTest(String test) {
        this.test = test;
    }
	@Override
	public String execute() throws Exception {
		ActionContext acx = ActionContext.getContext();
		MyPreResult pre = new MyPreResult();
		acx.getActionInvocation().addPreResultListener(pre);//将MyPreResult注册到当前的Action,就是让MyPreResult在当前的Action起作用。
		return super.execute();
	}
	
}
     

           C、定义1.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="${pageContext.request.contextPath }/chainAction.action" method="post">
		<input type="test" name="test" />
		<input type="submit" value="提交" />
	</form>
</body>
</html>

          D、定义2.jsp

           

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<hr/>
	${test }
</body>
</html>
----------------------------------------------------------------------------------------OGNL---------------------------------------------------------------------------------------
6、OGNL概述。

              是对象图导航语言(Object-Graph Navigation Language 的缩写),它是一种功能强大的表达式语言。

7、常量与操作符:在OGNL中,可以使用Java的常量操作和数学运算,但是String的常量可以使用单引号或者双引号括起来,但是单个字符也是使用单引号,所以只有在超过一个字符的时候,使用单引号界定的常量

才是String类型,如果需要定义一个包含单个字符的String 常量,就需要转义。

下面输出的是"test"字符串常量。

<s:property value="'test'"/>
下面输出的是15,即运算后的值。
<s:property value="7+8"/>
8、调用静态方法和静态常量。

           a、调用静态方法:

<s:property value="@utils.MyStatic.staticMethod">

           b、调用静态属性:

             

<s:property value="@utils.MyStatic.@staticField">

9、使用OGNL访问ActionContext:从栈顶到栈底寻找第一个匹配的对象,如果有多个,则只取第一个。

       a、可以通过加上"#"来访问parameter、reqeust、session、application、attr中的值。

       b、如果没有“#”则代表直接访问值栈。由于Action对象在栈顶,所以可以直接访问Action中的属性值而不用加上“#”。

10、访问数组、List、Map:

        a、使用如集合/数组[索引值].属性的方法来访问。

        b、使用如map[‘key’].属性的方法来访问。

----------------------------------------------------------------------------------------ActionContext与ServletActionContext---------------------------------------------------------------------------------------

0、ServletActionContext继承自ActionContext。

1、ActionContext中的reqeust、session、application中只是存放其中的值。

2、获取真正的reqeust/response可以实现ServletRequetAware/ServletResponsetAware接口。

3、如果只是想获取web对象中的数据,应该优先使用ActionContex对象。

4、不要在Action的构造方法中使用ActionContext.getContext()方法。

5、获取HttpServletRequest、HttpServletResponse、pageContext、ServletContext对象,可以用ServletActionContext的静态方法,其中HttpSession通过获取到的request获取。

6、实现SessionAware接口可以获取HttpSession中的值Map。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值