OGNL与Struts 2标签
使用表达式语言好处:
1.避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;
2.支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
3.简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts 2中的表达式语言
1. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2. JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3. Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4. Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,据说其性能要比JSP好。
目前主要掌握OGNL和JSTL两种即可
OGNL
OGNL的全称是Object Graph Navigational Language(对象图导航语言),提供了访问值栈(ValueStack)中对象的统一方式
是一种功能非常强大的针对Java的表达式语言(EL)
它提供了一些功能
支持对象方法调用 e.g. Students.sayHi();
支持静态方法的调用和值访问 e.g. @类全名@方法名|值名
访问OGNL Context和ActionContext
操作集合对象
作用:通常用来绑定Java对象的属性,可以用来读取和设置对应的Java对象的属性,可以用来沟通WEB组件和业务逻辑的模型部分
OGNL有一个上下文概念Context,实现类为ActionContext,有一个存放对象的堆栈valueStack,对象以map的形式存储在其中,并且该对象属性的值可以通过表达式语言得到
(即:当Struts2接受一个请求时,会创建ActionContext,ValueStack,action.然后把action存放进ValueStack,所以action的实例量可例变量可以被OGNL访问)
OGNL必须配struts2标签才能使用
由于ValudeStack(值栈)是Struts2中的OGNL的根对象,它的实现类是OgnlValueStack,它的其中有个List类型的root变量,就是通过它来存放对象,处于root第一位的,称为栈顶对象,通常我们通过属性名就可以访问栈中对象属性
对于ValueStack对象的属性访问方式是从第一个对象(栈顶对象)搜起,搜到就显示,搜不到就继续往下走
访问Context中的内容,要使用#标注要访问的空间,由于ValudeStack(值栈)是Struts2中的OGNL的根对象,所以要访问,可以在JSP页面直接通过表达式来访问
例如,${foo} 就是获得值栈中一个对象的foo的属性值
如果访问其他Context中的作用域对象requst,session,application,由于它们不是根对象,所以在访问时需要添加#前缀,例如#session[‘userName’]或#session.userName
parameters: #parameters[‘userName’]
相当于request.getParameter(“userName”);
attr : 用于按page->request->session->application顺序访问属性,直到找到为止
OGNL的符号
#:
1.访问OGNL上下文和Action上下文
2.用于过滤和投影(projecting)集合
3.创建Map
用于输出字符串
%:
用途是在标志的属性为字符串类型时,计算OGNL表达式的值
用于计算(如:从别的地方取值,简单的一些计算)
$:
1.用于在国际化资源文件中
2.在Struts 2配置文件中,引用OGNL表达式
如:<result>action?username=${username}</result>
3.JSTL中$
OGNL允许使用指定规则得到集合的子集
? :得到所有符合逻辑的元素
^ :获得符合逻辑的第一个元素
$ :获得符合逻辑的最后一个元素
Struts2标签
<set>标签
set标签用于将某个值放入指定范围,scope指定变量被放置的范围,可以放在application,session,request,page,action中,默认放在OGNL Context中
例:
建一个集合
<s:set name=“list” value=“{‘zhangsan’,’lishi’,’wangwu’}”/>
创建一个Map对象:
<s:set name=“foobar” value=“#{‘foo1’:’bar1’,’foo2’:’bar2’}”/>
<s:iterator>
<s:iterator> 标签有3个属性:
value:被迭代的集合
id :指定集合里面的元素的id
status 迭代元素的索引
如果指定了status,它有以下几个方法:
int getCount()返回当前迭代了几个元素
int getIndex()返回当前元素索引
boolean isEven()当然的索引是否偶数
boolean isFirst()当前是否第一个元素
boolean isLast()
boolean isOdd()当前元素索引是否奇数
例:
<s:iterator value=“students.{?#this.age>22}”>
<s:property value=“sname”/>-$<s:property value=“age”/>
</s:iterator>
students为一个集合,.{}表明取出该集合的子集,{}中是规则表达式,this指的是为了从大集合students筛选数据到小集合,需要对大集合进行迭代,this代表就是当前迭代的元素
s:property
<s:property> 用于输出指定的值:
其中属性包括
default: 可选,如果输出的指定属性值为NULL,输出此值
escape: 可选, 指定是否格式化HTML代码
value : 可选,指定输出的属性,如果没指定,输出ValueStack栈顶的值
id :可选,指定该元素的标识
<if>、<elseif>、<else>这三个标签都用于逻辑判断前两个都有属性test,若里面的值为true那就执行标签中的方法。
在test中可用in或not in判断对象是否存在于集合
例:
in 的使用
<s:if test=“’foo’in {‘foo’,’bar’}”>在</s:if>
<s:else>不在</s:else>
not in 的使用
<s:if test=“’foo’not in {‘foo’,’bar’}”>不在</s:if>
<s:else>在</s:else>
append标签
将几个集合拼接成一个集合
<s:append id="newer">
<s:param value="{'zhangsan','lishi','wangwu'}"/>
<s:param value="{'liuliu','zhaoqi','qianba'}"/>
</s:append>
merge标签
将两个集合拼接成一个集合,拼接方式与append不同
<s:merge id="newer">
<s:param value="{'zhangsan','lishi','wangwu'}"/>
<s:param value="{'liuliu','zhaoqi','qianba'}"/>
</s:merge>
action标签:用来直接调用一个Action请求
<s:action name=“sAction” executeResult=“true” ignoreContextParams=“true”/>
bean标签:创建一个bean的实例
<s:bean name="com.newer.students" id="st">
<s:param name="stuno" value="1"></s:param>
<s:property value="stuno"/>
</s:bean>
<s:property value="st.stuno"/>
include标签:用来引入另一个页面,可用param传参数
<s:include value=“a.jsp”/>
s:checkbox:生成一个复选框
s:radio :生成一个单选
s:textarea 生成一个文本域
s:select :生成一个下拉列表框
<s:select value=“#{‘1’:’上海’,}”label=“地点”/>
s:checkboxlist:生成多个复选框
<s:checkboxlist name=“simple” label=“” labelposition=“top”list=“”listkey=“” listValue=“”/>
s:combobox:生成一个下拉菜单和文本框的组合
<s:combobox list=“{‘a’,’b’,’ c’}” name=“kong”/>
s:optgroup:和s:select同时使用,用来生成一个包含选项组名称及选项的组合
<s:select name=“abc”list=“”>
<s:optgroup label=“1”list=“#”listValue=“”listKey=“”
</s:select>
s:doubleselect:生成两个相互关联的下拉列表框
<s:doubleselect label=“” labelposition=“top”
name=“city” list=“#ds.city” listKey=“id” listValue=“name”doubleName=“sname”
doubleList=“#ds.m.get(top.id)”doubleListKey=“id”
doubleListValue=“name”/>
actionerror:用来输出存在ActionError中的错误
Filederror :用于输出FieldError中的错误
可以输出全部错误信息,也可以加参数输出指定错误
<s:fielderror>
<s:param>username</s:param>
</s:fielderror>
actionmessage:用来输出存在ActionMessage中的信息
在struts2中底层的session被封装为Map形式
在Action中获得request和response有两种方式:
1.IOC
需继承3个接口:SessionAware, ServletRequestAware, ServletResponseAware
写3个属性:
private Map att;
private HttpServletRequest request;
private HttpServletResponse response;
将这3个属性写好getter,setter方法即可。
2. 非IOC
a) 这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
获得request对象:
A. HttpServletRequest request = ServletActionContext.getRequest ();
B.ActionContext ct = ActionContext.getContext()
HttpServletRequest request = (HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST );
b) 获得session对象:
A.Map session = ActionContext.getSession();
B.Map session = (Map)ActionContext.getContext().get(ActionContext.SESSION);
得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。
分享到:
相关推荐
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点: 1、支持对象方法调用,形式如:objName.methodName(); 2、支持...
除了OGNL,Struts2还提供了一个丰富的标签库,包括UI标签和非UI标签。UI标签主要用于创建HTML表单,非UI标签则提供控制逻辑,如条件语句。UI标签通常有通用属性,比如`label`用于设置控件的名称,`labelposition`...
### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...
- Struts1使用JSP标准机制将对象绑定到视图,而Struts2引入了“ValueStack”技术,标签库可以直接访问值,无需显式绑定对象与视图。 8. **类型转换**: - Struts1的ActionForm属性通常是String类型,依赖于...
Struts2 OGNL---标签详解析 都有实例 适合初学者
在Struts2框架中,标签库是其一大特色,它提供了丰富的自定义标签,使得开发者能够更加便捷地创建动态页面。这些标签极大地简化了JSP页面的编写,提高了代码的可读性和可维护性。 1. **Struts2核心标签库**: - `s...
在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`<s:property>`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...
Struts2标签库是Java开发Web应用程序时常用的一个强大工具,尤其在构建MVC(Model-View-Controller)架构的应用程序中发挥着重要作用。Struts2框架提供了丰富的自定义标签库,极大地简化了视图层的开发,使得开发者...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL在Struts2中的应用,并通过案例"TextOgnl"来展示其工作原理。 一、OGNL的基本...
本篇文章将详细介绍如何在Struts2中使用OGNL标签。 OGNL作为Struts2的核心部分,允许我们在JSP页面上直接访问Action类中的属性,甚至可以进行复杂的运算和控制流程。它的主要优点在于简洁和灵活,能够轻松处理Java...
在掌握Struts2和OGNL的基础上,开发者可以进一步学习Struts2的其他组件和特性,如标签库、异常处理、国际化支持、拦截器机制、输入校验、文件上传和下载等,这些都是构建复杂Web应用不可或缺的组件和功能。
在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`<s:property value="name"/>`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...
3. **标签库支持**: Struts2提供了一系列的JSP标签,这些标签利用OGNL表达式来获取和显示数据。例如,`<s:property>`标签可以用来输出对象的属性值。 4. **结果映射(Result Mapping)**: 在配置文件中,我们可以...
Struts 是一个开源的 MVC...综上所述,Struts 标签和 OGNL 提供了一种高效的方式来处理 JSP 页面中的数据展示和控制流。结合 jQuery 和 AJAX,可以构建出功能丰富的动态 Web 应用程序,实现实时的数据验证和用户交互。
在Struts2中,OGNL(Object-Graph Navigation Language)是核心表达式语言,它被广泛用于视图层,尤其是Struts2的标签库。OGNL是一种强大的、灵活的表达式语言,可以方便地访问和操作对象的属性。 OGNL的主要特点和...
本文将深入探讨OGNL的基本用法、标签的使用以及其在Struts2中的实际应用。 1. **OGNL基本概念** - OGNL是一种表达式语言,用于获取和设置对象属性。它支持点号和索引访问、方法调用、运算符、集合操作等。 - 例如...
Struts2是一个流行的Java web开发框架,其核心特性之一就是使用OGNL(Object-Graph Navigation Language)作为表达式语言,并提供了丰富的标签库来简化视图层的开发。本篇文章将详细探讨Struts2中的OGNL表达式语言...
Struts2_OGNL Demo 是一个用于演示Struts2框架中OGNL(Object-Graph Navigation Language)表达式语言的实例。这个项目旨在帮助开发者理解和学习如何在Struts2中使用OGNL来操纵对象和数据。OGNL是Struts2中一个重要的...
OGNL(Object-Graph Navigation Language)是一...以上是关于OGNL和Struts2标签的详细知识点,这些知识点是构建和维护基于Struts2框架的Web应用所必需的。掌握这些知识对于提升Java Web开发的效率和质量具有重要意义。