struts2(9)OGNL表達式與struts2結合原理

 

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標籤中的體現

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章