本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.关于 值栈

  1).helloworld 时,${productName} 读取productName 值,实际上该属性不在request 等域对象中,而是从值栈中获取的。
  2).valueStack:可以从ActionContext 中获取值栈对象,值栈分为两个逻辑部门,
  > Map 栈( ContextMap ):实际上是OgnlContext 类型,是一个Map,也是多ActionContext的一个引用。里面保存着各种MaprequsetMap,sessionMap,parameterMap,applicationMap,attr

     Struts 会把下面这些映射压入 ContextMap 中

        parameters: 该 Map 中包含当前请求的请求参数

          request: 该 Map 中包含当前 request 对象中的所有属性

         session: 该 Map 中包含当前 session 对象中的所有属性

        application:该 Map 中包含当前 application 对象中的所有属性

        attr: 该 Map 按如下顺序来检索某个属性: request, session, application

  > 对象栈( ObjectStack ):实际是CompoundRoot类型,是一个使用了ArrayList定义的栈,里面保存着和当前Action实例相关的对象。是一个数据结构意义的栈

ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个 ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前 Action 对象和其他相关对象.

Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中

2.OGNL

      1)在 JSP 页面上可以可以利用 OGNL(Object-Graph Navigation Language: 对象-图导航语言) 访问到值栈(ValueStack) 里的对象属性.

    2)若希望访问值栈中 ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符 #. 如果没有前缀字符 #, 搜索将在 ObjectStack 里进行.

    3)Struts2利用s:property 标签和OGNL 表达式来读取值栈中的属性值

      >对于对象栈:读取的是对象栈中的某一个对象的属性值

      >map栈:request,session,application 的一个属性值 或 一个请求参数的值

  ①读取对象栈中的对象的属性:

    >若想访问 Object Stack 里面某个对象的属性。可以使用一下几种形式之一:

     推荐第一种: object.propertyName;  object['propertyName'];   object["propertyName"];

    >ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,它下面的那个对象可以用 [1] 引用.

       [0].message

    >[n] 的含义从第n 个开始搜索,而不只是搜索第n 个对象

    >若从栈顶对象开始搜索,则可以省略下标部门:message

    >结合s:property 标签:<s:property value="message" />  等同 <s:property value="[0].message" />

  注意:默认情况下,Action对象会被Struts2 自动的放到值栈的栈顶

 <%@ 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>detail page</title>
</head>
<body> <s:debug></s:debug>
<br><br>
ProductName:${productName }
<br><br>
ProductDesc:${productDesc }
<br><br> ProductPrice:<s:property value="[1].productPrice"/> //使用标签进行访问值栈
<!-- ProductPrice:${productPrice } -->
<br><br> </body>
</html>

Product.java

 package com.jason.struts2;

 import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack; public class Product { private Integer productId;
private String productName;
private String productDesc; private double productPrice; public String save(){
17
18 System.out.println(this);
19 //1.获取值栈
20 ValueStack valueStack = ActionContext.getContext().getValueStack();
21
22 //2.创建 Test 对象,并对其赋值
23 Test test = new Test();
24 test.setProductDesc("testProductDesc");
25 test.setProductName("testProductName");
26
27 //3.把Test 对象压入 值栈的栈顶
28 valueStack.push(test);
29
30 return "success";
31 } @Override
public String toString() {
return "Product [productId=" + productId + ", productName="
+ productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
} public Integer getProductId() {
return productId;
} public void setProductId(Integer productId) {
this.productId = productId;
} public String getProductName() {
return productName;
} public void setProductName(String productName) {
this.productName = productName;
} public String getProductDesc() {
return productDesc;
} public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
} public double getProductPrice() {
return productPrice;
} public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
} }

Test.java

 package com.jason.struts2;

 public class Test {
private String productName;
private String productDesc;
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
} }

struts.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="product-save" class="com.jason.struts2.Product" method="save">
<result name="success">/details.jsp</result>
</action> </package> </struts>

    ② 读取 Context Map 里的对象的属性

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

       推荐第一种: #object.propertyName;  #object['propertyName'];   #object["propertyName"];

      >示例:

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

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

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

Product.java

 package com.jason.struts2;

 import java.util.Map;

 import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack; public class Product implements RequestAware,SessionAware{ private Integer productId;
private String productName;
private String productDesc;
private double productPrice; public String save(){ System.out.println(this);
//1.获取值栈
ValueStack valueStack = ActionContext.getContext().getValueStack(); //2.创建 Test 对象,并对其赋值
Test test = new Test();
test.setProductDesc("testProductDesc");
test.setProductName("testProductName"); //3.把Test 对象压入 值栈的栈顶
valueStack.push(test);
sessionMap.put("product", this);
requestMap.put("test", test); return "success";
} @Override
public String toString() {
return "Product [productId=" + productId + ", productName="
+ productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
} public Integer getProductId() {
return productId;
} public void setProductId(Integer productId) {
this.productId = productId;
} public String getProductName() {
return productName;
} public void setProductName(String productName) {
this.productName = productName;
} public String getProductDesc() {
return productDesc;
} public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
} public double getProductPrice() {
return productPrice;
} public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
} private Map<String, Object> sessionMap;
public void setSession(Map<String, Object> arg0) {
this.sessionMap = arg0; } private Map<String,Object> requestMap;
public void setRequest(Map<String, Object> arg0) {
this.requestMap = arg0; } }

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>detail page</title>
</head>
<body> <s:debug></s:debug>
<br><br>
ProductName:${productName }
<br><br>
ProductDesc:${productDesc }
<br><br> ProductPrice:<s:property value="[1].productPrice"/>
<!-- ProductPrice:${productPrice } -->
<br><br> ProductDesc1:${sessionScope.product.productName }
<s:property value="#session.product.productName"/>  <!-- 通过标签读取属性-->
<br><br> ProductDesc2:${requestScope.test.productName }
<s:property value="#request.test.productName"/>
<br><br> </body>
</html>

input.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>input page</title>
</head>
<body> <form action="product-save.action" method="post">
ProductName:<input type="text" name="productName"/>
<br><br> ProductDesc:<input type="text" name="productDesc"/>
<br><br> ProductPrice:<input type="text" name="productPrice"/>
<br><br> <input type="submit" value="submit" />
</form>
</body>
</html>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="product-save" class="com.jason.struts2.Product" method="save">
<result name="success">/details.jsp</result>
</action>
</package>
</struts>

③调用字段和方法,数组

  >可以利用 OGNL 调用

     任何一个 Java 类里的静态字段或方法.    被压入到 ValueStack 栈的对象上的公共字段和方法

  >默认情况下, Struts2 不允许调用任意 Java 类静态方法, 需要重新设置 struts.ognl.allowStaticMethodAccess 标记变量的值为 true.

  >调用静态字段或方法需要使用如下所示的语法:

     -- @fullyQualifiedClassName@fieldName:

           @java.util.Calendar@DECEMBER

       - -@fullyQualifiedClassName@methodName(argumentList):

       @app4.Util@now()

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

     -- .object.fieldName: [0].datePattern

     -- .object.methodName(argumentList): [0].repeat(3, “Hello”);

例子:

     <!-- 使用ognl,调用public 类的public类型的静态字段和静态方法 -->
<s:property value="@java.lang.Math@PI"/>
<br><br>
<s:property value="@java.lang.Math@cos(0)"/>
<br><br> <!-- 调用对象栈的方法为一个属性赋值 -->
<s:property value="setProductName('jason') "/>
<br><br>
<s:property value="productName"/>

  >调用数组对象的属性

 <!-- 调用数组对象的属性 -->
