首页 > 代码库 > Struts(十):OGNL表达式

Struts(十):OGNL表达式

  • Struts2 用s:porperty标签和OGNL表达式来读取值栈中的属性值:

I、值栈中的属性值:
  1、对象栈:读取对象栈中的某一个对象的属性值;
  2、Map栈 :request,session,application的一个属性值或一个请求参数的值。

II、读取对象栈(ObjectStack)中的对象属性:
  1、若想读取Object Stack里的某个对象的属性,可以通过以下集中形式之一:
    object.propertyname
    object[‘propertyname‘]
    object["propertyname"]
  2、ObjectStack中的对象可以从0开始的的下表来引用,ObjectStack里的栈顶对象可以用[0]来引用,它下面的那个对象可以用[1]引用。
    [0].message
  3、[n]的含义是从第n个开始搜索,而不是值搜索第n个对象
  4、若从栈顶对象开始搜索,则可以省略下标部分:message
  5、结合s:property标签<s:property value="http://www.mamicode.com/[0].message" />或者 <s:property value="http://www.mamicode.com/message"/>(通常情况下都采用这种方式来写)

<%@ taglib prefix="s" uri="/struts-tags"%>

备注:如果需要使用s:property标签,必须在jsp页面头部引入:

 

III、默认情况下,action会被struts2自动放在值栈的顶部。

  • 值栈属性读取示例:

 基于《Struts(九):值栈(OGNL)》这一篇文章的例子基础上,修改details.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ 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><s:debug/><s:property value="productName"/><br/>${productDesc}<br/>${productPrice}<br/></body></html>

调试启动tomcat,输入地址:http://localhost:8080/Struts_01/,页面:

技术分享

点击“提交”按钮,跳转到details.jsp

技术分享

点开[Debug]

技术分享

这里边的com.dx.sturts2.valuestack.Product存储的对象就是Action,被存储到了ValueStack的栈顶,所以details.jsp页面可以使用${productDesc},相当于<s:property value="http://www.mamicode.com/[0].productDesc"/> 也相当于<s:property value="http://www.mamicode.com/productDesc"/>

添加一个Product2.java:

技术分享
 1 package com.dx.struts2.valuestack; 2  3  4 public class Product2 { 5     private String productName; 6     private String productDesc; 7  8     public String getProductName() { 9         return productName;10     }11 12     public void setProductName(String productName) {13         this.productName = productName;14     }15 16     public String getProductDesc() {17         return productDesc;18     }19 20     public void setProductDesc(String productDesc) {21         this.productDesc = productDesc;22     }23 24 }
View Code

修改Product.java Action save方法:

public String save(){             System.out.println("save");                // 1、获取值栈对象        ValueStack valueStack= ActionContext.getContext().getValueStack();                        // 2、生成一个Product2对象        Product2 product2=new Product2();        product2.setProductDesc("product2 desc");        product2.setProductName("product2 name");                // 3、将Product2对象存放到值栈中        valueStack.push(product2);                return "success";    }

继续查看details.jsp:

调试Product的save方法:

技术分享

从截图我们可以知道:Action类对象在进入save方法之前就已经被放入到栈顶。

details.jsp:

技术分享

点开[Debug]

技术分享

 

Struts(十):OGNL表达式