• struts2 ValueStack


    OGNL表达式语言介绍

    OGNL是Object Graphic Navigation Language(对象图形导航语言)的缩写。Struts2框架使用OGNL作为默认的表达式语言。

    OGNL相对于其他表达式语言的优势:

    1、  支持对象方法的调用,如xxx.doSomeSpecial();

    2、  支持类静态的方法调用和值访问,表达式的格式:

    @[类全名(包括路径)]@[方法名 | 值名],例如: @java.lang.String@format(‘foo%s’,’bar’)或@tutorial.MyConstant@APP_NAME

    3、  支持赋值操作和表达式串联

    4、  访问OGNL上下文(OGNL context)和ActionContext

    5、  操作集合对象

    Ognl有一个上下文(Context)的概念,说白了上下文就是一个Map结构,它实现了java.utils.Map接口

    理解struts2中的ValueStack

    ValueStack实际上是一个接口,在Struts2中是利用OGNL时,实际上使用的是实现类该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础

             ValueStack(值栈):贯穿整个Action生命周期(每个Action类的实例都拥有一个ValueStack对象),相当于一个数据库的中转站,在其中保存当前Action对象和其他相关对象。

             Struts框架把ValueStack对象保存在名为“struts.valueStack”的请求属性中。

    在ValueStack对象内部有两个逻辑部分:

             ObjectStack:struts把动作和相关对象压入ObjectStack中---List

             ContextMap:struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中

    Struts会把下面这些映射压入ContextMap中:

    Parameters:

    Request:

    Session:

    Application:

    Attr:该map将按顺序检索下面属性:request,session,application

    package cn.itcast.ognl;
    
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.util.CompoundRoot;
    import com.opensymphony.xwork2.util.ValueStack;
    
    public class ValueStackAction extends ActionSupport {
        
        public String test(){
            System.out.println("ValueStack ********** test");
            
            HttpServletRequest req=ServletActionContext.getRequest();
            req.setAttribute("username", "request_username");
            
            Map<String,Object> sessionMap=ServletActionContext.getContext().getSession();
            sessionMap.put("username", "session_username");
            
            ServletContext application=ServletActionContext.getServletContext();
            application.setAttribute("username","application_username");
            
            
            
            /*
             * 获取ValueStack对象
             * valueStack对象存储在request的属性中,属性名为“struts.valueStack”
             */
            /* 方法一: */
             HttpServletRequest request=ServletActionContext.getRequest();
            
            ValueStack stack= (ValueStack) request.getAttribute("struts.valueStack");
            System.out.println(stack);
            
            /*方法二:*/
            stack=ServletActionContext.getContext().getValueStack();
            System.out.println(stack);
            
            /*
             * 值栈中两个属性用来存数据;
             *  public abstract Map<String, Object> getContext();
             *  public abstract CompoundRoot getRoot();
             *  public class CompoundRoot extends CopyOnWriteArrayList<Object> //CompoundRoot对象是list集合
             *  
             *  context存储键值对信息:request、session、request中的信息
             *  root中存储其他信息
             */
            
            /*Map<String,Object> o=stack.getContext();
            Set<String> sets=o.keySet();
            for(String s:sets){
                System.out.println("key = "+s);
                System.out.println("value = "+o.get(s));
                
            }*/
            /*
             * context中存储的好多信息。包括一般信息( ActionContext,actionInvocation,errors, action,struts.actionMapping)和Map集合(request,ServletContext,session,parameters)
             */
            CompoundRoot  root=stack.getRoot();
            for(Object obj:root){
                System.out.println(obj);
            }
            /*
             * cn.itcast.ognl.ValueStackAction@207a8313
             * com.opensymphony.xwork2.DefaultTextProvider@4b33650d
             */
            
            /* ActionContext,ServletContext,ognlContext是一个工具类,可以通过它访问其他数据 */
            
            
            
            
            return "ValueStack";
        }
    
    }

  • 相关阅读:
    MT【235】两道函数题
    MT【234】正方形染色(二)
    MT【233】染色正方形
    MT【232】展开式中的系数
    MT【231】棋子方法数
    MT【230】一道代数不等式
    MT【229】最小值函数
    MT【228】整数解的个数
    Python-list中的排序
    IO多路复用
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5898938.html
Copyright © 2020-2023  润新知