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了。







你可能感兴趣的:(struts)