zoukankan      html  css  js  c++  java
  • 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;
    	}
    
    }
    

      

  • 相关阅读:
    json字符串数组判断其中
    json字符串数组判断其中
    jquery select chosen禁用某一项option
    数据库培训知识
    人员管理模块代码总结2015/8/12整理
    正则表达式在STARLIMS中的应用总结
    控件属性表
    Form-公共代码
    Server-Script公共代码
    Celient-Script公共代码
  • 原文地址:https://www.cnblogs.com/liuyanzeng/p/6082850.html
Copyright © 2011-2022 走看看