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 }
修改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]
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。