16-17. Struts2_OGNL

导入s标签

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

想在页面查看详细信息,可以导入标签

<s:debug></s:debug>

在页面显示属性值的方式:
使用EL表达式或者使用OGNL表达式s标签
若希望返回栈顶对象的 message 属性值: [0].message 或 [0][“message”] 或 [0][‘message’]
若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索. 即 [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象
若从栈顶对象开始搜索, 则可以省略下标部分

productName in el:${productName }
    <br><br>
productName in s:<s:property value="[1].productName"/>
    <br><br>
    productName in s2:<s:property value="productName"/>
    <br><br>

    productName in s3:<s:property value='productName'/>
    <br><br>

读取 Context Map 里的对象的属性

#object.propertyname,#object['propertyname'],#object["propertyname"]

示例:
返回 session 中的 code 属性: #session.code
返回 request 中的 customer 属性的 name 属性值: #request.customer.name
返回域对象(按 request, session, application 的顺序)的 lastAccessDate 属性: #attr.lastAccessDate

    productName in EL request:${requestScope.product.productName }
    <s:property value="#request.product.productName"/>
    <br><br>
    testName in EL session:${sessionScope.test.productName }
    <s:property value="#session.test.productName"/>

调用字段和方法
可以利用 OGNL 调用
任何一个 Java 类里的静态字段或方法.
被压入到 ValueStack 栈的对象上的公共字段和方法.
默认情况下, Struts2 不允许调用任意 Java 类静态方法, 需要重新设置 struts.ognl.allowStaticMethodAccess 标记变量的值为 true.
调用静态字段或方法需要使用如下所示的语法:
@fullyQualifiedClassName@fieldName: @java.util.Calendar@DECEMBER
@fullyQualifiedClassName@methodName(argumentList): @app4.Util@now()


    <!-- 使用OGNL调用Public类的Public类型的静态字段和方法 -->
    <s:property value="@java.lang.Math@PI"/>
    <br><br>
    <s:property value="@java.lang.Math@cos(0)"/>
    <br><br>
<!-- 打开允许调用静态方法的开关 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

调用一个实例字段或方法的语法, 其中 object 是 Object Stack 栈里的某个对象的引用:
.object.fieldName: [0].datePattern
.object.methodName(argumentList): [0].repeat(3, “Hello”);

productName old:<s:property value='productName'/>
    <br><br>
    <!-- 调用对象栈的方法为一个属赋值 --> 
    <s:property value="setProductName('hgh')"/>
    productName new:<s:property value='productName'/>
    <br><br>

访问数组类型的属性
有些属性将返回一个对象数组而不是单个对象, 可以像读取任何其他对象属性那样读取它们. 这种数组型属性的各个元素以逗号分隔, 并且不带方括号
可以使用下标访问数组中指定的元素: colors[0]
可以通过调用其 length 字段查出给定数组中有多少个元素: colors.length

<!-- 访问数组类型的对象 -->
    <%
        String[] names = new String[]{"aa","bb","cc","dd"};
        request.setAttribute("names", names);
    %>

    length:<s:property value="#attr.names.length"/>
    <br><br>

    names:<s:property value="#attr.names[2]"/>

访问 List 类型的属性
有些属性将返回的类型是 java.util.List, 可以像读取任何其他属性那样读取它们. 这种 List 的各个元素是字符串, 以逗号分隔, 并且带方括号
可以使用下标访问 List 中指定的元素: colors[0]
可以通过调用其 size 方法或专用关键字 size 的方法查出给定List 的长度: colors.size 或 colors.size()
可以通过使用 isEmpty() 方法或专用关键字 isEmpty 来得知给定的 List 是不是空. colors.isEmpty 或 colors.isEmpty()
还可以使用 OGNL 表达式来创建 List, 创建一个 List 与声明一个 Java 数组是相同的: {“Red”, “Black”, “Green”}

    <!-- 访问list类型的对象 List<Object> list = new ArrayList<Object>();-->
    <%
        List<Object> list = new ArrayList<Object>();
        list.add("11");
        list.add("21");
        list.add("31");
        list.add("41");
        request.setAttribute("list", list);
    %>

    length:<s:property value="#attr.list.size"/>
    <br><br>

    names:<s:property value="#attr.list[2]"/>

访问 Map 类型的属性
读取一个 Map 类型的属性将以如下所示的格式返回它所有的键值对:
若希望检索出某个 Map 的值, 需要使用如下格式: map[key]
可以使用 size 或 size() 得出某个给定的 Map 的键值对的个数
可以使用 isEmpty 或 isEmpty() 检查某给定 Map 是不是空.
可以使用如下语法来创建一个 Map:

<!-- 访问map类型的对象 -->
    <%
        Map<String,Object> map = new HashMap<String,Object>();
        request.setAttribute("map", map);
        map.put("aa", "a");
        map.put("bb", "b");
        map.put("cc", "c");
    %>

    length:<s:property value="#attr.map.size"/>
    <br><br>
    aa:<s:property value="#attr.map['aa']"/>

使用 EL 访问值栈中对象的属性

<s:property value=“fieldName”> 

也可以通过 JSP EL 来达到目的: ${fieldName}
原理: Struts2 将包装 HttpServletRequest 对象后的 org.apache.struts2.dispatcher.StrutsRequestWrapper
对象传到页面上, 而这个类重写了 getAttribute() 方法.

能用EL的还是推荐先使用EL,能用EL的肯定能用OGNL,但是反过来不一定行。
因为EL是基于JAVABEAN的,都是GETXXX什么的来实现的。
而size等则不是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值