Web开发最佳实践-Struts2之四数据传递

2019-09-29  本文已影响0人  紫荆秋雪_文

一、OGNL和ValueStack(值栈)

Struts2数据共享.png

1、Action把数据传递给JSP

Servlet共享值:
request.setAttribute(String name,Object value);
JSP获取值:
 通过EL来获取 ${name}
Action共享值:
        ActionContext.getContext().put(String name,Object value);
        ActionContext.getContext().getSession().put(String name,Object value);
JSP获取值:
        此时得依赖Struts2的标签:
         <%@ taglib uri="/struts-tags" prefix="s" %>
        再通过<s:property value=”OGNL的语法”>标签来获取数据.

2、OGNL

OGNL是Object Graphic Navigation Language(对象图导航语言[负责:对象和页面之间数据传递])的缩写,它是一个开源项目。

3、ValueStack(值栈)

4、获取ValueStack

ValueStack vs = request.getAttribute("struts.valueStack");
ValueStack vs = ServletActionContext.getRequest().getAttribute("struts.valueStack");
ValueStack vs = ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
ValueStack vs = ActionContext.getContext().getValueStack();

二、ValueStack的内部结构

ValueStack对象中有两个很重要的属性,这两个属性就是ValueStack的主要内部结构

<s:property value="属性名/位置"/>
<s:property value="#key"/>
ValueStack内部结构.png

1、Struts2 Debug标签

<%@ taglib uri="/struts-tags" prefix="s"%>
使用debug标签
<s:debug></s:debug>

注意:在Struts2的 2.5.20版本中<s:debug>标签默认是关闭的,需要在struts.xml中打开开发者模式

<constant name="struts.devMode" value="true" />

2、共享数据到ValueStack中的root区域

private void rootData() {
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        valueStack.getRoot().add(0, "Revan");
    }
root_add.png

root区域存储数据结构变化,在没有存储数据到root区域时,key:com.revanwang.stack.StackAction在栈顶

<s:property value="[0].top"/>
    private void rootData_push() {
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        valueStack.getRoot().push("Revan");
    }
root_push![root_set.png](https://img.haomeiwen.com/i2338406/0f0a53e32ad1f42a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) .png
<s:property value="[0].top"/>
    private void rootData_set() {
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        valueStack.set("name", "Revan");
    }
<s:property value="[0].name"/>
    @Setter
    @Getter
    private String name;

    @Override
    public String execute() throws Exception {

        this.name = "123456";

        return SUCCESS;
    }
root_getter.png
<s:property value="name"/>    //123456

3、共享数据到ValueStack中的context区域

    private void context() {
        ActionContext.getContext().put("name", "Revan12345");
    }
<s:property value="#name"/>
    private void context_session() {
        ActionContext.getContext().getSession().put("type", "Session-Revan");
    }
<s:property value="#session.type"/>
    private void context_application() {
        ActionContext.getContext().getApplication().put("type", "Application-Revan");
    }
<s:property value="#application.type"/>
上一篇 下一篇

猜你喜欢

热点阅读