首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

Struts 二 的标签库(二)

2012-10-27 
Struts 2 的标签库(二)?三、 控制标签????? Struts 2 的非 UI 标签包括控制标签和数据标签,主要用于完成流

Struts 2 的标签库(二)

?

三、 控制标签

?

???? Struts 2 的非 UI 标签包括控制标签和数据标签,主要用于完成流程控制,以及操作 Struts 2 的 ValueStack。数据标签主要结合 OGNL 表达式进行数据访问。控制标签可以完成 流程控制,如分支、循环等,也可以完成对集合的合并、排序等操作。

控制标签有如下 9 个:

 ● if : 控制选择输出

 ● elseIf/elseif : 与 if 结合使用。

 ● else : 与 if 结合使用

 ● append : 将多个集合拼接成一个新集合

 ● generator : 字符串解析器,将一个字符串解析成一个集合

 ● iterator : 迭代输出集合

 ● merge : 用于将多个集合拼接成一个新集合,与 append 拼接方式有所不同

 ● sort : 对集合进行排序

 ● subset : 截取集合的部分元素,形成新的子集合。

?

?

3.1? if/elseif/else 标签

以下代码是基于 Struts 2.2.1

web.xml

?

struts.xml

?

s-if.jsp

?

?

?

3.2? iterator 标签

以下所有代码都基于 3.1

?

  iterator 标签主要用于对集合进行迭代,包含 List setMap

?

3 个 属性:

 value : 可选属性,指定被迭代的集合,通常都是使用 OGNL 表达式指定,如果没有指定 value 属性,则使用 ValueStack 栈顶的集合。

 id : 可选属性,指定了集合里元素的 ID

 status : 可选属性,指定迭代时的 IteratorStatus 实例,通过该实例即可判断当前迭代元素的属性。例如是否为最后一个,以及当前迭代元素的索引等。

?

?

如果指定了 status 属性,即每次迭代时都会有一个 IteratorStatus 实例,包含如下几个方法:

● int getCount() : 返回当前迭代了几个元素。

● int getIndex() : 返回当前迭代元素的索引。

● boolean isEven() : 返回当前被迭代元素的索引是否是偶数

● boolean isFirst() : 返回当前被迭代元素是否是第一个元素

● boolean isLast() : 返回当前被迭代元素是否是最后一个元素

● boolean isOdd() : 返回当前被迭代元素的索引是否是奇数

?

s-iterator.jsp

?

上面方法有 如何把 list、map 提交回 action

?

IteratorAction.java

?

3.3? append 标签

以下所有代码都基于 3.1

?

??? append 标签用于将多个集合拼接起来。使用 <s:append .../> 标签时需要指定一个 var 属性(也可以用 id 推荐用 var),该属性确定拼接生成的新集合的名字<s:append .../> 可以接受多个 <s:param ../> 子标签,每个子标签指定一个集合<s:append .../><s:param ../> 指定的集合拼接成一个集合

?

注意:? <s:append .../> 不仅可以拼接多个 List ,也能拼接多个 Map,甚至能将一个 Map 和 一个 List 拼接起来,生成新的 Map

?

/09/s-append.jsp

?

AppendAction.java

?

?

?

3.4? generator 标签

以下所有代码都基于 3.1

?

  generator 标签可以将指定字符串按指定分隔符分成多个子串,临时生成的子串可以用 iterator 标签迭代输出。整个临时生成的集合将位于 ValueStack 顶端,一旦标签结束,将被移出 ValueStack

?

属性:

 ● count : 可选,指定生成集合中元素的总数

 ● separator : 必填,指定用于解析字符串的分隔符

 ● val : 必填,指定被解析的字符串

 ● converter : 可选,指定一个转换器,负责将集合中的每个字符串转换成对象,通过该转换器可以将一个字符串解析成对象集合。该属性必须是一个 org.apache.struts2.util.IteratorGenerator.Converter 对象

 ● var : 可选,指定了该属性,则将生成的 Iterator 对象放入 Stack Context 中。 可以替换成 id, 推荐使用 var

?

?

 如果指定了 count? ,则 count 设置集合中最多只能包含 count 个元素

 如果指定了 var ,会将生成的集合放入 Struts 2 Stack Context 中,还会设置成 request 范围的属性

?

/09/s-generator-count.jsp

?

GeneratorAction.java

?

3.5? merge 标签

以下所有代码都基于 3.1

?

? merge 标签的用法和 append 标签很像,也是用于多个集合拼接成一个集合。但是和 append 有区别。

? 假设有 3 个集合(每个集合包含 3 个集合元素),分别使用 append merge 方式,产生新集合的区别:

?

append 新集合的元素顺序:

? ① 第一个集合中的第一个元素

? ② 第一个集合中的第二个元素

? ③ 第一个集合中的第三个元素

? ④ 第二个集合中的第一个元素

? ⑤ 第二个集合中的第二个元素

? ⑥ 第二个集合中的第三个元素

? ⑦ 第三个集合中的第一个元素

? ⑧ 第三个集合中的第二个元素

? ⑨ 第三个集合中的第三个元素


merge 新集合的元素顺序:

? ① 第一个集合中的第一个元素

? ② 第二个集合中的第一个元素

? ③ 第三个集合中的第一个元素

? ④ 第一个集合中的第二个元素

? ⑤ 第二个集合中的第二个元素

? ⑥ 第三个集合中的第二个元素

? ⑦ 第一个集合中的第三个元素

? ⑧ 第二个集合中的第三个元素

? ⑨ 第三个集合中的第三个元素

?

/09/s-merge.jsp

?

MergeAction

?

3.6? subset 标签

以下所有代码都基于 3.1

?

? subset 标签用于取得集合的子集,通过底层 org.apache.struts2.util.SubsetIteratorFilter 类提供实现

?

属性:

  count : 可选。 指定子集中元素的个数。 默认取得源集合的全部元素
  source : 可选。 指定源集合。 默认取得 ValueStack 栈顶集合
  start : 可选。 指定子集从源集合的第几个元素开始截取。 默认从第一个开始(即 start = 0)
  decider : 可选。 指定由开发者自己决定是否选中该元素。该属性必须指定一个 org.apache.struts2.util.SubsetIteratorFilter.Decider 对象
  var : 可选。 如果指定该属性,则将生成的 Iterator 对象设置成 page 范围的属性。可以用 id 替换,推荐用 var。

注意 : 在 subset 标签内时,生成的子集合放在 ValueStack 栈顶,可以直接迭代生成的子集合。如果该标签结束后,生成的子集合将被移出 ValueStack 栈,因此不能之间迭代。

?

除此之外,Struts 2 还允许 开发者自己决定截取标准如果开发者需要实现自己的截取标准,则需要实现一个 Decider 类, Decider 类需要实现 SubsetIteratorFilter.Decider 接口,并实现一个 boolean decide(Object element) 方法,如果返回 true 则表明该元素将被放入子集中。

?

/09/s-subset.jsp

?SubsetAction

?

注意 : subset generator var 属性的作用域不同,subset var 放入 pagegenerator var 放入 Stack Contextrequest,这个可能是 Struts 2bug

?

?

3.7 sort 标签

以下所有代码都基于 3.1

?

?sort 标签用于对指定集合进行排序,必须提供自己的排序规则,即实现 java.util.Comparator 接口
?属性:
  comparator : 必填。指定进行排序的 Comparator 实例
  source : 可选。 指定被排序的集合。 默认 ValueStack 栈顶集合进行排序
  var : 可选。 指定后,将生成的 Iterator 对象设置成 page 范围的属性。可以换成 id

?

MyComparator

?

?

热点排行