复习Struts2之控制标签与数据标签

来源:互联网 发布:计算机视觉python 编辑:程序博客网 时间:2024/06/08 07:35

Struts2提供了一系列的标签,用于在页面视图中进行一些简单的逻辑运算,这样极大的方便了开发者的工作,下面就来大体的展示一下在Struts2中的控制标签和数据标签等一些非UI表单组件标签的运用:

一、控制标签:

1.条件判断标签:<s:if../>、<s:elseif../>、<s:else../>

<s:set name="age" value="29" /><s:if test="#age>60" >  老年人</s:if><s:elseif test="#age>35"> 中年人</s:elseif><s:elseif test="#age>15">  青年人</s:elseif><s:else> 少年</s:else>

注意:在这里if中使用的是#age,因为set标签在Stack Context中定义了一个age属性,但由于Stack Context中只有访问根元素ValueStack中的属性时才不用加#号,访问其它的非根元素才加#;其中当系统创建了一个Action实例后,会将其保存到ValueStack中,故访问Action实例中的属性也不需加#;在StackContext中除了保放有ValueStack还保存了能访5个特殊的对象,它们分别是:

  • parametes对象:用于访问HTTP请求参数;调用的是HttpServletRequest的getParameter()方法。
  • request对象:用于访问HttpServletRequest对象;调用的是它的getAttribute()方法。
  • session对象:用于访问HttpSession对象;调用它的getAttribute()方法。
  • application对象:用于访问ServletContext对象;同样调于它的getAttribute()方法。
  • attr对象:用于依次搜索PageContext、HttpServletRequest、HttpSession、ServletContext中的属性。

也就是说在OGNL表达式中访问它们时都必须加上前缀#。

2.迭代标签:<s:iterator../>

   <table border="1" width="300">   <s:iterator value="{'C++入门经典', 'Java编程思想',    'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" var="book" status="it" >       <tr <s:if test="#it.odd"> style="background-color:#bbbbbb" </s:if>>         <td><s:property value="book" /> <br /></td>       </tr>       <s:if test="#it.last">       <tr <s:if test="#it.even"> style="background-color:#bbbbbb" </s:if>>         <td>                              共<s:property value="#it.count" />本书         </td>       </tr>       </s:if>   </s:iterator>   </table>

提示:其中当使用了status属性后除了使了上面的event、odd、count、last用于判断奇偶,个数和判断是否为最后一个方法外还可使用index用于得到迭代元素的索引。

运行结果如下:

3.分隔标签:<s:generator../>

<h3>在标签内部使用</h3><table width="300" border="1">   <s:generator val="'C++入门经典 ,Java编程思想 ,       Ajax权威指南,Ruby元编程,C#高级编程'" separator="," >       <s:iterator status="bs">          <tr <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>            <td><s:property /></td>          </tr>       </s:iterator>   </s:generator></table><br /><br /><h3>在标签外部使用</h3><s:generator val="'C++入门经典 ,Java编程思想 ,     Ajax权威指南,Ruby元编程,C#高级编程'" separator="," var="books"> </s:generator><table border="1" width="300">   <s:iterator value="#books" status="bs">      <tr <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>        <td><s:property /></td>      </tr>   </s:iterator></table>
使用generator标签时,sparator属性是必须的。除了这些属性处还有可选属性count,它用于指定集合元素的总数;可选元素converter用于指定转换器。

运行结果如下:

4.集合合并标签:<s:append../>和<s:marge../>

  <s:append var="books1">     <s:param value="#{'C++入门经典':'清华出版社','Java编程思想':'清华出版社'}"/>     <s:param value="#{'Ajax权威指南','Ruby元编程','C#高级编程'}" />  </s:append>    <s:merge var="books2">      <s:param value="#{'C++入门经典','Java编程思想'}"/>     <s:param value="#{'Ajax权威指南':'电子出版社',     'Ruby元编程':'电子出版社','C#高级编程':'清华出版社'}" />  </s:merge>    <h3>append标签合并的结果</h3>  <s:iterator value="books1">     <s:property value="key" />|     <s:property value="value" /><br />  </s:iterator>  <br />  <h3>merge标签合并结果</h3>  <s:iterator value="books2">      <s:property value="key" />|      <s:property value="value" /><br />  </s:iterator>

这两个标签用法基本相同,同时支持List与List之间的合并,Map与Map之间的合并和Map与List之间的合并,它前主要的区别是合并后排列的顺利不同,如下的运行结果:

5.取子集合标签:<s:subset../>

由于subset中存在一个可选decider属性:用于添加一个实现org.apache.struts2.util.SubsetIteratorFilter.Decider过滤类,所以我们事先要准备一个自定义Decider类,如下:

package org.websoft.bean;import org.apache.struts2.util.SubsetIteratorFilter;public class MyDecider implements SubsetIteratorFilter.Decider {@Overridepublic boolean decide(Object element) throws Exception {String value = (String)element;return value.contains("编程");}}

