Struts2--ONGL--值栈
Posted 琢磨先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; } }
以上是关于Struts2--ONGL--值栈的主要内容,如果未能解决你的问题,请参考以下文章