----------------------------------------------------------------------------------------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。