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="[0].message" />或者 <s:property value="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="[0].productDesc"/> 也相当于<s:property value="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]

 

posted @ 2017-03-12 16:00  cctext  阅读(354)  评论(0编辑  收藏  举报