栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

struts2之ognl

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

struts2之ognl

本文章给大家介绍下struts2框架的子控制器类的赋值操作及原理

目录

OGNL

ValueStack

ActionContext       

OGNL在页面中获取后台数据格式


OGNL

OGNL(Object-Graph Navigation Language的简称),对象图导航语言,它是一门表达式语言,除了用来设置和获取Java对象的属性之外,另外提供诸如集合的投影和过滤以及lambda表达式等

接下来给大家展示两个JavaBean类,整个OGNL的介绍,将围绕着这两个类展开

package struts.util;


public class Manager {
	private String name;

	public Manager() {
		super();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Manager [name=" + name + "]";
	}

}

package struts.util;


public class Employee {
	private String name;

	private Address address;

	private Integer salary;

	public Employee() {
		super();
	}

	public Employee(String name, Integer salary) {
		super();
		this.name = name;
		this.salary = salary;
	}

	public Integer getSalary() {
		return salary;
	}

	public void setSalary(Integer salary) {
		this.salary = salary;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Employee [name=" + name + ", address=" + address + ", salary=" + salary + "]";
	}

}

首先介绍一下Ognl的类

         赋值和取值方法

package struts.util;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;


public class Onglexpression {
	private Onglexpression() {
	}

	
	public static Object getValue(String expression, OgnlContext ctx,
			Object rootObject) {
		try {
			return Ognl.getValue(expression, ctx, rootObject);
		} catch (OgnlException e) {
			throw new RuntimeException(e);
		}
	}

	
	public static void setValue(String expression, OgnlContext ctx,
			Object rootObject, Object value) {
		try {
			Ognl.setValue(expression, ctx, rootObject, value);
		} catch (OgnlException e) {
			throw new RuntimeException(e);
		}
	}
}

OGNL上下文

 1)OgnlContext(OGNL上下文)其实就是Map集合


 2)OgnlContext由根对象(1)+非根对象(N)组成
      非根对象要通过"#key"访问,根对象可以省略"#key"
        

在这里我是把经理设置为根对象

在这里是一个经理对应多个员工,当你去找经理时,可以直接找经理也可以找经理的名字,但是找员工就得根据姓名去查找,这就是OGNL上下文的取值和赋值原理

        将员工和经理放到OGNL上下文当中去
        ctx.put("employee", e);
        ctx.put("manager", m);
        ctx.setRoot(m);// 设置OGNL上下文的根对象  在这里我是把经理设置为根对象

        经理        

                取值:Onglexpression.getValue("name", ctx, m);

                           Onglexpression.getValue("#mapper.name", ctx, m);

                赋值:Onglexpression.setValue("name", ctx, m, "小明");

        员工:

                取值:Onglexpression.getValue("#manager.name",ctx, e);

                赋值:Onglexpression.setValue("#employee.name", ctx, e, "小芳");

OGNL表达式由上往下:(值栈,先进后出的数据结构)

以下为测试类

package struts.util;

import ognl.OgnlContext;
import ognl.OgnlException;

public class Demo1 {

	
	public static void main(String[] args)  {
		Employee e = new Employee();
		e.setName("小李");

		Manager m = new Manager();
		m.setName("张经理");

		// 创建OGNL下文,而OGNL上下文实际上就是一个Map对象
		OgnlContext ctx = new OgnlContext();

		// 将员工和经理放到OGNL上下文当中去
		ctx.put("employee", e);
		ctx.put("manager", m);
		ctx.setRoot(m);// 设置OGNL上下文的根对象

		
		// 表达式name将执行e.getName(),因为e对象是根对象(请注意根对象和非根对象表达式的区别)
		//从OGNL上下文中的根对象Manager中获取name表达式的值
		

		// 表达式#manager.name将执行m.getName(),注意:如果访问的不是根对象那么必须在前面加上一个名称空间,例如:#manager.name
		String managerName = (String) Onglexpression.getValue("#manager.name",ctx, e);//#manager.name指名道姓
		System.out.println(managerName);

		// 当然根对象也可以使用#employee.name表达式进行访问
		

		
		//将OGNL上下文的根对象Manager的name表达式赋值
		

		
		//将OGNL上下文的非根对象employee的name表达式赋值
		
	}

}

 注:在Struts2中OGNL Context上下文的实现者为ActionContext


ValueStack

1、什么是值栈(案例:Employee)
      先进后出的数据结构,弹夹 push/pop

 类似于作用域的方式用来存值和取值,在页面和后台之间进行数据传递。在Action中将数据存入值栈,然后在页面中通过EL表达式或OGNL表达式取值。

2、值栈的存储位置

值栈存储在Action对象中,每创建一个Action对象(ActionContext),就是创建一个ValueStack值栈对象,同一个Action对象中只会有一个ValueStack

3、在Action中值栈对象存取值
4、为什么要使用ValueStack作为根对象
      ValueStack是一个容器,放入值栈中的对象都可视为根对象

以下是ValueStack的案例        

package struts.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import struts.util.Student;

public class VsAction {
    
    public String getValueStack(){
      //1、获取ActionContex上下文
        ActionContext ac = ActionContext.getContext();
      //2、从ActionContex上下文获取根对象valuestack(值栈,先进后出的数据结构)
        ValueStack vs = ac.getValueStack();

        //存栈
        vs.push(new Student("zs","p001"));//位于第一个下标3
        vs.push(new Student("ls","p002"));//位于第二个下标2
        vs.push(new Student("ww","p003"));//位于第三个下标1
        vs.push(new Student("xl","p004"));//位于第四个下标0

        while(vs.size()!=0){
            //出栈
            Object pop = vs.pop();
            System.out.println(pop);
        }

        return  null;
    }



    public  String longin(){
        //1、获取ActionContex上下文
        ActionContext ac = ActionContext.getContext();
        //每次请求相同,ActionContext地址相同,不同请求,ActionContext地址不同(多例)
        //不同请求,每次都会重写new一个ActionContex上下文,就是重新创建一个valuestack
        // 同一个子控制器类对象中只有一个valuestack
        System.out.println(ac);
        //存在ActionContext Map集合中
        ac.put("username","张三");

        return "login";
    }

}

ActionContext       

在这里解释了为什么ModelDriven返回实体和Action的属性重名,ModelDriven中优先级更高?

1、ActionContext 的ValueStack数据结构是先进后出

2、先把Action类的定义的数据先存,再存User

3、进行赋值,先取出的是User进行赋值

package struts.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
import struts.entity.UserLogin;

public class UserAction implements ModelDriven {
    private String userName;
    private String password;
    private  UserLogin user=new UserLogin();

    @Override
    public UserLogin getModel() {
        return user;
    }


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }




    
    
    //第一种没有实现ModelDriven直接赋值到子控制器类中的属性
    //第二种 优先赋值ModelDriven返回值对象,再赋值到Action中

    //*.action--> struts2的核心过滤器 --》创建Action -->创建ActionContext上下文并往其中注入五个常用对象(session、request、application、parameters、valuestack)--》返回结果码-->跳转页面
    public String userLongin(){
//        System.out.println("userName="+userName+"       password="+password);
        System.out.println("user="+user);
        return  "login";
    }


}

OGNL在页面中获取后台数据格式

    一、数组、集合














二、在select下拉框中使用map和list自动填入html和value

map下拉框:

list下拉框:

map:

  三、对象

最后可以在页面中使用

标签,查看ValueStack的栈内数据

 

注:在使用此标签要先子控制器类,创建ActionContext上下文,创建ValueStack

代码地址    提取码:tgnv

至此,struts2之ognl介绍完毕,由于作者水平有限难免有疏漏,欢迎留言纠错。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号