Struts2 OGNL

原创
2016/10/31 14:44
阅读数 64

3、OGNL:Object-Graph Navigation Language

    3.1、OGNL基础

    对于OGNL而言,特别注意两点:

    1、存储值有两种方式:

        第一种:可以直接存储在root根对象中,之后根据OGNL的导航性可以直接获取到值。

	@Test
	public void test01() {
		try {
			User user = new User(1,"tangseng","唐长老");
			Department dep = new Department("大唐雷音寺");
			user.setDep(dep);
			//第二个参数是root,直接从root中取值
			System.out.println(Ognl.getValue("nickname", user));
			System.out.println(Ognl.getValue("dep.name", user));
		} catch (OgnlException e) {
			e.printStackTrace();
		}
	}

        第二种:可以存储到一个map的Context中,也同样可以根据导航性获取到值(如果要获取map中的
        值需要使用#)。

	@Test
	public void test02() {
		try {
			//将值存储到了context的map中
			Map<String,Object> ctx = new HashMap<String,Object>();
			User user = new User(1,"tangseng","唐长老");
			Department dep = new Department("大唐雷音寺");
			user.setDep(dep);
			Role role = new Role(1,"超级管理员");
			ctx.put("user", user);
			ctx.put("role", role);
			//以下表达式是在root中找,user是root
			System.out.println(Ognl.getValue("username", ctx, user));
			//#user.username是在ctx这个map中找,如果不加#会去root中取值
			System.out.println(Ognl.getValue("#user.username", ctx, user));
			//加了#是在ctx中找,不加#是在root中找
			System.out.println(Ognl.getValue("#role.name", ctx, user));
			//目前root是ctx所以可以直接取得到
			System.out.println(Ognl.getValue("role.name", ctx, ctx));
			//Ognl其实就是一个大的context,根的key就是root,所以可以通过#root.xx来取值
			System.out.println(Ognl.getValue("#root.username", ctx, user));
		} catch (OgnlException e) {
			e.printStackTrace();
		}
	}
			List<User> users = new ArrayList<User>();
			users.add(new User(1,"ts","唐僧"));
			users.add(new User(2,"wk","悟空"));
			users.add(new User(3,"bj","八戒"));
			users.add(new User(4,"ss","沙僧"));
			//如果要取list中的元素,需要通过#root[index]来完成取值
			System.out.println(Ognl.getValue("#root[0].nickname", users));

    2、OGNL可以直接调用方法

			//Ognl还可以完成方法的调用,可以直接调用root(user)中的sum()方法
			System.out.println(Ognl.getValue("#root[0].sum(1,3)", users));
			
			User user = new User();
			//传递字符串的值必须加单引号''
			System.out.println(Ognl.getValue("hello('world')", user));
			//可以通过调用list中的get()方法获取某个下标的对象,然后完成导航
			System.out.println(Ognl.getValue("get(0).nickname", users));
			//可以调用静态的方法,使用@可以调用静态方法,注意@System之后没有.
			Ognl.getValue("@System@out.println(sum(1,2))", user);

3.2、ValueStack

    1、struts2使用ValueStack来存储值,类图如下所示:

    2、运行过程

3.3、Struts2的常用标签

		//放置在ActionContext中,使用#来取值
		ActionContext.getContext().put("age", 20);
		this.setUsername("老李");
		this.setPassword("123");
		List<User> users = new ArrayList<User>();
		users.add(new User(1,"ts","唐僧"));
		users.add(new User(2,"wk","悟空"));
		users.add(new User(3,"bj","八戒"));
		users.add(new User(4,"ss","沙僧"));
		ActionContext.getContext().put("users", users);


		//此时u就是root的第一个元素了,在页面中默认就会先访问这个对象,而不是action中的
		User u = new User(10,"laozhang","老张");
		ActionContext.getContext().getValueStack().push(u);
	<h1>User List</h1>
	${username } ----- ${password } <br/>
	<s:property value="username"/>-----<s:property value="password"/>
	<s:property value="#root[1].username"/>
	<br/>
	${aaa }--------${bbb } <br/>
	<!-- 使用s:property来访问ActionContext中的数据都需要加#,在struts2.3之后,
		可以不用加#访问,但是在将来的开发中,只要是ActionContext中的数据一定要加个#访问 -->
	<s:property value="#aaa"/>-------<s:property value="#bbb"/>-------<s:property value="#ccc"/>
	<br/>
	${hello }
	<s:property value="#request.hello"/>--------
	<s:property value="#__component_stack"/>
	<!-- 调试 -->
	<s:debug/>
	<h1>User Show</h1>
	<!-- 和JSTL的标签不一致,JSTL是需要通过${条件} -->
	<s:if test="#age<10">
		年龄小于10
	</s:if>
	<s:elseif test="#age>10 and #age<20">
		未成年
	</s:elseif>
	<s:else>
		已经成年
	</s:else>

    迭代标签:

	<!-- 当使用了s:iterator之后,会将相应的迭代对象放置到CompoundRoot中 -->
	<!-- 当定义了var="u"之后,会将这个迭代的对象再在ActionContext中存一份,
		ActionContext中的key就是u。
        status="st":会创建一个IteratorStatus的对象,通过这个对象可以获取一些迭代索引等数据,
        (也是放置到ActionContext) -->
	<s:iterator value="users" var="u" status="st">
		<div <s:if test="#st.odd">style="background:#ff0"</s:if>>
		<s:property value="#u.id"/>-----<s:property value="username"/>-----<s:property value="nickname"/>
		<s:property value="#st.odd"/>-----<s:property value="#st.last"/>-----
		<s:property value="#root[1].username"/>
		</div>
		<br/>
	</s:iterator>
	<s:property value="username"/>

 

展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部