我是靠谱客的博主 帅气帽子,最近开发中收集的这篇文章主要介绍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>

最后

以上就是帅气帽子为你收集整理的struts2基础探索之OGNL表达式详解的全部内容,希望文章能够帮你解决struts2基础探索之OGNL表达式详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部