• 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"]"/>
  • 相关阅读:
    DB2 java.lang.NoClassDefFoundError:com/ibm/db2/jcc/SQLJContext
    JavaScript字符串split方法
    使用 WebSphere Application Server Community
    为DB2数据库创建新用户帐户并为其分配特定特权
    Servlet3.0之一:Servlet3.0新特性介绍
    window下jni调用dll和linux下jni调用so库(转)
    分表分库之三:中间件介绍
    jboss5 启动时报HsqlException:length must be specified in type definition:VARBINARY错误
    J2EE Formbased Authentication
    阻塞队列之七:DelayQueue延时队列
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/6538324.html
Copyright © 2020-2023  润新知