zoukankan      html  css  js  c++  java
  • Struts2入门03

    三、Struts与OGNL

    1、OGNL基本使用

    OGNL:对象导航图语言/对象视图导航语言(Object Graph Navigation Language)

    OGNL分为root与context区域,在Strtus2中,ValueStack就是OGNLContext

    那么ValueStack中也就有root(栈)与context(ActionContext)

    并且ActionContext与ValueStack是相互引用的,所以获取ValueStack的方式为:

    ActionContext.getcontext().getValueStack();

    root:存放当前Action对象(栈结构)

    context:存放ActionContext

    准备工作:
    导包:struts2的默认包中已经包含了OGNL需要的jar包

    public class OgnlDemo1 {
    
        //展示OGNL语法
        @Test
        public void fun1() throws Exception {
            //准备OGNLContext
            //准备root
            User rootUser=new User("tom",18,new Date());
            //准备context
            Map<String,User> context = new HashMap();
            context.put("user1", new User("jack",20,new Date()));
            context.put("user2", new User("rose",22,new Date()));
            
            OgnlContext oc = new OgnlContext();
            
            oc.setRoot(rootUser);
            oc.setValues(context);
            //书写OGNL
            
            //取root中user对象的name属性
            String name=(String) Ognl.getValue("name", context, oc.getRoot());
            System.out.println(name);
            int age=(int) Ognl.getValue("age", context,oc.getRoot());
            System.out.println(age);
            
            //取出contxt中的属性    #代表要从取值
            String name1=(String) Ognl.getValue("#user1.name", context, oc.getRoot());
            System.out.println(name1);
        }
        
        
        //基本语法演示
        //为属性赋值
        @Test
        public void fun2() throws Exception {
            //准备OGNLContext
            //准备root
            User rootUser=new User("tom",18,new Date());
            //准备context
            Map<String,User> context = new HashMap();
            context.put("user1", new User("jack",20,new Date()));
            context.put("user2", new User("rose",22,new Date()));
            
            OgnlContext oc = new OgnlContext();
            //将rootUser作为root部分
            oc.setRoot(rootUser);
            //将context作为context部分
            oc.setValues(context);
            //书写OGNL
            
                    
            //OGNL修改值root
             Ognl.getValue("name='jerry'", context, oc.getRoot());
             //取值
             String name=(String)Ognl.getValue("name", context, oc.getRoot());
            System.out.println(name);
            
            //OGNL修改context 
             Ognl.getValue("#user1.name='张三',#user2.name='李四'",context, oc.getRoot());
            String cname=(String) Ognl.getValue("#user1.name",context, oc.getRoot());
            String cname1=(String)Ognl.getValue("#user2.name",context, oc.getRoot());
            System.out.println(cname+"_"+cname1);
            
            //OGNL调用方法 
            System.out.println(Ognl.getValue("getName()", context, oc.getRoot()));
            System.out.println(Ognl.getValue("#user1.setName('lucy'),#user1.getName()", context, oc.getRoot()));
            
            //OGNL调用静态方法 使用    @符号完整类名加上@方法名
            System.out.println(Ognl.getValue("@java.lang.Math@random()",context, oc.getRoot()));
            System.out.println(Ognl.getValue("@java.lang.Math@PI",context, oc.getRoot()));
            System.out.println(Ognl.getValue("@@PI",context, oc.getRoot()));
            
    
    
        }
        
        //OGNL创建对象
        @Test
        public void fun3() throws Exception 
        {
            OgnlContext oc = new OgnlContext();
            int num=(int) Ognl.getValue("{'tom','jerry','lucy','rose'}.size()", oc,oc.getRoot());
            String name=(String) Ognl.getValue("{'tom','jerry','lucy','rose'}[0]", oc,oc.getRoot());
            String name1=(String) Ognl.getValue("{'tom','jerry','lucy','rose'}.get(0)", oc,oc.getRoot());
    //        System.out.println(num);
    //        System.out.println(name);
    //        System.out.println(name1);
            
            //创建Map集合 并取值
            int num1=(int) Ognl.getValue("#{'name':'tom','age':18}.size()", oc,oc.getRoot());
            String name2=(String) Ognl.getValue("#{'name':'tom','age':18}['name']", oc,oc.getRoot());
            int age=(int) Ognl.getValue("#{'name':'tom','age':18}.get('age')", oc,oc.getRoot());
            System.out.println(num1);
            System.out.println(age);
            
            
        }
        
    }

     2、OGNL与Struts2结合

      在配置文件中使用OGNL动态获取资料参数,需要在Action设置对应属性

    public class ValueStackDemo extends ActionSupport {
    
        private String name;
        private String address;
        @Override
        public String execute() throws Exception 
        {
            ValueStack valueStack = ActionContext.getContext().getValueStack();
    
            name="zhangsan";
            address="重庆";
    
            
            return SUCCESS;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        
        
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <package name="ognl" extends="struts-default" namespace="/">
            <action name="valueS" class="Ognl.ValueStackDemo">
                <result name="success" type="redirectAction">
                    <param name="actionName">valueST</param>
                    <param name="namespace">/</param>
                    <param name="name">${name}</param>
                    <param name="address">${address}</param>
                </result>
            </action>
            
            <action name="valueST" class="Ognl.ValueSTest">            
            </action>
        </package>
    </struts>
    http://localhost:8080/Struts2_day01/valueST.action?name=zhangsan&address=重庆

    3、Struts2中的request

    由于request被struts2包装,在JSP页面获取ActionContext.getcontext().put(key,value)中的值的时候的获取顺序即request.getAttribute()的获取:

    1、原生request域

    2、查找ValueStack的栈部分(root)

    3、查找ValueStack的context部分(ActionContext)

    4、Struts2参数接受与OGNL

    不管是属性驱动还是对象驱动还是模型驱动的方式获取参数,

    其原理就是将获取到的页面参数放入栈中,再通过OGNL表达式赋值

  • 相关阅读:
    vue父子组件传参之ref
    新版chrome移动端踩坑
    vue动态绑定class 选中当前列表变色
    vue 利用computed对文章列表进行排序
    vue数组排序
    Vue+Koa2移动电商实战 (十一)前后端通讯和跨域处理
    jQuery基础知识--Form基础
    关于可变数组的一点小知识
    锋利的jQuery读书笔记---jQuery中动画
    锋利的jQuery读书笔记---jQuery中的事件
  • 原文地址:https://www.cnblogs.com/harriets-zhang/p/13442312.html
Copyright © 2011-2022 走看看