Struts2--ONGL--值栈

ONGL:用来访问栈里对象属性的语言,通常由Struts标签来解析,

注意:要在接续OGNL的页面加入<%@ taglib prefix="s" uri="/struts-tags"%>,否则,栈内信息不回被访问到,也就是<s:debug></s:debug>访问栈内标签不起作用(暂时先这么叫吧)

值栈:

栈的特点:后入先出

1.首先要通过ActionContext来获取值栈对象ValueStack。

		ActionContext  ac =ActionContext.getContext();
		//获取值栈对象
		ValueStack  vs = ac.getValueStack();

  

 值栈分为对象站和Map栈

对象栈:存放Action的实例及相关对象

 Map栈:存放封装web资源的map对象,实际是ActionContext的引用

application
session
request
parameters
attr通用属性
按照request session application的循序查找属性值

 方法:

push(Object)把对象压入对象栈的顶部

pop()弹出返回对象栈的顶部对象

peek()得到对象栈的顶部对象,并不弹出

OGNL访问方式:

1.使用Struts标签

1.1访问对象栈:按先后顺序访问(后入先出)

value=“[起始索引].属性名”   指定匹配的起始索引位置(索引从0开始)

1.2访问Map栈

如果作用域=attr
按照request session application的循序查找建值

1.3访问类的静态方法和静态属性

首先要在Struts的配置文件里打开访问静态方法的代码,如下:

方法:

value=“@全类名@方法名(参数列表)”
value=“@全类名@静态属性名”

1.4访问对象的集合属性


输出集合内容:value=“[起始索引].集合属性名”
访问集合单元数组和List:value=-"[起始索引].集合属性名[索引]"
Map:value=-"[起始索引].集合属性名[‘key’]"

获取集合长度
数组:value=“[起始索引].集合属性名.length”


List 和Map:value=“[起始索引].集合属性名.size”   或   value=“[起始索引].集合属性名.size()”


判断内容是否为空:value=“[起始索引].集合属性名.isEmpty()”

2.使用EL

 访问map栈:${作用域。key}

访问对象站:
按先后顺序匹配属性名,只输出第一个,后面的忽略
${属性名}
不能指定查找的起始位置

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
<%

application.setAttribute("app","application");
application.setAttribute("ses","application顶顶顶顶");


session.setAttribute("ses", "回话的测试内容");
session.setAttribute("app", "回话的测试内容fffff");

request.setAttribute("req", "request");

%>
<a href="test.do?userID=666666&date=123">下一个页面</a>

</body>
</html>

  

<?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>
	<!-- 覆盖默认的过滤的扩展名 -->
	<constant name="struts.action.extension" value="do,action,,"></constant>
	
	
	<!-- 启用动态调用 
	<constant name=""></constant>-->
	
	<!-- 允许调用静态方法和静态属性 -->
	<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
	
	<!-- 定义包 -->
	<package name="text" extends="struts-default" >
		<action name="test" class="com.hanqi.action.TestAction" >
		
			<result>test.jsp</result>
			
		</action>
		
		
	
	</package>

</struts>

  

package com.hanqi.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

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

public class TestAction {
	
	private String userID;
	
	private String  date;
	
	public String getUserID() {
		return userID;
	}


	public void setUserID(String userID) {
		this.userID = userID;
	}


	public String getDate() {
		return date;
	}


	public void setDate(String date) {
		this.date = date;
	}


	public String testtag()
	{
		return"success";
	}
	
	
	
	//访问值栈
	public String execute()
	{
		ActionContext  ac =ActionContext.getContext();
		//获取值栈对象
		ValueStack  vs = ac.getValueStack();
		
		
		//随机数对象
				vs.push(new Random());
				
		//向对象栈压入对象
		vs.push(new  Date());
		
		//对象本身是集合
		List<String> ls = new ArrayList<>();
		ls.add("ABC");
		ls.add("DEF");
		vs.push(ls);
		
		//对象的属性是集合
		TestList  tl = new TestList();
		tl.setMyList(ls);
		vs.push(tl);
		
		
		
		return "success";
	}

}

  

 

  

<%@page import="java.util.Date"%>
<%@page import="com.opensymphony.xwork2.util.ValueStack"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 加载OGNL的自定义标签库 -->
    <%@ taglib prefix="s" uri="/struts-tags"%>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<% 
ActionContext  ac =ActionContext.getContext();
ValueStack  va = ac.getValueStack();
//弹出并返回顶部的对象
//Date dt =(Date)va.pop();

//得到顶部对象
//Date dt = (Date)va.peek();

//out.print(dt);

%>
<br>

使用 OGNL访问
<br><br>
EL方式:
${date}
<br><br>
${userID }


<br>
访问map栈:<br>
${sessionScope.ses }


<br><br>
标签方式:
<s:property value="[1]['date']"/><br>
<s:property value="userID"/><br>
<s:property value="[1].date"/>
<br>
<s:property value="[0].userID"/>
<br>
默认输出顶部对象(value不写,)
<s:property/>
<br>
访问map栈***************
<br>
<s:property value="#session.ses"/><br>
<s:property value="#parameters.userID"/><br>

<br>
app=<s:property value="#application.app"/><br>
<s:property value="#request.req"/><br>
<br><br>
ses=<s:property value="#attr.ses"/><br>

<br>
调用实例方法:<br>
产生随机数=<s:property value="[0].nextInt(100)"/>

<br><br>
调用静态属性和对象方法:<br>
随机数:<s:property value="@java.lang.Math@random()"/>
<br>
PI=<s:property value="@java.lang.Math@PI"/>

<br><br>
访问list
<br>
list的长度=<s:property value="[0].size()"/>      <!--size后面的()不可去掉  -->
<br>
<s:property value="[0].get(0)"/>

<br><br>
访问对象的集合属性:
<br>
长度=<s:property value="[0].myList.size"/><br>     <!--size后面的()可以去掉  -->
内容=<s:property value="[0].myList"/>
<br>内容0=<s:property value="[0].myList[0]"/>

<br><br>
是否空=<s:property value="[0].myList.isEmpty"/>

<!-- 打印值栈信息 -->
<s:debug></s:debug>
	

</body>
</html>

  

package com.hanqi.action;

import java.util.List;

public class TestList {
	
	private List<String> myList;

	public List<String> getMyList() {
		return myList;
	}

	public void setMyList(List<String> myList) {
		this.myList = myList;
	}

}

  

原文地址:https://www.cnblogs.com/liuyanzeng/p/6082850.html