zoukankan      html  css  js  c++  java
  • Struts(十一):OGNL表达式(二)

    • Map栈 :request,session,application的一个属性值或一个请求参数的值。

    若想访问ContextMap里的某个对象的属性,可以使用以下几种之一:

    #object.propertyName

    #object['propertyName']

    #object["propertyName"]

    示例:

    返回session中的code属性:#session.code;

    返回request中的customer对的name属性值:#request.customer.name

    返回域对象(按request,session,application的顺序)的lasterActionDate属性:#attr.lastAccesssDate

     Product.java实现RequestAware、SessionAware接口,并在save方法中把this存放到sessionMap,把product2存放到requestMap中:

     1 package com.dx.struts2.valuestack;
     2 
     3 import java.io.UnsupportedEncodingException;
     4 import java.util.Map;
     5 
     6 import org.apache.struts2.interceptor.RequestAware;
     7 import org.apache.struts2.interceptor.SessionAware;
     8 
     9 import com.opensymphony.xwork2.ActionContext;
    10 import com.opensymphony.xwork2.util.ValueStack;
    11 
    12 public class Product implements RequestAware,SessionAware{
    13     private Integer productId;
    14     private String productName;
    15     private String productDesc;
    16     private Double productPrice;
    17     
    18     public Integer getProductId() {
    19         return productId;
    20     }
    21     public void setProductId(Integer productId) {
    22         this.productId = productId;
    23     }
    24     public String getProductName() {
    25         return productName;
    26     }
    27     public void setProductName(String productName) {
    28         this.productName = productName;
    29     }
    30     public String getProductDesc() {
    31         return productDesc;
    32     }
    33     public void setProductDesc(String productDesc) {
    34         this.productDesc = productDesc;
    35     }
    36     public Double getProductPrice() {
    37         return productPrice;
    38     }
    39     public void setProductPrice(Double productPrice) {
    40         this.productPrice = productPrice;
    41     }
    42     
    43     public String save(){     
    44         System.out.println("save");
    45         
    46         // 1、获取值栈对象
    47         ValueStack valueStack= ActionContext.getContext().getValueStack();
    48                 
    49         // 2、生成一个Product2对象
    50         Product2 product2=new Product2();
    51         product2.setProductDesc("product2 desc");
    52         product2.setProductName("product2 name");
    53         
    54         // 3、将Product2对象存放到值栈中
    55         valueStack.push(product2);
    56         
    57         sessionMap.put("product", this);
    58         requestMap.put("product2", product2);
    59         
    60         return "success";
    61     }
    62     
    63     private Map<String,Object> requestMap;
    64     
    65     @Override
    66     public void setRequest(Map<String, Object> request) {
    67         this.requestMap=request;
    68         
    69     }
    70     
    71     private Map<String,Object> sessionMap;
    72     
    73     @Override
    74     public void setSession(Map<String, Object> session) {
    75         this.sessionMap= session;
    76     }
    77 }
    View Code

    details.jsp获取方式有两种:

    productName:<br/>
    ${sessionScope.product.productName}<br/>
    or<br/>
    <s:property value="#session.product.productName"/><br/>
    <br/>
    productName:<br/>
    ${requestScope.product.productName}<br/>
    or<br/>
    <s:property value="#request.product.productName"/><br/>
    • 调用字段和方法

    1、可以利用OGNL调用
      任何一个java类里的静态字段和方法;
      被压入到ValueStack栈的对象上的公共字段和方法。
    2、默认情况下,Strut2不允许调用任何java类的方法,需要重新设置struts.ognl.allowStaticMethodAccess标记变量为true.
    3、调用静态字段或者方法需要使用如下所以的语法:
    @fullyQualifiedClassName@fieldName
    例如:

    <s:property value="@java.lang.Math@PI"/>

    @fullyQualifiedClassName@methodName(argumentList)

    例如:

    <s:property value="@java.lang.Math@cos(0)"/>

    注意:此时默认是不允许输出结果的在strut2-core.jar中default.proerpties中包含struts.ognl.allowStaticMethodAccess
    修需在struts.xml中

    <struts>
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
    ...
    </struts>

    4、调用一个实例字段或者方法的语句,其中object是Object Stack栈里的某个对象的引用:

    object.fieldName:[0].datePattern
    object.methodName(argumentList):[0].repeat(3,"hello");

    <s:property value="[0].setProductName('set product name')"/>
    <s:property value="[0].productName" />

    5、还可以访问数组对象的属性。

    <%String[] colors=new String[]{"red","blue"};
    request.setAttribute("colors",colors);
    %>
    length:<s:property value="#attr.colors.length"/>
    colors[1]:<s:property value="#attr.colors[1]"/>

    6、访问List类型的属性

    7、访问Map类型的属性

    <%Map<String,String> letters=new HasMap<String,String>();
    letters.put("aa","Aa");
    request.setAttribute("letters",letters);
    %>
    <s:property value="#attr.letters.size"/>
    AA:
    <s:property value="#attr.letters["aa"]"/>
  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/6538324.html
Copyright © 2011-2022 走看看