文档章节

Struts(三)

 梦醒时分_追梦
发布于 2016/11/09 22:24
字数 1996
阅读 13
收藏 1

1、OGNL表达式的基本使用

         什么是OGNL:

             OGNL:Object Graphic Navigation Language

                     对象   图  导航           语言

             它是struts2中的默认表达式语言。使用表达式需要借助struts2的标签。

             EL/JSP/数学运算等等表达式:

                   都有一个明确返回值。都只能取值。

             OGNL表达式:

                   它不仅可以用于取值,还可以用于赋值。(赋值的操作只能由struts2框架来完成。)

         OGNL表达式的写法:

                   对象.对象.对象的方式。

                   <input type="text" name="user.name" />

         OGNL表达式的基本使用:

                   a、使用s:property标签输出内容

                   b、访问普通方法

                   c、访问静态属性

                   d、访问静态方法

                   e、操作集合(List和Map)     

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!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>OGNL表达式的基本使用</title>
</head>
<body>
	<%-- 明确:要想使用OGNL表达式,需要借助struts2的标签
			导入struts2的标签库
		s:property标签
			作用:输出内容到浏览器上
			value属性:它的取值就是一个OGNL表达式
					 它是把value取值所对应的内容输出到浏览器上
	--%>
	<%-- 1、初识OGNL表达式:借助s:property标签输出内容 --%>
	OGNL的基本使用:<s:property value="abcdefghijklmn"/>
	<hr/>
	<%-- OGNL转字符串:使用引号套起来 --%>
	OGNL转成字符串:<s:property value="'abcdefg'"/>
	<hr/>
	
	<%-- 2、OGNL表达式支持普通方法的调用 --%>
	获取字符串长度:<s:property value="'abcdefg'.length()"/>
	<br>
	转大写:<s:property value="'abcdefg'.toUpperCase()"/>
	<br>
	按d分隔:<s:property value="'abcdefg'.split('d')"/>
	<hr>
	
	<%-- 3、访问静态属性 
		书写格式:
			@包名.包名...类名@静态属性名称
		注意:类名必须是全限定类名(包名.类名的方式)
	--%>
	Integer的最大值:<s:property value="@java.lang.Integer@MAX_VALUE"/>
	<hr>
	
	<%-- 4、访问静态方法 
		书写格式:
			@包名.包名...类名@静态方法名称
		访问静态方法:
			需要在struts.xml配置文件中开启静态方法访问:
			<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
	--%>
	随机数:<s:property value="@java.lang.Math@random()"/>
	<hr>
	
	<%-- 5、OGNL表达式操作集合 --%>
	<!-- 操作list -->
	使用原始html标签:
	<input type="radio" name="gender" value="男"/>男
	<input type="radio" name="gender" value="女"/>女
	<br><br>
	使用struts2标签:
	<%--s:radio就是在浏览器上输出一个单选按钮
			list的取值是一个OGNL表达式
			可以使用{}:表示创建了一个空list集合
			{'男','女'}:表示创建了一个有两个元素的list集合
			当访问页面时,会遍历集合,显示成单选按钮
	--%>
	<s:radio list="{'男','女'}" name="gender" />
	<hr>
	
	<!-- 操作map -->
	使用原始html标签:
	<input type="radio" name="gender" value="male"/>男
	<input type="radio" name="gender" value="female"/>女
	<br><br>
	使用struts2标签:
	<%-- #{}:相当于创建了一个Map
			里面的写法:
				key:value,key:value...
			例如:
			#{'male':'男','female':'女'}
	--%>
	<s:radio list="#{'male':'男','female':'女' }" name="gender"/>
</body>
</html>

显示结果:

2、OGNL上下文——ContextMap

         ContextMap:

                   它是OGNL的上下文对象。

                   它是一个Map结构。里面都是键值对(key=value的形式)

                   它的key是一个字符串,它的value是一个Object。

         ContextMap中封装了哪些数据:

                        |

                     |--application 应用域中的数据  Map结构

                     |

                     |--session 会话域中的数据 Map结构

       context map---|

                     |--value stack [stæk] (root)  重点,难点。它是Struts2中的值栈。

                     |

                     |--action (the current action)         当前执行的动作类:不用管

                     |

                     |--request      请求域中的数据。map结构

                     |

