首页 > 代码库 > 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 }
修改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表达式