OGNL表達式與struts2結合原理
valuestack
隊列:先進先出
棧:先進後出
list集合製作棧結構容器
push 壓棧
list.add(0,xxx) 從前面增減
pop彈棧
list.remove(0) 把零號元素移除 並返回0號數據
查看接口valuestack的實現類OgnlValueStack
public class OgnlValueStack implements Serializable, ValueStack, ClearableValueStack, MemberAccessValueStack {
CompoundRoot root;
transient Map<String, Object> context;
}
public class CompoundRoot extends ArrayList {
public CompoundRoot() {
}
public CompoundRoot(List list) {
super(list);
}
public CompoundRoot cutStack(int index) {
return new CompoundRoot(this.subList(index, this.size()));
}
public Object peek() {
return this.get(0);
}
public Object pop() {
return this.remove(0);
}
public void push(Object o) {
this.add(0, o);
}
}
可以看到compoundRoot是根據list來實現的。
在取struts中的root棧屬性的時候會遵循先進後出的原理。
寫一個action
public class Demo12Action extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("Demo12Action");
return SUCCESS;
}
}
配置struts.xml
<action name="Demo12Action" class="cn.ycsj.struts.Demo11Action" method="execute">
<result name="success" >
/showvs.jsp
</result>
</action>
showvs.jsp調試
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:debug></s:debug>
</body>
</html>
值棧
root棧
默認情況下棧中放置的是當前的action對象
context
stackcontext中放置的actioncontext (數據中心)
2.ognl表達式和struts2結合的體現
2.1參數接收中的體現
屬性驅動
對象驅動
模型驅動
實現modeldrive接口,在params攔截器前執行,將接收到的參數壓入棧頂。
如何獲得值棧
ValueStack valueStack = ActionContext.getContext().getValueStack(); valueStack.push(xxx);
2.2配置文件中的體現
案例在重定向action中傳遞參數
Demo13Action
package cn.ycsj.struts;
import com.opensymphony.xwork2.ActionSupport;
public class Demo13Action extends ActionSupport {
private String name;
@Override
public String execute() throws Exception {
name = "jim" ;//假設是從數據庫中取出來的
System.out.println("Demo13Action");
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
struts.xml
<action name="Demo13Action" class="cn.ycsj.struts.Demo13Action" method="execute">
<result name="success" type="redirectAction">
<param name="actionName" >Demo12Action</param>
<param name="namespace">/</param>
<!--如果添加的參數struts看不懂,就會做我參數跟在附加重定向請求後面
如果參數是動態的可以使用${}包裹ognl表達式動態取值-->
<param name="name">${name}</param>
</result>
瀏覽器訪問http://localhost:8080/HibernateTest/Demo13Action.action
重定向到http://localhost:8080/HibernateTest/Demo12Action.action?name=jim
2.3struts2標籤中的體現