31struts23ognl非UIUI过滤投影.docx
- 文档编号:27486221
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:37
- 大小:28.18KB
31struts23ognl非UIUI过滤投影.docx
《31struts23ognl非UIUI过滤投影.docx》由会员分享,可在线阅读,更多相关《31struts23ognl非UIUI过滤投影.docx(37页珍藏版)》请在冰豆网上搜索。
31struts23ognl非UIUI过滤投影
OGNL:
【struts的标签库在struts2-core-2.3.11.jar下的META-INF下】
【引入标签库:
<%@tagliburi="/struts-tags"prefix="s"%>】
OGNL是ObjectGraphicNavigationLanguage(对象图导航语言)的缩写,
它是一个开源项目。
Struts2框架使用OGNL作为默认的表达式语言。
OGNL相对其它表达式语言具有下面几大优势:
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:
@[类全名(包括包路径)]@[方法名|?
值名],例如:
@java.lang.String@format('foo%s','bar')
或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100,discount=0.8,
calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNLcontext)和ActionContext;
5、操作集合对象。
Ognl有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map的接口.
OGNL(ObjectGraphNavigationLanguage),是一种表达式语言。
使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java对象树的方法、同时能够自动实现必要的类型转化。
如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。
====================================================================================================================================
【一、理解Struts2中的ValueStack:
】
ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础
ValueStack(值栈):
贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个ValueStack对象).相当于一个数据的中转站.在其中保存当前Action对象和其他相关对象.
Struts框架把ValueStack对象保存在名为“struts.valueStack”的请求属性中,request中
在ValueStack对象的内部有两个逻辑部分:
ObjectStack:
Struts把动作和相关对象压入ObjectStack中--List对象栈
ContextMap:
Struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中Map栈
Struts会把下面这些映射压入ContextMap中(Map栈中)
root:
ObjectStack对象栈的引用
parameters:
该Map中包含当前请求的请求参数
request:
该Map中包含当前request对象中的所有属性
session:
该Map中包含当前session对象中的所有属性
application:
该Map中包含当前application对象中的所有属性
attr:
该Map按如下顺序来检索某个属性:
request,session,application
在ObjectStack(对象栈)中一般放入:
ValueStackAction对象
map集合
实体类对象
=======================================================================================================================
【二、理解OGNLContext】
OgnlValueStack类包含两个重要的属性一个root和一个context。
*其中root本质上是一个ArrayList.
*而context是一个Map(更确切的说是一个OgnlContext对象)
在这个OgnlContext对象(context)中,有一个默认的顶层对象_root,
OGNL访问context中这个默认顶层对象中的元素时,是不需要#号的,直接通过元素的名称来进行访问,
而访问其他对象时,如request、session、attr等,则需要#号引用。
注:
Struts2将OgnlValueStack的root对象赋值给了OgnlContext中的_root对象,在OgnlValueStack的root对象中,保存着调用Action的实例,
因此,在页面上通过Struts2标签访问Action的属性时,就不需要通过#号来引用。
总结:
ognlContext包含ObjectStack属性和ContextMap属性
当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。
然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。
注意:
Struts2中,OGNL表达式需要配合Struts标签才可以使用。
如:
propertyvalue="name"/> //获取值栈方法一: ValueStackvalueStack1=(ValueStack)ServletActionContext.getRequest().getAttribute("struts.valueStack"); System.out.println("valueStack1----------------"+valueStack1); //获取值栈方法二: ValueStackvalueStack2=ServletActionContext.getContext().getValueStack(); System.out.println("valueStack2----------------------"+valueStack2); ---------------------------------------------------------------------------------------------------------------------------------------- 【再次解析值栈中的集合】 值栈由两部分组成 *对象栈[List集合],放置的数据 *valueStack.set("username","username_msg"); 该方法,放置信息到Map集合中,map集合再放置数据到valueStack的对象栈[List]集合 *valueStack.getRoot().add(0,newPerson()); 直接放置对象到值栈的对象栈[List]中 *当前访问的action对象 //给值栈中的对象栈设值 valueStack2.getRoot().add(0,newPerson()); *map栈: *存放requestsesisonapplocationpage中的数据 *请求参数的值valueStackAction_test.action? a=9 ==================================================================================================================================== 【三、OGNL表达式语言(#号的用法)】 用法1: 访问OGNL上下文和Action上下文,#相当ActionContext.getContext() 2、OGNL会设定一个根对象(root对象,即对象栈list集合),在Struts2中根对象就是ValueStack(值栈)。 如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象的属性即可。 #的用法--------------------------------------------------------------------- 1、如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀Map栈 propertyvalue="#application.username"/> propertyvalue="#request.username"/> propertyvalue="#session.username"/> --获取请求中的参数struts2获取的请求参数是一个数组即request.getParametersValues()--> propertyvalue="#parameters.cid[0]"/> --这种方法获取的时候是万能的如果动态传参数时就该选用这种方式--> propertyvalue="#session['username']"/> --attr用于按request-》session--》application的顺序访问其属性直到找到为止--> propertyvalue="#attr.username"/> 2、OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈)。 如果要访问根对象(即ValueStack)中对象的属性,则可以省略 #命名对象,直接访问该对象的属性即可访问对象栈中的数据 propertyvalue="username"/> -------------------------------------------------------------------------------------------------------------------------- 3、深入理解值栈中的ObjectStack 在OgnlValueStack类里有一个List类型的root变量,他存放了一组对象,处于第一位的对象叫栈顶对象。 (list集合的索引为0为栈顶) 通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性, 搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。 debug> debug> --------------------------------------------------------------------------------------------------------------------------- 4#构造Map,如{‘foo1’: ‘bar1’,‘foo2’: ‘bar2’}。 这种方式常用在给radio或select、checkbox等标签赋值上 radioname="sex"list="#{'male': '男','female': '女'}"> radio> ============================================================================================================================== 【四、OGNL表达式语言(%用法)】 “%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 %的用法--------------------------------------------------------------------- 1“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式万能的写法 --#写法有限制,只能在某些特定的标签中使用而%则可以在所有的标签中使用--> textfieldname="username"value="%{#request.username}"> textfield> 2{}中值用’’引起来,这是不再是ognl表达式,而是普通的字符串 textfieldname="username"value="%{'zhangsan'}"> textfield> =================================================================================================================================== 【五、OGNL表达式语言($用法)】 “$”有两个主要的用途 *用于在国际化资源文件中,引用OGNL表达式 *在Struts2配置文件中,引用OGNL表达式 例: 在配置文件中 1、 --给路径动态传参数--> msg=${#session.username} 2//动态的路径 //组织新的路径放入到request中然后通过$获取 request.setAttribute("url",""); // --获取请求中的参数--> propertyvalue="#parameters.msg[0]"/> ========================================================================================================================================== 【六、非UI标签】 property/> set/> push/> action/> iterator/> url/> 操作list数组map 集合的过滤和投影 【 actionerror/>--->显示出错信息 debug> debug/>--->显示栈中的信息】 【1、 property/>】 ----------------------------------------------------------------------------------------------------- -- property标签用于输出指定值: propertyvalue="#name"default="adefaultvalue"/> *default: 可选属性,如果需要输出的属性值为null,则显示该属性指定的值 *escape: 可选属性,指定是否格式化HTML代码。 *value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输 出ValueStack栈顶的值。 --> property标签用于输出指定值: propertyvalue="#request.username"/> *default: 可选属性,如果需要输出的属性值为null,则显示该属性指定的值 propertyvalue="#request.name"default="xxx"/> *escape: 可选属性,指定是否格式化HTML代码。 默认为true propertyvalue="%{' 【2、 set/>】 ----------------------------------------------------------------------------------------------------- set标签用于将某个值放入指定范围。 -- set标签用于将某个值放入指定范围。 *var: 变量的名字,name,id和var表达的含义是一样的,name,id被var替代 *scope: 指定变量被放置的范围,该属性可以接受application、session、request、page或 action。 如果没有设置该属性,则默认放置在action中。 *value: 赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。 --> --放入request作用域中--> setvar="yy"value="%{#request.username}"scope="request"> set> propertyvalue="%{#request.yy}"/> --放入page作用域中--> setvar="yyy"value="%{#session.username}"scope="page"> set> propertyvalue="#attr.yyy"/> --如果没有设置scope则默认放入Action中即对象栈中--> setvar="yyyy"value="%{#application.username}"> set> propertyvalue="yyyy"/> 【3、 push/>】 ----------------------------------------------------------------------------------------------------- push: 将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。 -- push: 将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。 value: 要push到堆栈中的值。 --> pushvalue="%{#request.username}"> property/> push> 【4、 action/>】 ----------------------------------------------------------------------------------------------------- Action: 通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action 相当于include,引入其他的页面 -- Action: 通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action *name: action名字(不包括后缀,如.action) *namespace: action所在命名空间 *executeResult: Action的result是否需要被执行,默认值是false不执行 --> actionname="ognlAction_test"namespace="/ognl"executeResult="false"> action> 【5、 iteration/>】 ----------------------------------------------------------------------------------------------------- Iterator: 标签用于对集合进行迭代,这里的集合包含List、Set和数组。 -- Iterator: 标签用于对集合进行迭代,这里的集合包含List、Set和数组。 value: 可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。 var: 可选属性,引用变量的名称. status: 可选属性,该属性指定迭代时的IteratorStatus实例。 该实例包含如下几个方法: intgetCount(),返回当前迭代了几个元素。 intgetIndex(),返回当前迭代元素的索引。 booleanisEven(),返回当前被迭代元素的索引是否是偶数 booleanisOdd(),返回当前被迭代元素的索引是否是奇数 booleanisFirst(),返回当前被迭代元素是否是第一个元素。 booleanisLast(),返回当前被迭代元素是否是最后一个元素。 --> --如果没有使用var属性默认放置对象到栈顶(list集合)--> iteratorvalue="%{#request.persons}"> propertyvalue="id"/> propertyvalue="name"/> propertyvalue="age"/> iterator> propertyvalue="%{' --如果使用了var属性放置对象到对象栈[list集合]一份同时还放置对象到Map栈一份--> iteratorvalue="%{#request.persons}"var="person">
'}"escape="false"/>
'}"escape="false"/>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 31 struts23ognl UIUI 过滤 投影
![提示](https://static.bdocx.com/images/bang_tan.gif)