strtus2中OGNL表达式语言及一些标签

OGNL表达式语言:
相对EL表达式,它提供了平时我们需要的一些功能,如:
?    支持对象的方法调用 ,如 xxx.sayHello();
?    支持类静态方法调用和值的访问,表达式的格式为@[类全名]@[方法名|值名],例如:@java.lang.String@format(‘foo %s’,’bar’)
?    操作集合对象。

Ognl有一个上下文(Context)的概念,其实就是一个Map结构,它实现了java.utils.Map接口,Struts2中的上下文的实现为ActionContext。
结构图:
 
当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action放进ValueStack,所以action的实例变量可以被OGNL访问。

访问上下文中的对象需要使用#符号标注命名空间,如#application、#session

另外OGNL会设定一个根对象(root对象),在Struts2中根对象是ValueStack。 如果访问根对象中的对象的属性,则可以省略#命名空间。

在Struts2中根对象ValueStack的实现类是OgnlValueStack,该对象理是我们想像的只存放单个值,而是存放一组对象。OgnlValueStack类里个List类型的root变量,用来存放一组对象。
在root变量中处于第一位的对象叫栈顶对象。通常在OGNL表达式中直接通过名字即可访问root变量中的属性。搜索顺序从栈顶开始,依次往下寻找。
Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value=”name”/>

访问其它Context中的对象。
?    application对象:用于访问ServletContext,如:#application.userName或者#application[‘userName],相当于调用ServletContext.getAttribute(“userName”);
?    session对象:用来访问HttpSession,如:#session.userName或者#session[‘userName’]相当于调用session.getAttribute(“username”)。
?    request对象:用来访问HttpServletRequest属性(attribute)的Map,如:#request.userName或者# request[‘userName’]相当于调用request.getAttribute(“username”)。
?    parameters对象:用来访问Http请求参数,如:#parameters.userName或者#parameters [‘userName’]相当于调用request.getParameter (“username”)。
?    attr对象:用于按page->request->session->application顺序访问其属性。

采用OGNL表达式创建List/Map集合对象

生成List对象
<s:set name=”list” value={‘zhang san’,’li si’,’wang wu’}/>
<s:iterator values=”#list”>
    <s:property/><br/>
</s:iterator>

[注:iterator标签在抚今迭代集合时,会把当前迭代对象的对象放在值栈的栈顶]

Scope:指定变量范围(application,session,request,page,action)。默认放置在OGNL Context中。
Value:变量的值,默认值:ValueStack栈顶的值。

生成Map对象:
<s:set name=”foobar” value=”#{‘foo1’:’bar1’,’foo2’:’bar2’}”/>
<s:iterator value=”#foobar”>
    <s:property value=”key”/>=<s:property value=”value”/>
</s:iterator>

property标签:
property标签用于输出指定值:
<s:set name=”name” value=”kk”/>
<s:property name=”#name”/>
default:可选属性,如果要输出的属性的值为null,则显示该指定的值。
escape:可选属性,指定是否格式化HTML代码。
value:可选属性,需要输出的属性值,默认输出ValueStack栈顶的值。
id:可选属性,标识。


采用OGNL表达式判断对象是否存在于集合中

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>

OGNL表达式的投影功能:
?:获得所有符合逻辑的元素。
^ :获得符合逻辑的第一个元素。
$ :获得符合逻辑的最后一个元素。

如:
<s:iterator value=”books.{?#this.price>35}”>
    <s:property value=”title”/>
    <s:property value=”price”/>
</s:iterator>

其中 .{} 用于取出books的子集。


Iterator标签:
<s:set name=”list” value={‘zhang san’,’li si’,’wang wu’}/>
<s:iterator values=”#list” status=”st”>
    <font color=<s:if test=”#st.odd”>red</s:if><s:else>blue</s:else>>
<s:property/><br/>
</s:iterator>

属性:id,name,value,status.
Suatus:中的方法:
    int getcount(),返回当前迭代的几个元素。
    int getIndex(),返回当前迭代元素的索引。
    boolean isEven(),返回当前迭代元素是否是偶数。
boolean isOdd(),返回当前迭代元素是否是奇数。
    boolean isFirst(),返回当前迭代元素是否是第一个元素。
    boolean isLast(),返回当前迭代元素是否是第最后一个元素。

if/elseif/else标签:
<s:set name=”age” value=”21”/>
<s:if test=”#age==23”>
    23
</s:if>
<s:elseif test=”#age==21”>
    21
</s:else>
<s:else>
    都不是
</s:else>

url标签:
<s:url action=”helloworld” namespace=”test” >
    <s:param name=”persionId” value=”18”/>
</s:url>
生成的路径如下:
/test/ helloworld.action?personid=18

[注:当value值作为客串处理时,使用“%”来计算OGNL表达式的值]
<s:set name=”myurl” value=”http://www.apache.org” />
<s:url value=”#myurl”/>
<s:url value=”%{#myurl}”/>
输出结果:
#myurl
http://www.apache.org

表单标签checkboxlist:
List方式:
<s:checkboxlist name=”list” list=”{‘java’,’.Net’,’Php’}” value=”{‘java’ ,’.Net’}”/>
生成的代码:
<input type=”checkbox” name=”list” value=”Java” id=”list-1” checked=”checked”/>
<label for=”list-1”>Java</label>
<input type=”checkbox” name=”list” value=”.Net” id=”list-2” checked=”checked”/>
<label for=”list-1”>.Net</label>
<input type=”checkbox” name=”list” value=”Php” id=”list-3” />
<label for=”list-1”>Php</label>

Map方式:
<s:checkboxlist name=”map” list=”{‘1’:‘java’, ‘2’:’.Net’, ‘3’:’Php’}” listKey=”key” listValue=”value” value=”{1,2}”/>
其中listKey生成value属性,listValue生成label属性
<input type=”checkbox” name=”map” value=”1” checked=”checked”/>
<label >Java</label>

token标签防止表单重复提交
1.    在表单中加入<s:token/>标签。
<s:form action=”helloworld” method=”post”/>
        <s:textfield name=”person.name”/>
        <s:token/>
</s:form>
2.    Struts2中的配置文件
<action name=”helloworld” class=”…” method=”execute”>
        <interceptor-ref name=”defaultStacke/>
        <interceptor-ref name=”token”/>
        <result name=”invalid.token”>/WEB-INF/page/message.jsp</result>
        <result>WEB-INF/page/result.jsp>
</action>
当“token”拦截器在会话的token与请求的token不一致时,将直接返回名为“invalid.token”的视图。

你可能感兴趣的:(apache,.net,jsp,PHP,struts)