<%
String[] names = new String[] {"aa","bb","cc"};
request.setAttribute("names", names);
%>
<br><br>
length:<s:property value="#attr.names.length"/>
<br><br>
names[2]:<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”}

  >访问 Map 类型的属性

     读取一个 Map 类型的属性将以如下所示的格式返回它所有的键值对:

    若希望检索出某个 Map 的值, 需要使用如下格式: map[key]

    可以使用 size 或 size() 得出某个给定的 Map 的键值对的个数

    可以使用 isEmpty 或 isEmpty() 检查某给定 Map 是不是空.

  

 <!-- 使用ognl 访问map 操作 -->
<%
Map<String, String> letters = new HashMap<String, String>();
letters.put("AA", "a");
letters.put("BB", "b");
letters.put("CC", "c");
request.setAttribute("letters", letters);
%>
letters.length:<s:property value="#attr.letters.size"/>
<br><br>
AA:<s:property value="#attr.letters['AA']"/>

  

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

  <s:property value=“fieldName”> 也可以通过 JSP EL 来达到目的: ${fieldName}

  原理: Struts2 将包装 HttpServletRequest 对象后的 org.apache.struts2.dispatcher.StrutsRequestWrapper 对象传到页面上, 而这个类重写了 getAttribute() 方法.

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map的更多相关文章

  1. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. Java后台处理框架之struts2学习总结

    Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...

  6. 学习笔记:CentOS7学习之十九:Linux网络管理技术

    目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...

  7. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  8. 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用

    目录 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用 21.1 read命令键盘读取变量的值 21.1.1 read常用见用法及参数 21.2 流程控制语句if 21.2 ...

  9. 学习笔记:CentOS7学习之二十:shell脚本的基础

    目录 学习笔记:CentOS7学习之二十:shell脚本的基础 20.1 shell 基本语法 20.1.1 什么是shell? 20.1.2 编程语言分类 20.1.3 什么是shell脚本 20. ...

随机推荐

  1. java编程算法

    一.字符串相关操作 String s = " Hello java,hello android,hello OOP,HELLO String,hello JAVASE!"; Sys ...

  2. lisp分支

    newLISP http://www.ituring.com.cn/article/110968 clojure             http://clojure.org/             ...

  3. C# .Net实现URL绝对路径和相对路径之间互相转换

    网站制作开发中,URL的绝对路径和相对路径之间互相转换,是经常需要用到的.以下是在C#.Net下一种实现二者互相转化的方法: [DllImport("shlwapi.dll", C ...

  4. AppDelegate

    一.基础知识 1) main.m指定了程序的入口点 UIApplicationMain(argc, argv,nil,NSStringFromClass([StartingPointAppDelega ...

  5. java的transient

    今天遇到个了一个问题,在使用Swing的drap and drop处理JTree的时候,我的TreeNode中的UserObject中引用了java.awt.Image类. 然后在dnd的时候会报ja ...

  6. {$ecs_css_path}

    includes里的init.php的187-194行 if (!empty($_CFG['stylename'])) { $smarty->assign('ecs_css_path', 'th ...

  7. Mac废纸篓 不能完全清空的有效解决方法

    摘自:http://www.neonan.com/articles/5582 对于苹果用户来说, 可能都会遇到过这样的情况(尽管这种情况是不常出现的!), Mac OS X系统突然出现一些顽固的文件家 ...

  8. SQL Server 2012 新的分页函数 OFFSET & FETCH NEXT

    DECLARE @page INT, @size INT;select @page = 300, @size = 10 SELECT *FROM gpcomp1.GPCUSTWHERE company ...

  9. SQLServer User and Login Tips

    use master IF EXISTS (SELECT * FROM sys.databases WHERE name = 'gpdb83sp')BEGIN DROP DATABASE gpdb83 ...

  10. 多大开始玩EV3

    机器人EV3还是初中生才能玩的溜 耐撕爸爸推荐年龄:初中及以上 推荐理由:无需使用计算机就可进行编程,培养孩子的编程.机械.电子.物理等综合能力. 在欧美等国家,乐高机器人融入教学已成为一种普遍现象, ...