|--parameters 请求参数(请求正文,enctype取默认值是key=value),它是map结构,key是字符串,value是字符串数组。Map<String,String[]> = request.getParameterMap(); 由于有属性驱动和模型驱动 的存在,封装请求参数由struts2框架完成了。所以不用管。

                     |

                     |--attr (searches page, request, session, then application scopes)

                     |     存的是四大域的数据。四大域全map结构。attr也是个map结构。key是String value是Object。不用管

         ______________________________________________________________

         application:应用域的所有数据,可以存取操作

         session:会话域的所有数据,可以存取操作

         request:请求域的所有数据,可以存取操作

         valuestack:难点。

         ContextMap对象的创建:

                   是由Struts2框架为我们创建的。                

         如何保证每个线程的数据不会冲突:

                   因为动作类是多例的,每个线程自己一个动作类实例。

                   把它绑定到线程局部变量。ThreadLocal。

         什么时候创建的:

                   过滤器的doFilter方法创建。(不是FilterChain的doFilter方法)

 

         从三个域中使用OGNL表达式获取数据:

 

3、ActionContext

         明确:

            它是一个工具类。里面有快速访问三大域Map和ValueStack的方法。

            它在一创建的时候,就会传入ContextMap对象。

            它会把自己绑定到ThreadLocal上

         获取ActionContext对象:

                   一定要从当前线程上获取,才能保证每个线程获取的是自己的ActionContext

                   使用的是ActionContext类中的静态方法:

                            getContext()方法

//1.获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2.往大Map中存入数据
context.put("contextMap", "hello contextMap");


         拿到ActionContext对象就相当于拿到了:

                   ContextMap

4、ValueStack

         明确:

            它是List结构。是ContextMap中的一部分。

            它是一个栈的结构,先进后出!

            我们只能操作栈顶元素。

        获取ValueStack对象:

            使用ActionContext类中的方法:

                   getValueStack();

//1.获取ActionContext对象
ActionContext context = ActionContext.getContext();//从当前线程上获取
//2.获取ValueStack对象
ValueStack vs = context.getValueStack();
//3.压栈操作(存入数据)
Student s = new Student("小强",24,"male");
vs.push(s);

5、使用OGNL表达式存取值操作

         Map的存值取值:

                   获取Map

                   取值操作

取Map中的数据需要使用:#。例如:#key,则取出的是key所对应的value值

<%-- 1、借助s:propery 标签获取Map中的数据 
			取map中的数据需要使用:#
			例如:#key
			取出来的都是value
	--%>
	<s:property value="#contextMap"/>
	<hr>
	<%-- 2、获取session域中的对象 --%>
	<s:property value="#session.sessionMap"/><br>
	<s:property value="#session.sessionAttr"/>
	<hr>
	<%-- 3、获取Application域中的数据 --%>
	<s:property value="#application.applicationMap"/><br>
	<s:property value="#application.applicationAttr"/><br>

         ValueStack的存值取值

                   获取ValueStack

                   取值操作:

(1)使用OGNL表达式根据属性名称获取属性的值,根据propertyName获取propertyValue

         当我们使用OGNL,不写#时,获取的是值栈中的数据。

         它是根据属性的名称,从栈顶逐个对象往下查,找到属性名称一致的,把值取出来,只要找到第一个,就不再继续查找。

(2)获取指定位置的数据

(3)当使用s:property不给定value属性时,获取的是栈顶对象

(4)如果我们没有操作值栈,默认的值栈对象是当前执行的动作类

(5)s:property标签所对应的方法:

<%
	 	ActionContext context = ActionContext.getContext();
	 	ValueStack vs = context.getValueStack();
	 	Object v1 = vs.findValue("name");//findValue方法就是使用OGNL
	 	//表达式在OGNL上下文中获取数据。参数是一个字符串,就是OGNL表达式
		out.print(v1);
	 	out.print("<br/>");
	 	Object v2 = vs.findValue("[1].name");
		out.print(v2);
	 	out.print("<br/>");
	 	Object v3 = vs.findValue("#session.sessionAttr");
	 	out.print(v3);
