`

OGNL&struts标签

 
阅读更多
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表达式struts2标签

    OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点: 1、支持对象方法调用,形式如:objName.methodName(); 2、支持...

    struts2 标签 OGNL

    除了OGNL,Struts2还提供了一个丰富的标签库,包括UI标签和非UI标签。UI标签主要用于创建HTML表单,非UI标签则提供控制逻辑,如条件语句。UI标签通常有通用属性,比如`label`用于设置控件的名称,`labelposition`...

    struts2 ognl的用法

    ### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...

    struts1&struts2

    - Struts1使用JSP标准机制将对象绑定到视图,而Struts2引入了“ValueStack”技术,标签库可以直接访问值,无需显式绑定对象与视图。 8. **类型转换**: - Struts1的ActionForm属性通常是String类型,依赖于...

    Struts2 OGNL标签详解析实例

    Struts2 OGNL---标签详解析 都有实例 适合初学者

    struts2标签使用例子

    在Struts2框架中,标签库是其一大特色,它提供了丰富的自定义标签,使得开发者能够更加便捷地创建动态页面。这些标签极大地简化了JSP页面的编写,提高了代码的可读性和可维护性。 1. **Struts2核心标签库**: - `s...

    struts2 OGNL之&lt;s:property&gt;标签访问值栈(value stack)用法

    在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`&lt;s:property&gt;`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...

    Struts标签库 Struts 标签库

    Struts2标签库是Java开发Web应用程序时常用的一个强大工具,尤其在构建MVC(Model-View-Controller)架构的应用程序中发挥着重要作用。Struts2框架提供了丰富的自定义标签库,极大地简化了视图层的开发,使得开发者...

    Struts2之Ognl详解案例TextOgnl

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL在Struts2中的应用,并通过案例"TextOgnl"来展示其工作原理。 一、OGNL的基本...

    java的Struts中的OGNL标签的使用,详细介绍

    本篇文章将详细介绍如何在Struts2中使用OGNL标签。 OGNL作为Struts2的核心部分,允许我们在JSP页面上直接访问Action类中的属性,甚至可以进行复杂的运算和控制流程。它的主要优点在于简洁和灵活,能够轻松处理Java...

    Struts2_OGNL

    在掌握Struts2和OGNL的基础上,开发者可以进一步学习Struts2的其他组件和特性,如标签库、异常处理、国际化支持、拦截器机制、输入校验、文件上传和下载等,这些都是构建复杂Web应用不可或缺的组件和功能。

    struts2标签和OGNL表达式

    在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`&lt;s:property value="name"/&gt;`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...

    Struts2 & OGNL

    3. **标签库支持**: Struts2提供了一系列的JSP标签,这些标签利用OGNL表达式来获取和显示数据。例如,`&lt;s:property&gt;`标签可以用来输出对象的属性值。 4. **结果映射(Result Mapping)**: 在配置文件中,我们可以...

    struts标签和ognl语法

    Struts 是一个开源的 MVC...综上所述,Struts 标签和 OGNL 提供了一种高效的方式来处理 JSP 页面中的数据展示和控制流。结合 jQuery 和 AJAX,可以构建出功能丰富的动态 Web 应用程序,实现实时的数据验证和用户交互。

    ognl(关于标签strusts2)

    在Struts2中,OGNL(Object-Graph Navigation Language)是核心表达式语言,它被广泛用于视图层,尤其是Struts2的标签库。OGNL是一种强大的、灵活的表达式语言,可以方便地访问和操作对象的属性。 OGNL的主要特点和...

    struts2 OGNL 表达式及各种标签的使用

    本文将深入探讨OGNL的基本用法、标签的使用以及其在Struts2中的实际应用。 1. **OGNL基本概念** - OGNL是一种表达式语言,用于获取和设置对象属性。它支持点号和索引访问、方法调用、运算符、集合操作等。 - 例如...

    Struts2的标签库及OGNL表达式语言

    Struts2是一个流行的Java web开发框架,其核心特性之一就是使用OGNL(Object-Graph Navigation Language)作为表达式语言,并提供了丰富的标签库来简化视图层的开发。本篇文章将详细探讨Struts2中的OGNL表达式语言...

    struts2_OGNL Demo

    Struts2_OGNL Demo 是一个用于演示Struts2框架中OGNL(Object-Graph Navigation Language)表达式语言的实例。这个项目旨在帮助开发者理解和学习如何在Struts2中使用OGNL来操纵对象和数据。OGNL是Struts2中一个重要的...

    struts2标签和OGNL表达式.pdf

    OGNL(Object-Graph Navigation Language)是一...以上是关于OGNL和Struts2标签的详细知识点,这些知识点是构建和维护基于Struts2框架的Web应用所必需的。掌握这些知识对于提升Java Web开发的效率和质量具有重要意义。

Global site tag (gtag.js) - Google Analytics