论坛首页 Java企业应用论坛

struts2 Tags 堆栈分析

浏览 2387 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-20   最后修改:2010-05-20

 1. property: <s:property value="username"/>


 2. property 取值为字符串: <s:property value="'username'"/>


 3.  property 设定默认值: <s:property value="admin" default="管理员"/>


 4. property 设定HTML: <s:property value="'<hr/>'" escape="true"/> 输出 <hr/>

 

 5. set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName"  value="username" />

set 从request取值: <s:property value="#request.adminName" />
set 从ActionContext取值: <s:property value="#adminName" />

set 设定范围: <s:set var="adminPassword" value="password" scope="session"/>

set 从相应范围取值: <s:property value="#session.adminPassword"/>

说明:set 在以前的版本中有name id,但是在2.1版本开始不推荐使用,用var代替.实际var表示把变量压入栈actioncontext. 官方这样说明var的:Name used to reference the value pushed into the Value Stack;

这样我们可以用#key来访问.

 

6.  bean标签

 <s:bean name="com.awf.tags.Dog"  var="mydog">
    <s:param name="name" value="'pp'"></s:param>
    <s:property value="name"/>
   </s:bean>

 

说明:注意到pp用单引号,因为这时要真正用到String,如果没有加单引号,struts2会默认用OGNL到ValueStack找值.

对于为什么可以<s:property value="name"/>(取到pp)这样取值,可以做个小实验在set标签里加入<s:debug/>,这样你可能看到整个栈数据的出入,此时栈顶当然是mydog对象,这个标签执行完后就可以出栈了,这时action又保持在栈顶了.

此时mydog被存入到actioncontext栈中,所以要取值要用到#号了.

取值:<s:property value="#mydog.name/>

 

7. include标签

 <s:include value="/index.html"></s:include>

这里value的默认处理方式是要内容当做String,不是OGNL,如果这时要用OGNL可以用%,这就是%的实际意义了,其实上面所讲的标签也可以使用%,OGNL对于那些默认使用OGNL的标签会忽略%号,真搞不懂为什么全部都统一,这样我们就不用记这么多了^^,下面是具体使用方法:

<s:set var="incPage" value="%{'/index.html'}" />
 <s:include value="%{#incPage}"></s:include>

 

现在回到include标签,这个标签真的不好用对中文的支持不好,可能有BUG,所以还是用jsp自带的动态包含/静态包含.

 

8. if elseif else标签

定义变量 num= <s:set var="num" value="'100'"/>   set定义的变量存在ActionContext栈中

<s:if test="#num< 0"> 小于0 </s:if>
 <s:elseif test="#num <50"> 小于50 </s:elseif>
  <s:else>大于50</s:else>

 

<s:if test="#parameters.aaa == null">null</s:if>

 

这里说到#parameters不得不提一下,我们在地址栏输入的变量会存在ActionContext栈中,如xx/sdfds.jsp?name=1

这样我们可能用OGNL这样取值#parameters.name ,注意这里取出来的是一个集合,如果你这样访问xx/sdfds.jsp?name=1&name=2,你可以发现可以取出两个值.因为这样所以在写程序时我样最好精确定位像这样#parameters.name[0],就算你能保证只能一个值,也要这样.

 

9. iterator标签,遍历集合

<s:iterator value="{1, 2, 3}" >
   <s:property/>
</s:iterator>

 

自定义变量:

<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
   <s:property value="#x.toUpperCase()"/> |
  </s:iterator>

 

<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
   <s:property/> |
   遍历过的元素总数:<s:property value="#status.count"/> |
   遍历过的元素索引:<s:property value="#status.index"/> |
   当前是偶数?:<s:property value="#status.even"/> |
   当前是奇数?:<s:property value="#status.odd"/> |
   是第一个元素吗?:<s:property value="#status.first"/> |
   是最后一个元素吗?:<s:property value="#status.last"/>
   <br />
  </s:iterator>

 

说明:偶数和其数不是下标,下标0其实是第一个当然是奇数了.

 

遍历map:

<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">
   <s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
  </s:iterator>

 

说明:这里自定义的map要加#号,看下面例子:

<s:set var="m" value="#{1:'oo',2:'kk'}"/>
 <s:property value="#m[1]"/>

 

查了一下官方文档,没找到对map定义的说明,为什么要用到#号?这样定义有什么含义呢?

 

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics