原创:Struts2控制标签解析

本文介绍了Struts2中的控制标签及其用法,包括if/elseif/else标签、iterator标签、append标签、generator标签、subset标签和sort标签等。通过示例展示了如何使用这些标签进行流程控制和集合操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作,也可以完成对集合的合并,排序等操作。

Java代码 复制代码
  1. <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
  2. <!--引入struts2的标签库-->
  3. <%@tagliburi="/struts-tags"prefix="s"%>
  4. <%
  5. Stringpath=request.getContextPath();
  6. StringbasePath=request.getScheme()+"://"
  7. +request.getServerName()+":"+request.getServerPort()
  8. +path+"/";
  9. %>
  10. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  11. <html>
  12. <head>
  13. <basehref="<%=basePath%>">
  14. </head>
  15. <body>
  16. <h1>
  17. Struts2控制标签案例
  18. </h1>
  19. <!--
  20. <h3>OGNL中的集合操作</h3>
  21. <h5>OGNL直接生成List类型的集合</h5>
  22. 语法格式:{e1,e2,e3,e4,.......}
  23. 以上的语法中就直接生成了一个List类型的集合,该集合中包含的元素有:e1,e2,e3,e4,
  24. 如果需要更多的集合元素,则元素之间可以使用英文逗号分隔.
  25. <h5>OGNL直接生成Map类型的集合</h5>
  26. 语法格式:#{key:value,key1:value1,key2:value2,.....}
  27. 以上的语法中就直接生成了一个Map类型的集合,该Mapd对象中的每个key-value对象之间用英文的冒号隔开
  28. ,多个元素之间用逗号分隔。
  29. <h5>OGNL提供的对集合的操作符</h5>
  30. OGNL提供了两个元素符:in和notin
  31. in代表的是:判断某个元素是否在指定的集合中
  32. notin代表的是:某个元素是否不在指定的集合中
  33. 除此之外:OGNL还允许通过某个规则取得集合的子集。取得子集的操作符有:
  34. 1、?:取出所有符合选择逻辑的元素
  35. 2、^:取出符合选择逻辑的第一个元素
  36. 3、$:取出符合选择逻辑的最后一个元素
  37. <h4>控制标签</h4>
  38. Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。
  39. 数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作
  40. 也可以完成对集合的合并,排序等操作。常见的控制标签有:
  41. if:用于控制选择输出的标签
  42. elseif:与if标签结合使用,用于控制选择输出的标签
  43. else:与if标签结合使用,用于控制选择输出的标签
  44. iterator:是一个迭代器,用于将集合迭代输出
  45. sort:用于对集合排序
  46. append:用于将多个集合拼接成一个新的集合
  47. generator:是一个字符串解析器,用于将一个字符串解析成一个新的集合
  48. merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式有所有不同
  49. subset:用于截取集合的部分元素,形成一个新的集合
  50. -->
  51. <h5>
  52. if/elseif/else标签
  53. </h5>
  54. 这三个标签都是用于进行分支控制的,它们都是根据一个Boolean表达式的值,来决定是否计算、输出标签体的内容
  55. test:为boolean表达式如果为真执行标签体否则不执行
  56. <s:setname="score"value="80"></s:set>
  57. <s:iftest="%{#attr.score>60}">
  58. 成绩及格了.....
  59. </s:if>
  60. <s:elseiftest="%{#attr.score>35}">
  61. 成绩实在是太烂了....
  62. </s:elseif>
  63. <s:else>
  64. 成绩以及惨不忍睹.......
  65. </s:else>
  66. 上面的if/elseif/else标签组合使用与Java语言中的if/elseif/else条件控制结构相似
  67. <s:debug></s:debug>
  68. <h4>
  69. Iterator标签的使用
  70. </h4>
  71. Iterator标签主要用于对集合进行迭代,这里的集合包含List、Set和数组,也可以对Map类型的对象进行迭代输出
  72. 可以指定3个属性:value:这是一个可选属性,value属性指定的就是被迭代的集合,被迭代的集合通常
  73. 使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合
  74. id:这是可选属性,该属性指定了集合里的元素的ID
  75. status:可选属性,该属性指定了迭代时的IteratorStatus实例,通过该实例即可以判定当前迭代的元素的属性。
  76. 例如:是否是最后一个元素,以及当前迭代元素的索引等。IteratorStatus实例包含以下几个方法:int
  77. getCount()返回当前迭代了几个元素intgetIndex();返回当前元素的索引boolean
  78. isEven();返回当前迭代的索引是否是偶数booleanisFirst();返回当前迭代的索引是否是第一个元素boolean
  79. isLast();返回当前迭代的索引是否是最后一个元素booleanisOdd();返回当前迭代的索引是否是奇数
  80. var:当前迭代的元素begin:开始的位置end:结束的位置step:跨度
  81. <tableborder="1px"cellpadding="0"cellspacing="0">
  82. <caption>
  83. 图书名称信息
  84. </caption>
  85. <tr>
  86. <th>
  87. 图书的名称
  88. </th>
  89. </tr>
  90. <s:iteratorvar="name"
  91. value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"status="st">
  92. <s:iftest="#st.odd">
  93. <trstyle="background-color:red;">
  94. <td>
  95. <s:propertyvalue="name"/>
  96. </td>
  97. </tr>
  98. </s:if>
  99. <s:else>
  100. <trstyle="background-color:green;">
  101. <td>
  102. <s:propertyvalue="name"/>
  103. </td>
  104. </tr>
  105. </s:else>
  106. </s:iterator>
  107. </table>
  108. 作业实现表格各行换色
  109. <tableborder="1px"cellpadding="0"cellspacing="0">
  110. <caption>
  111. 图书信息
  112. </caption>
  113. <tr>
  114. <th>
  115. 图书的名称
  116. </th>
  117. <th>
  118. 图书的作者
  119. </th>
  120. </tr>
  121. <s:iteratorvar="name"
  122. value="#{'HTML入门':'redarmy','Java基础':'lihui','CSS入门':'baobao','JavaWeb实战':'yq'}">
  123. <tr>
  124. <td>
  125. <s:propertyvalue="key"/>
  126. </td>
  127. <td>
  128. <s:propertyvalue="value"/>
  129. </td>
  130. </tr>
  131. </s:iterator>
  132. </table>
  133. <h5>
  134. append标签的使用
  135. </h5>
  136. append标签用于将多个对象拼接起来,形成一个新的集合
  137. <h5>
  138. List集合拼接
  139. </h5>
  140. <s:appendvar="newList">
  141. <s:paramvalue="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"></s:param>
  142. <s:paramvalue="{'HIbernate教程','Struts2教程'}"></s:param>
  143. </s:append>
  144. <tableborder="1px"cellpadding="1px"cellspacing="1px">
  145. <caption>
  146. 图书信息2
  147. </caption>
  148. <tr>
  149. <th>
  150. 图书名称
  151. </th>
  152. </tr>
  153. <s:iteratorvalue="#newList">
  154. <tr>
  155. <td>
  156. <s:property/>
  157. </td>
  158. </tr>
  159. </s:iterator>
  160. </table>
  161. <h5>
  162. Map集合的拼接
  163. </h5>
  164. <s:appendvar="newMap">
  165. <s:param
  166. value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>
  167. <s:paramvalue="#{'HIbernate教程':'李刚','Struts2教程':'redarmy'}"></s:param>
  168. </s:append>
  169. <tableborder="1px"cellpadding="1px"cellspacing="1px">
  170. <caption>
  171. 图书信息2
  172. </caption>
  173. <tr>
  174. <th>
  175. 图书名称
  176. </th>
  177. <th>
  178. 图书作者
  179. </th>
  180. </tr>
  181. <s:iteratorvalue="#newMap">
  182. <tr>
  183. <td>
  184. <s:propertyvalue="key"/>
  185. </td>
  186. <td>
  187. <s:propertyvalue="value"/>
  188. </td>
  189. </tr>
  190. </s:iterator>
  191. </table>
  192. <h5>
  193. mapList集合的拼接
  194. </h5>
  195. <s:appendvar="newLM">
  196. <s:param
  197. value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>
  198. <!--List方式要写成Map的形式但没有value值-->
  199. <s:paramvalue="#{'HIbernate教程','Struts2教程'}"></s:param>
  200. </s:append>
  201. <tableborder="1px"cellpadding="1px"cellspacing="1px">
  202. <caption>
  203. 图书信息2
  204. </caption>
  205. <tr>
  206. <th>
  207. 图书名称
  208. </th>
  209. <th>
  210. 图书作者
  211. </th>
  212. </tr>
  213. <s:iteratorvalue="#newLM">
  214. <tr>
  215. <td>
  216. <s:propertyvalue="key"/>
  217. </td>
  218. <td>
  219. <s:propertyvalue="value"/>
  220. </td>
  221. </tr>
  222. </s:iterator>
  223. </table>
  224. <h5>
  225. merge标签
  226. </h5>
  227. merge标签的用法看起来非常像append标签,但是有区别:
  228. <s:appendvar="ast">
  229. <s:paramvalue="{'html','css','ajax'}"></s:param>
  230. <s:paramvalue="{'java','jsp','servlet'}"></s:param>
  231. <s:paramvalue="{'struts2','mysql','hibernate'}"></s:param>
  232. </s:append>
  233. <s:mergevar="mst">
  234. <s:paramvalue="{'html','css','ajax'}"></s:param>
  235. <s:paramvalue="{'java','jsp','servlet'}"></s:param>
  236. <s:paramvalue="{'struts2','mysql','hibernate'}"></s:param>
  237. </s:merge>
  238. <h3>
  239. append标签拼接
  240. </h3>
  241. <s:iteratorvalue="#ast">
  242. <s:property/>
  243. </s:iterator>
  244. <h4>
  245. merge标签拼接
  246. </h4>
  247. <s:iteratorvalue="#mst">
  248. <s:property/>
  249. </s:iterator>
  250. 以上看出:append标签的拼接方式是:第1个集合中的第一个元素第1个集合中的第二个元素第1个集合中的第三个元素
  251. 2个集合中的第一个元素第2个集合中的第二个元素第2个集合中的第三个元素第3个集合中的第一个元素第3个集合中的第二个元素
  252. 3个集合中的第三个元素merge标签的拼接方式是:第1个集合中的第一个元素第2个集合中的第一个元素第3个集合中的第一个元素
  253. 1个集合中的第二个元素第2个集合中的第二个元素第3个集合中的第二个元素第1个集合中的第三个元素第2个集合中的第三个元素
  254. 3个集合中的第三个元素
  255. <h5>
  256. generator标签
  257. </h5>
  258. 将制定的字符串按指定的分隔符分隔成多个字串.count:可选属性,指定生成集合中元素的总数
  259. separator:必填属性:指定解析字符串的分隔符val:必填属性:指定解析字符串
  260. converter:可选属性,转换器,该转换器负责将集合中的每个字符串转换成对象
  261. id:可选属性,如果指明该属性则生成的集合放入到pageContext属性中注释:generator分隔的字符串
  262. ,如果在标签体内,整个临时生成的集合将位于ValueStack的顶端.但标签结束时,被移出ValueStack。
  263. <tableborder="1px">
  264. <tr>
  265. <th>
  266. 名称
  267. </th>
  268. </tr>
  269. <s:generatorval="'this,is,a,doctor'"separator=",">
  270. <!--由于在generator标签体内,该集合位于ValueStack的栈顶,故此处迭代的就是临时生成的集合-->
  271. <s:iteratorvar="bname">
  272. <tr>
  273. <td>
  274. <s:propertyvalue="bname"/>
  275. </td>
  276. </tr>
  277. </s:iterator>
  278. </s:generator>
  279. </table>
  280. <!--通过id标识此解析的集合存入到pageContext中-->
  281. <s:generatorseparator=","val="'this,is,a,man'"id="bks"></s:generator>
  282. <h1>
  283. 标签体外打印解析的字符串集合
  284. </h1>
  285. <s:iteratorvalue="#attr.bks">
  286. <s:property/>
  287. </s:iterator>
  288. <h1>
  289. subset标签
  290. </h1>
  291. subset标签用于取得集合的子集,该标签的底层通过:org.apache.struts2.uitl.SubsetIteratorFilte类提供实现
  292. 属性:count:可选属性:代表子集中的元素个数,如果没有指定代表源集合的全部元素
  293. source:可选属性:指定源集合,如果没有指定代表是valueStack的栈顶集合start:可选属性:从第几元素开始截取
  294. decider:可选属性:指定由开发者自己决定是否选中该元素。注意事项:
  295. 在subset标签内时,subset标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集
  296. 将被移出valueStack栈。
  297. <s:subsetsource="{'java','test','mybook','txs','lihui'}"start="1"
  298. count="3">
  299. <!--由于在subset标签体内,该子集位于ValueStack的栈顶,故此处迭代的就是临时生成的集合-->
  300. <s:iterator>
  301. <s:property/>
  302. </s:iterator>
  303. <!--注意1代表的是第二元素-->
  304. </s:subset>
  305. <h5>
  306. 实现自己的Decider实例
  307. </h5>
  308. <s:beanname="edu.dc.MyDecider"id="mydecider"></s:bean>
  309. <h6>
  310. 通过自己定义的Decider实例来截取目标集合,生成子集
  311. </h6>
  312. <s:subset
  313. source="{'01Java入门','JSP入门','Servlet入门','02Java基础案例','基于Java的经典案例'}"
  314. decider="#mydecider">
  315. <s:iterator>
  316. <s:property/>
  317. </s:iterator>
  318. </s:subset>
  319. <h1>
  320. sort标签
  321. </h1>
  322. 用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的
  323. Comparator,自己的Comparator需要实现java.util.Comparator接口属性:
  324. comparator:必填属性,指定进行排序的comparator的实例
  325. source:可选属性:指定排序的集合,如果没有指定代表是valueStack的栈顶集合备注:
  326. 在sort标签内时,sort标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集
  327. 将被移出valueStack栈。
  328. <s:beanvar="mycomparator"name="edu.dc.MyComparator"></s:bean>
  329. <s:sortcomparator="#mycomparator"
  330. source="{'JavaEE','css','JavaHTMl'}">
  331. <s:iterator>
  332. <s:property/>
  333. </s:iterator>
  334. </s:sort>
  335. </body>
  336. </html>
  337. /**以上用到的Subset标签用到的bean类如下*/
  338. packageedu.dc;
  339. importorg.apache.struts2.util.*;
  340. /**自定定义Decider类,实现SubsetIteratorFilter.Decider*/
  341. publicclassMyDeciderimplementsSubsetIteratorFilter.Decider{
  342. /**实现Decider接口中的decide方法,该方法决定集合中的元素是否被选入到子集中*/
  343. publicbooleandecide(Objectarg0)throwsException{
  344. System.out.println("----------------");
  345. /**把arg0造型为字符串*/
  346. Stringstr=(String)arg0;
  347. /**如果集合中包含java那么即可被选入到子集中*/
  348. System.out.println("----------------"+(str.indexOf("Java")>0));
  349. return(str.indexOf("Java")>0);
  350. }
  351. }
  352. /**以下是sort标签实例中用到的备案实例*/
  353. packageedu.dc;
  354. importjava.util.Comparator;
  355. /**需要实现Comparator接口*/
  356. publicclassMyComparatorimplementsComparator<String>{
  357. /**
  358. *如果该方法返回一个大于0的整数,则第一个元素大于第二元素,如果为0则相同如果小于零,则第一个元素小于第二元素
  359. */
  360. publicintcompare(Stringo1,Stringo2){
  361. /**根据字符串的长度决定字符串的大小*/
  362. return(o1.length()-o2.length());
  363. }
  364. }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!-- 引入struts2的标签库 --> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> </head> <body> <h1> Struts2控制标签案例 </h1> <!-- <h3>OGNL中的集合操作</h3> <h5>OGNL直接生成List类型的集合</h5> 语法格式:{e1,e2,e3,e4,.......} 以上的语法中就直接生成了一个List类型的集合,该集合中包含的元素有:e1,e2,e3,e4, 如果需要更多的集合元素,则元素之间可以使用英文逗号分隔. <h5>OGNL直接生成Map类型的集合</h5> 语法格式:# {key:value,key1:value1,key2:value2,.....} 以上的语法中就直接生成了一个Map类型的集合,该Mapd对象中的每个key-value对象之间用英文的冒号隔开 ,多个元素之间用逗号分隔。 <h5>OGNL提供的对集合的操作符</h5> OGNL提供了两个元素符:in 和not in in代表的是:判断某个元素是否在指定的集合中 not in代表的是:某个元素是否不在指定的集合中 除此之外:OGNL还允许通过某个规则取得集合的子集。取得子集的操作符有: 1、? : 取出所有符合选择逻辑的元素 2、^ : 取出符合选择逻辑的第一个元素 3、$ : 取出符合选择逻辑的最后一个元素 <h4>控制标签</h4> Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。 数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作 也可以完成对集合的合并,排序等操作。常见的控制标签有: if :用于控制选择输出的标签 elseif:与if标签结合使用,用于控制选择输出的标签 else :与if标签结合使用,用于控制选择输出的标签 iterator:是一个迭代器,用于将集合迭代输出 sort:用于对集合排序 append:用于将多个集合拼接成一个新的集合 generator:是一个字符串解析器,用于将一个字符串解析成一个新的集合 merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式有所有不同 subset:用于截取集合的部分元素,形成一个新的集合 --> <h5> if/elseif/else标签 </h5> 这三个标签都是用于进行分支控制的,它们都是根据一个Boolean表达式的值,来决定是否计算、输出 标签体的内容 test:为boolean表达式 如果为真执行标签体 否则不执行 <s:set name="score" value="80"></s:set> <s:if test="%{#attr.score>60}"> 成绩及格了..... </s:if> <s:elseif test="%{#attr.score>35}"> 成绩实在是太烂了.... </s:elseif> <s:else> 成绩以及惨不忍睹....... </s:else> 上面的if/elseif/else标签组合使用与Java语言中的if/else if/else条件控制结构相似 <s:debug></s:debug> <h4> Iterator标签的使用 </h4> Iterator标签主要用于对集合进行迭代,这里的集合包含List、Set和数组,也可以对Map类型的对象 进行迭代输出 可以指定3个属性: value :这是一个可选属性,value属性指定的就是被迭代的集合,被迭代的集合通常 使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合 id:这是可选属性,该属性指定了集合里的元素的ID status:可选属性,该属性指定了迭代时的IteratorStatus实例,通过该实例即可以判定当前 迭代的元素的属性。 例如:是否是最后一个元素,以及当前迭代元素的索引等。 IteratorStatus实例包含以下几个方法: int getCount()返回当前迭代了几个元素 int getIndex();返回当前元素的索引 boolean isEven();返回当前迭代的索引是否是偶数 boolean isFirst();返回当前迭代的索引是否是第一个元素 boolean isLast();返回当前迭代的索引是否是最后一个元素 boolean isOdd();返回当前迭代的索引是否是奇数 var:当前迭代的元素 begin:开始的位置 end:结束的位置 step:跨度 <table border="1px" cellpadding="0" cellspacing="0"> <caption> 图书名称信息 </caption> <tr> <th> 图书的名称 </th> </tr> <s:iterator var="name" value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}" status="st"> <s:if test="#st.odd"> <tr style="background-color: red;"> <td> <s:property value="name" /> </td> </tr> </s:if> <s:else> <tr style="background-color: green;"> <td> <s:property value="name" /> </td> </tr> </s:else> </s:iterator> </table> 作业实现表格各行换色 <table border="1px" cellpadding="0" cellspacing="0"> <caption> 图书信息 </caption> <tr> <th> 图书的名称 </th> <th> 图书的作者 </th> </tr> <s:iterator var="name" value="#{'HTML入门':'redarmy','Java基础':'lihui','CSS入门':'baobao','JavaWeb实战':'yq'}"> <tr> <td> <s:property value="key" /> </td> <td> <s:property value="value" /> </td> </tr> </s:iterator> </table> <h5> append标签的使用 </h5> append标签用于将多个对象拼接起来,形成一个新的集合 <h5> List集合拼接 </h5> <s:append var="newList"> <s:param value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"></s:param> <s:param value="{'HIbernate教程','Struts2教程'}"></s:param> </s:append> <table border="1px" cellpadding="1px" cellspacing="1px"> <caption> 图书信息2 </caption> <tr> <th> 图书名称 </th> </tr> <s:iterator value="#newList"> <tr> <td> <s:property /> </td> </tr> </s:iterator> </table> <h5> Map集合的拼接 </h5> <s:append var="newMap"> <s:param value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param> <s:param value="#{'HIbernate教程':'李刚','Struts2教程':'redarmy'}"></s:param> </s:append> <table border="1px" cellpadding="1px" cellspacing="1px"> <caption> 图书信息2 </caption> <tr> <th> 图书名称 </th> <th> 图书作者 </th> </tr> <s:iterator value="#newMap"> <tr> <td> <s:property value="key" /> </td> <td> <s:property value="value" /> </td> </tr> </s:iterator> </table> <h5> map List集合的拼接 </h5> <s:append var="newLM"> <s:param value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param> <!-- List方式要写成Map的形式 但没有value值 --> <s:param value="#{'HIbernate教程','Struts2教程'}"></s:param> </s:append> <table border="1px" cellpadding="1px" cellspacing="1px"> <caption> 图书信息2 </caption> <tr> <th> 图书名称 </th> <th> 图书作者 </th> </tr> <s:iterator value="#newLM"> <tr> <td> <s:property value="key" /> </td> <td> <s:property value="value" /> </td> </tr> </s:iterator> </table> <h5> merge标签 </h5> merge标签的用法看起来非常像append标签,但是有区别: <s:append var="ast"> <s:param value="{'html','css','ajax'}"></s:param> <s:param value="{'java','jsp','servlet'}"></s:param> <s:param value="{'struts2','mysql','hibernate'}"></s:param> </s:append> <s:merge var="mst"> <s:param value="{'html','css','ajax'}"></s:param> <s:param value="{'java','jsp','servlet'}"></s:param> <s:param value="{'struts2','mysql','hibernate'}"></s:param> </s:merge> <h3> append标签拼接 </h3> <s:iterator value="#ast"> <s:property /> </s:iterator> <h4> merge标签拼接 </h4> <s:iterator value="#mst"> <s:property /> </s:iterator> 以上看出:append标签的拼接方式是: 第1个集合中的第一个元素 第1个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第一个元素 第2个集合中的第二个元素 第2个集合中的第三个元素 第3个集合中的第一个元素 第3个集合中的第二个元素 第3个集合中的第三个元素 merge标签的拼接方式是: 第1个集合中的第一个元素 第2个集合中的第一个元素 第3个集合中的第一个元素 第1个集合中的第二个元素 第2个集合中的第二个元素 第3个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第三个元素 第3个集合中的第三个元素 <h5> generator标签 </h5> 将制定的字符串按指定的分隔符分隔成多个字串. count:可选属性,指定生成集合中元素的总数 separator:必填属性:指定解析字符串的分隔符 val:必填属性:指定解析字符串 converter:可选属性,转换器,该转换器负责将集合中的每个字符串转换成对象 id:可选属性,如果指明该属性则生成的集合放入到pageContext属性中 注释:generator分隔的字符串 ,如果在标签体内,整个临时生成的集合将位于ValueStack的顶端 .但标签结束时,被移出ValueStack。 <table border="1px"> <tr> <th> 名称 </th> </tr> <s:generator val="'this,is,a,doctor'" separator=","> <!-- 由于在generator标签体内,该集合位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 --> <s:iterator var="bname"> <tr> <td> <s:property value="bname" /> </td> </tr> </s:iterator> </s:generator> </table> <!-- 通过id标识此解析的集合存入到pageContext中 --> <s:generator separator="," val="'this,is,a,man'" id="bks"></s:generator> <h1> 标签体外打印解析的字符串集合 </h1> <s:iterator value="#attr.bks"> <s:property /> </s:iterator> <h1> subset标签 </h1> subset标签用于取得集合的子集,该标签的底层通过:org.apache.struts2.uitl.SubsetIteratorFilte类提供实现 属性: count:可选属性:代表子集中的元素个数,如果没有指定代表源集合的全部元素 source:可选属性:指定源集合,如果没有指定代表是valueStack的栈顶集合 start:可选属性:从第几元素开始截取 decider:可选属性:指定由开发者自己决定是否选中该元素。 注意事项: 在subset标签内时,subset标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集 将被移出valueStack栈。 <s:subset source="{'java','test','mybook','txs','lihui'}" start="1" count="3"> <!-- 由于在subset标签体内,该子集位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 --> <s:iterator> <s:property /> </s:iterator> <!-- 注意1代表的是第二元素 --> </s:subset> <h5> 实现自己的Decider实例 </h5> <s:bean name="edu.dc.MyDecider" id="mydecider"></s:bean> <h6> 通过自己定义的Decider实例来截取目标集合,生成子集 </h6> <s:subset source="{'01Java入门','JSP入门','Servlet入门','02Java基础案例','基于Java的经典案例'}" decider="#mydecider"> <s:iterator> <s:property /> </s:iterator> </s:subset> <h1> sort标签 </h1> 用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的 Comparator,自己的Comparator需要实现java.util.Comparator接口 属性: comparator:必填属性,指定进行排序的comparator的实例 source:可选属性:指定排序的集合,如果没有指定代表是valueStack的栈顶集合 备注: 在sort标签内时,sort标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集 将被移出valueStack栈。 <s:bean var="mycomparator" name="edu.dc.MyComparator"></s:bean> <s:sort comparator="#mycomparator" source="{'JavaEE','css','JavaHTMl'}"> <s:iterator> <s:property /> </s:iterator> </s:sort> </body> </html> /**以上用到的Subset标签用到的bean类如下*/ package edu.dc; import org.apache.struts2.util.*; /** 自定定义Decider类,实现SubsetIteratorFilter.Decider */ public class MyDecider implements SubsetIteratorFilter.Decider { /** 实现Decider接口中的decide方法,该方法决定集合中的元素是否被选入到子集中 */ public boolean decide(Object arg0) throws Exception { System.out.println("----------------"); /** 把arg0造型为字符串 */ String str = (String) arg0; /** 如果集合中包含java 那么即可被选入到子集中 */ System.out.println("----------------" + (str.indexOf("Java") > 0)); return (str.indexOf("Java") > 0); } } /**以下是sort标签实例中用到的备案实例*/ package edu.dc; import java.util.Comparator; /** 需要实现Comparator接口 */ public class MyComparator implements Comparator<String> { /** * 如果该方法返回一个大于0的整数,则第一个元素大于第二元素,如果为0则相同 如果小于零,则第一个元素小于第二元素 */ public int compare(String o1, String o2) { /** 根据字符串的长度决定字符串的大小 */ return (o1.length() - o2.length()); } }



希望以上内容对学员学习struts2的控制标签有所帮助,以上内容属个人上课记录,如要转发请注明出处。愿你有所收获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值