struts2基础探索之OGNL表达式详解

OGNL概述:

OGNL是一种可以吧UI元素(如table和input等基础元素)和model object(模型对象)绑定的语言,且通过OGNL的TypeConverter机制可以更容易实现值类型的转换

.在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类OgnlValueStack,他是ValueStack的默认实现类

.ValueStack贯穿整个action的生命周期,每个action实例都拥有一个ValueStack对象{ThreadLocal},其中保存了当前action对象和其他相关对象。

.struts2把ValueStack对象保存在名为:strurs.valueStack的request域中,及ValueStack的作用域为request。当action创建的时候,valuestack就创建了,action销毁时,valuestack随之销毁。

OGNL表达式的基础单元称为导航链

.在struts2的框架中,valuestack就是OGNL的根对象。

.valuestack中的数据分为两部分存放root(栈结构,CompoundRoot)和context(map形式,OgnlContext)

.valuestack中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的方法,push()和pop()方法用来对root对象中包含的数据进行存取,所以说CompoundRoot是一个栈结构。

.valuestack中的context对象时ognlcontext,他实现了map接口在OgnlValueStack类中,

如何在页面查看valuestack

<s:debug/>

在编码中获去ValueSatck的三种方法

ValueSatck = ActionContext.getContext.getValueStack();
//ActionContext为Action的上下文,有重要的6大对象
//valueStack,parameters,request,session,application,attr
//ognl表达式需选择一个作为根对象root,默认是valuestack因此不用
//添加#,但是使用其他五个对象,就必须添加#前缀
ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());
//SerlvetActionContext继承了ActionContext,

valuestack内存图

struts2输出标签

导入s标签

<%@ taglib uri="相应的标签版本" prefix="s"%>

property标签(获取输出对象内容)

<s:property value="OGNL表达式,用于获取需要输出的数据"
default="当不能获取数据时显示的内容" escapeHtml="是否针对html
标签进行实体化字符处理" />

iterator标签(进行迭代)

<s:iterator value="OGNL表达式,用于获取需要显示的集合数据" 
var="循环控制变量,每次从value集合中获取一个元素,赋值给这个变量,默认存储在page中" status="循环状态变量,包括属相值index下标序号count输出数据的序号,first是否为第一行数据,last判断是否为最后一个元素,even偶数序号,odd奇数序号" begin="起始下标值" end="终止下标值" step="遍历的步长值"></s:iterator>
<s:checkboxlist list="是一个OGNL表达式获取选项集合" name="对应提交数据的属性名称"label="提示的信息" value="默认选中值"/>

struts2中的默认3个特殊运算 $ % #

1.%{}用于实现强制OGNL计算;标签中href默认为固定的字串,不是OGNL表达式计算,如果在href后需要定义OGNL表达式计算,则需要使用%

<s:url var="u1" action="test_load.action">
    <s:param name="id" value="id"/>
</s:url>    
<s:a href="%{#u1}">修改</s:a>```

•set标签用于将某个变量设置到指定的范围中,等同于setAttribute()方法

•<s:set var="变量名称" scope="存储范围" value="存储的数据"></s:set>

•Struts 2提供了三个标签用于进行分支流程控制,分别是if标签、else if标签、else标签。其中if标签、else if标签提供了一个test属性用来进行判断

成绩为:<s:property value="#parameters.score"/><br/>
<s:if test="#parameters.score[0]> 85">优秀</s:if>
<s:elseif test="#parameters.score[0]>75">良好</s:elseif>
<s:elseif test="#parameters.score[0]>=60">及格</s:elseif>
<s:else>不及格</s:else>

•Struts 2中提供append标签用于将多个集合拼接组合成一个集合,采用的是深度优先的合并方法

<s:set var="dd" value="{'1','2','3','4'}"/>
<s:set var="ff" value="{'a','b','c','d'}"/>
<s:append var="list">
<s:param value="dd"/><s:param value="ff"/>
</s:append>
<s:iterator value="#list">
<s:property/>
</s:iterator>

•merge标签同append标签类似,也是用来组合集合成一个新集合,采用的是广度优先的合并方法

<s:set var="dd" value="{'1','2','3','4'}" />
    <s:set var="ff" value="{'a','b','c','d'}" />
    <s:merge var="list">
        <s:param value="dd" />
        <s:param value="ff" />
    </s:merge>
    <s:iterator value="#list">
        <s:property />
</s:iterator>

•generator标签可以将指定的字符串分隔成多个子字符串,并将这些子字符串放置到一个集合中

<s:generator separator="," val="%{'ab,fasdjk,t,dsaf'}" var="ddd">
<s:iterator value="#ddd" var="aa">
<s:property/><br>
</s:iterator>
</s:generator>

•subset标签用来取得集合的子集
要求在Action中定义一个选择器

public Decider getMyDecider() {
return new Decider() {
public boolean decide(Object element) throws Exception {
•int i = ((Integer)element).intValue();//  这里是迭代一个整数集合
return (((i % 2) == 0)?true:false);  //当范围值为true时表示该元素显示,否则不显示       }     };      }
<s:subset source="myList" decider="myDecider"> 
<s:iterator> 
<s:property /> 
</s:iterator>
</s:subset>

<s:subset source="myList" decider="myDecider" var="dd" />
<s:iterator value="#attr.dd"><s:property /> </s:iterator>

•Struts 2提供bean标签允许直接在JSP页面中创建JavaBean实例,可以使用param标签在该JavaBean实例传入属性值,也可以通过property标签输出该JavaBean实例的属性值

<s:bean name="java.util.Date" var="dd">
    <s:param name="year" value="1900"/>
</s:bean>

•会在页面生成一个 debug 链接,展开能看到ValueStack中的内容,该页面有显示用#key能获取到Stack Context中的值

<s:debug/>

Struts2默认提供四种主题
•Simple主题:最简单的主题
•XHTML主题:默认主题,使用常用的HTML技巧
•CSS_XHTML主题: 使用CSS实现的XHTML主题
•AJAX主题:基于XHTML主题,但是使用了AJAX功能

允许自定义修改

<s:form action="test_add.action">
        <s:textfield name="username" label="用户名称 " theme="simple" />
        <s:fielderror fieldName="username"/>
    </s:form>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值