%>

6、Struts2对EL表达式的改变

         改变后的顺序:page —— request —— ValueStack —— ContextMap —— session —— application

         原因:

7、各种符号的总结:

         $:

           1、EL表达式

           2、在配置文件中使用OGNL表达式。(放到CRM案例的第5天使用)

         #:

           1、使用OGNL表达式创建Map

           2、在ContextMap中获取数据,把OGNL表达式看成key。

         ''/"":

           1、把OGNL表达式强制转成字符串

         %:

1、  把字符串强制转成OGNL表达式

8、s:iterator标签:

(1)它是struts2的迭代标签,把集合的数据显示到页面

(2)属性:

         value:取值是一个OGNL表达式

         var:使用了var属性:把var属性的值作为key,把当前遍历的对象作为value,存入ContextMap

                    没有使用var属性:就是把当前遍历的对象压入栈顶,每次遍历完,把压栈的对象全部弹栈。

         status:遍历的计数器对象

                   count:计数,从1开始

                   index:索引,从0开始

                   isOdd:是否是奇数行

                   isEven:是否是偶数行

                   isFirst:是否是第一行

                   isLast:是否是最后一行

         begin:遍历的开始索引

         end:遍历的结束索引

         step:步长

© 著作权归作者所有

上一篇: Struts(四 )
下一篇: Struts(二)
粉丝 5
博文 10
码字总数 21413
作品 0
昌平
私信 提问
struts-2.3.16开发环境搭建

一、拷jar包 最小jar包要求(the minimal required Struts 2 framework Jar files): struts2-core-2.3.16.jarxwork-core-2.3.16.jarcommons-logging-1.1.3.jarognl-3.0.6.jarcommons-fileu......

techsboy
2014/04/22
0
0
Struts 2再曝远程代码执行漏洞S2-037

导读 今年4月份,Apache Stuts 2之上发现的S2-033远程代码执行漏洞,以迅雷不及掩耳之势席卷而来。其利用代码很快就在短时间内迅速传播。而且官方针对这个高危漏洞的修复方案还是无效的。 悲...

linuxprobe
2016/06/22
0
0
CNNVD关于Apache Struts2 S2-057安全漏洞情况的通报

  近日,国家信息安全漏洞库(CNNVD)收到关于Apache Struts2 S2-057安全漏洞(CNNVD-201808-740、CVE-2018-11776)情况的报送。成功利用漏洞的攻击者可能对目标系统执行恶意代码。Apache ...

FreeBuf
2018/08/23
0
0
MyEclipse中删除对Struts、Hibernate、Spring的支持

最近碰到添加了ssh的支持,但又发现有些包,或配置文件不正确,想重新添加,但MyEclipse没有自动重新加载功能,于是到网上搜索了相关内容,总结如下: 一、首先是撤消MyEclipse对Struts的支持...

Sandy_wu
2013/06/07
0
0
Apache Struts最新漏洞 远程代码执行漏洞预警

2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache Struts 2.3.35的版本都会受到...

网站安全
2018/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

铁骨铮铮
19分钟前
3
0
龙芯版办公软件下载

金山wps office   rpm包:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm   deb包:http://packages.deepin.com/loongson/pool/......

gugudu
25分钟前
2
0
BI报表分析和数据可视化,推荐这三个开源工具!

开源篇 一、Superset 1、技术架构:Python + Flask + React + Redux + SQLAlchemy 2、使用人群: (1)开发/分析人员做好看板,业务人员浏览看板数据 (2)业务人员可自行编辑图表,查看满足...

飓风2000
31分钟前
1
0
CountDownLatch

CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程...

少年已不再年少
40分钟前
1
0
centos7 新手阿里云服务器安装mongodb

简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 MongoDB特点 模式自由 :可以把不同结构的文档存...

醉雨
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部