接下来使用subset标签如下:

   <s:bean var="myDecider" name="org.websoft.bean.MyDecider" />   <s:subset source="{'C++入门经典', 'Java编程思想',       'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}"       start="2" decider="#myDecider" var="newList">   </s:subset>      <%//注意这里由于使用的是subset的var属性,故使用了attr对象来获取 %>   <s:iterator value="#attr.newList">       <s:property /><br />   </s:iterator>
应该特别注意的是在这里获取子集合时使用的是attr对象,单纯使用#newList可能得不到值,因为subset的var属性是将新集合放入pageScope内,并不是StackContext中,同其它标签不同。
其中的start属性用于指定从第三个元素开始选取包含"编程"字样的元素,除了这些属性,还有count用于指定选取个数的属性,则上面的运行结果如下:

6.排序标签:<s:sort../>

由于在使用sort时它存在一个必填属性comparator:它于用指定定义排序规则的java.util.Comparator实例,故首先定义一个Comparator类如下:

package org.websoft.bean;import java.util.Comparator;@SuppressWarnings("unchecked")public class MyComparator implements Comparator {@Overridepublic int compare(Object value1, Object value2) {return value1.toString().length() - value2.toString().length();}}

接着在页面上使用sort标签调用:

   <s:bean var="myDecider" name="org.websoft.bean.MyDecider" />   <s:subset source="{'C++入门经典', 'Java编程思想',       'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}"       start="2" decider="#myDecider" var="newList">   </s:subset>      <%//注意这里由于使用的是subset的var属性,故使用了attr对象来获取 %>   <s:iterator value="#attr.newList">       <s:property /><br />   </s:iterator>

注意上面获取排列后的列表也是使用的attr对象获取。

其上运行结果如下:

二、数据标签

摘录:李刚--《轻量级J2EE企业应用实战---Struts2+Spring3+Hibernate整合开发》第3版

1.action标签

功能:允许在JSP页面中直接调用Action

属性:

  • var 可选,将该action放入ValueStack中
  • name 必填,指定Action的名称
  • namespace 可选,Action所在namespace命名空间
  • executeResult 可选,是否包含Action的执行结果到当前页面,默认为false,即不含。
  • ignoreContextParams 可选,指定该页面的请求参数是否需要传入调用的Action,默认为true,表传入。

2.bean标签

功能:创建JavaBean实例

属性:

  • name 必填,要实例化JavaBean的类全名。
  • var 可选, 指定实例化后的JavaBean实例名。

3.date标签

功能:用于格式化一个时间

属性:

  • format 可选,指定时间格式。
  • nice 可选,是否输出指定日期与当前时刻之间的时差。默认为false
  • name 必填,要格式化的日期。
  • var 可选,将格式化的字符串放入StackContext。

注意,如果指定nice="ture"后再同时指定format属性,则format将失效,即输出时差。

4.debug标签

功能:用于查看ValueStack和StackContext中所有的值信息。

在页面中直接使用<s:debug />

5.include标签

功能:用于将JSP页面,或者一个Service包含到本地页面中。

属性:

  • value 必填,指定包含的JSP页面或Servlet。

6.param标签

功能:为其它标签提供参数。

属性:

  • name 可选,设置参数名。
  • value 可选,指定参数值。

7.push标签

功能:将某个值放到ValueStack的栈顶。

属性:

  • value 必填,指定将推入栈顶的属性。

注意,被push标签放入ValueStack中的对象只在push标签内时才有效,一旦离开push标签,则刚放入的属性将被移出ValueStack。

8.set标签

功能:用于将某值放入指定范围内。

属性:

  • scope 可选,指定范围,有application,session,request,page或action 5个值,默认为action。
  • value 可选,指定的变量值。
  • var 可选,指定后的变量名。

9.url标签

功能:生成一个URL地址。

属性:

  • action 可选,指定生成URL为哪 个action,如果不提供则使用value属性。
  • anchor 可选,指定URL锚点。
  • encode 可选,指定是否需要对参数进行编码,默认为true。
  • ecapeAmp 可选,是否需对&编码,默认为true。
  • forceAddSchemeHostAndPort 可选,强调添加scheme、主机和端口号,默认false。
  • includeContext 可选,指定是否添加上下文到URL中。
  • includeParams 可选,指定是否包含请求参数,该参数只能为none、get、all。默认为get。
  • method 可选,指定Action的方法。如果指定了action属性。则将URL链接到指定Action的特点方法。
  • namespace 可选,Action的命名空间。
  • portletMode 可选,指定结果页面的portlet模式。
  • scheme 可选,用于设置scheme属性。
  • value 可选,指定生成URL的地址值,如果value值不提供就用action值属性指定。
  • var 可选,用于指定就该属性放入ValueStack中。
  • windowState 可选,指定结果页面的portlet的窗口状态。

10.property标签

功能:输出指定值,property标签输入出value属性指定的值。

属性:

  • default 可选,如果需要输出的值为null,则显示default属性指定的值。
  • escape 可选,指定是否escapeHTML代码,默认为true。
  • value 可选,指定需要输出的值,如果没有指定value属性,则默认输出ValueStack栈顶值。


原创粉丝点击