zoukankan      html  css  js  c++  java
  • 八、Struts2之OGNL

     

    一、OGNL概述

    OGNL:Object Graph Naigation Language(对象图导航语言);前面我们学过EL也是表达式语言,而Struts2将OGNL作为默认的表达式语言;

    二、OGNL结构

    OGNL的上下文是ActionContext,而OGNL的结构为:

    valuestack是OGNL上下文的根元素,此元素只是一个根对象,指向一个队列,队列的第一个元素叫做栈顶;

    request表示HttpServletRequest的request对象;

    session表示HttpSession的session对象;

    application表示ServletContext对象;

    parameters表示request.getParameter("...");

    attr表示从page-->request-->session-->application搜寻对应的属性;

    三、OGNL表达式

    OGNL一般都需要和标签结合使用,最常用的就是<s:property value="OGNL表达式"/>

    1.访问valuestack

    如果要访问valuestack对象中的属性,则可以直接写出属性访问,比如:

    Person类包含name、age属性,Student类包含name、score属性,如果在valuestack的列表中包含如下元素:

    则通过   name   可以直接访问p1对象的name属性的值,即xiazdong;

    如果是  score  则访问s1对象的score属性的值,即90;

    在JSP中,如果想要访问valuestack的属性,则可以直接通过EL表达式:${}进行访问,因为struts2 将EL表达式进一步封装,如果${}时,当原来EL表达式返回null时,就访问valuestack;

    结论:通过直接写出属性访问valuestack对应列表对象属性的搜索顺序是:从栈顶开始搜索,先搜索到的结果优先;

    2.访问其他对象

    访问除了valuestack的其他对象时,则需要以“#对象”进行访问;

    比如request.setAttribute("name","xiazdong");

    则可以通过#request.name或#request['name']访问;

    注意:

    #对象['key']和#对象.key的应用场景:#对象.key在key存在特殊字符时不能用,只能用#对象['key'];

    3.创建并访问List

    创建List:{'elem1','elem2','elem3'};

    下面先介绍<s:if>、<s:set>、<s:iterator>、<s:property>标签;

    (1)

    <s:if test="判断条件">

        语句

    </if>

    (2)<s:set var="obj" value="{'a','b','c'}"/>

     没有设定scope属性,表示将{'a','b','c'}赋值给obj,并将obj对象访问ActionContext中,即如下图:

    因此如果要访问obj,则通过#obj访问;

    (3)

    <s:iterator value="#obj">

        //显示当前迭代元素;

    </iterator>

    iterator把当前迭代的元素放到valuestack栈顶;

    (4)<s:property/>指定value值就不说了,如果没有指定value,表示显示valuestack栈顶的值;

    应用1:迭代输出Action类中的List

    因为lists放在valuestack中,因此只需要直接写属性名就可以访问;

        <s:iterator value="lists">
         <s:property/>
        </s:iterator>
    
    


     

    应用2:迭代输出JSP中创建的List

    因为ls放在OGNLContext中,因此必须通过“#对象”访问;

     <s:set var="ls" value="{'a','b','c'}"></s:set>
     <s:iterator value="#ls">
      <s:property/>
     </s:iterator>
    
    


     

    子集

    目的:取出某个集合的子集

    格式:lists.{条件}

    在条件中的第一个字母:

    (1)?:取出满足条件的全部元素;

    (2)^:取出满足条件的第一个元素;

    (3)$:取出满足条件的最后一个元素;

    #this 表示当前迭代的元素;

    lists.{?条件}表示满足条件的全部元素;

    lists.{^条件}表示满足条件的第一个元素;

    lists.{$条件}表示满足条件的最后一个元素;

    比如:

    List<String>lists;

    lists.{?#this.equals('a')}返回lists集合中等于a的子集;在这里#this表示队列的元素

    四、创建并访问Map

    创建Map:#{'key1':'value1','key2':'value2'};

    应用1:迭代输出Action类中的Map

    <s:iterator value="maps">
      <s:property value="key"/>=<s:property value="value"/>
     </s:iterator>
    


     

    应用2:迭代输出JSP创建的Map

     <s:set var="mm" value="#{'a':'aa','b':'bb','c':'cc'}"></s:set>
     <s:iterator value="#mm">
      	<s:property value="key"/>=<s:property value="value"/>
     </s:iterator>
    
    

    五、调用静态函数

    前提:在struts.xml中配置常量:<constant name="struts.ognl.allowStaticMethodAccess" value="true" />

    格式:@类名@函数名(参数);         注意:类名必须是包括包名;

    比如:@java.lang.String@format('a%s','b');

    六、综合代码实例

    index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
    
        
        <title>My JSP 'index.jsp' starting page</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">
      </head>
      
      <body>
      <%
      	request.setAttribute("age", 12);
      	pageContext.setAttribute("info", "page");
      	request.setAttribute("info", "page");
      	session.setAttribute("info", "page");
      	application.setAttribute("info", "page");
      	
       %>
       
        name属性值:${name}<br />
        <s:property value="name"/><br />
                  访问request属性值:<s:property value="#request.age"/><br />
        访问attr的属性:<s:property value="#attr.info"/><br/>
        <hr/>
        迭代输出lists;
        <s:iterator value="lists">
        	<s:property/>
        </s:iterator>
        <br/>
     迭代输出在JSP中创建的list:   
     <s:set var="ls" value="{'a','b','c'}"></s:set>
     <s:iterator value="#ls">
     	<s:property/>
     </s:iterator>
     <br/>
     输出Action中的map:
     <s:iterator value="maps">
     	<s:property value="key"/>=<s:property value="value"/>
     </s:iterator>
     <br/>
     输出JSP创建的map:
     <s:set var="mm" value="#{'a':'aa','b':'bb','c':'cc'}"></s:set>
     <s:iterator value="#mm">
     	<s:property value="key"/>=<s:property value="value"/>
     </s:iterator>
     <br/>
     静态方法:<s:property value="@java.lang.String@format('a,%s','b')"/><br/>
     子集:
     <s:iterator value="lists.{?#this.equals('e1')}">
     	<s:property/>
     </s:iterator>
      </body>
    </html>


     

    OGNL01Action.java

    package org.ognl.action;
    
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import com.opensymphony.xwork2.ActionSupport;
    public class OGNL01Action extends ActionSupport {
    	private String name;
    	private List<String> lists;
    	private Map<String,String> maps;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String execute()throws Exception{
    		name="xiazdong";
    		
    		lists = new ArrayList<String>();
    		lists.add("e1");
    		lists.add("e2");
    		lists.add("e3");
    		
    		maps = new LinkedHashMap<String,String>();
    		maps.put("key1" ,"value1");
    		maps.put("key2" ,"value2");
    		maps.put("key3" ,"value3");
    		return SUCCESS;
    		
    	}
    	public List<String> getLists() {
    		return lists;
    	}
    	public void setLists(List<String> lists) {
    		this.lists = lists;
    	}
    	public Map<String, String> getMaps() {
    		return maps;
    	}
    	public void setMaps(Map<String, String> maps) {
    		this.maps = maps;
    	}
    }


     

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    gulp模块编译
    微擎数据库表-T
    微信小程序自动识别姓名电话地址
    PHPBase64格式编码图片
    HTML中Data的数据类型
    EPP状态码
    WePay-T
    HTML-T
    PHPNamespace命名空间
    jQuery:jQuery简介
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058082.html
Copyright © 2011-2022 走看看