`

原创:Struts2控制标签的解析

阅读更多
Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作,也可以完成对集合的合并,排序等操作。
<%@ 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的控制标签有所帮助,以上内容属个人上课记录,如要转发请注明出处。愿你有所收获!




分享到:
评论
1 楼 Far_ranqing 2011-05-04  
!

相关推荐

    第五章:struts2标签库

    第五章:struts2标签库

    struts2标签解析

    Struts2标签库是Java Web开发中的一个强大工具,它为开发者提供了丰富的UI组件和控制逻辑,极大地简化了视图层的代码编写。Struts2框架的标签库基于OGNL(Object-Graph Navigation Language)表达式语言,使得在JSP...

    Struts2技术内幕 深入解析Struts架构设计与实现原理

    ### Struts2技术内幕:深入解析Struts架构设计与实现原理 #### Struts2概述 Struts2是Apache Software Foundation支持的一个开源项目,它是Struts1的下一代版本,继承了Struits1的优点,并在此基础上进行了大量的...

    struts2标签库例子

    Struts2 标签库详解 Struts2 提供了一个强大的标签库,用于简化 Web 应用程序的开发过程。这些标签可以分为两类:通用标签和 UI 标签。下面,我们将详细介绍 Struts2 标签库的使用。 4.1 通用标签 通用标签用来...

    struts2 自定义标签

    在Struts2中,自定义标签通常由Action类和结果页面共同完成,提供了一种声明式编程的方式,降低了视图与控制层的耦合度。 二、自定义标签的优点 1. 提高代码可读性:自定义标签将复杂的业务逻辑封装起来,使得HTML...

    IBM Struts2培训PPT.7z

    IBMStruts2培训PPT (大全集) ...第五章:struts2标签库.ppt 第六章:struts2国际化.ppt 第七章:Struts2验证机制.ppt 第八章:struts2文件上传下载.ppt 第九章:struts2拦截器.ppt + Struts2开发详解.ppt

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    《Struts2技术内幕-深入解析Struts2架构设计与实现原理》这本书深入探讨了Struts2的核心概念、架构和实现机制。 1. **Struts2架构设计**:Struts2的架构基于拦截器(Interceptor)模式,它将业务逻辑和表现层解耦,...

    struts2标签使用例子

    Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建企业级Java Web应用程序。在Struts2框架中,标签库是其一大特色,它提供了丰富的自定义标签,使得开发者能够更加便捷地创建动态页面。这些标签极大地简化...

    struts2-json-plugin-2.3.24-API文档-中文版.zip

    标签:apache、struts2、plugin、struts、json、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...

    struts2标签库解析

    ### Struts2 标签库解析 #### 一、引言 Struts2是一个流行的Java Web应用程序框架,它提供了一套强大的工具集用于构建高效、易于维护的企业级应用。Struts2标签库作为该框架的重要组成部分,极大地简化了前端开发...

    struts2解析文件

    Struts2是一个强大的Java EE应用程序框架,主要用于构建MVC(模型-视图-控制器)架构的Web应用。它是在Struts1的基础上发展起来的,旨在解决其前身在灵活性和可扩展性上的不足。Struts2提供了更加优雅的API,更加...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    ### Struts2技术内幕——深入解析Struts2架构设计与实现原理 #### 一、Struts2概述 Struts2是Struts框架的第二代版本,它是在Struts1的基础上进行了大量的改进和完善后诞生的。Struts2不仅继承了Struts1的核心思想...

    struts2标签介绍2

    Struts2标签库是基于OGNL(Object-Graph Navigation Language)表达式语言,提供了丰富的UI组件和逻辑控制标签,帮助开发者在视图层实现与业务逻辑的解耦。 在描述中提到的"struts2标签",我们可以深入理解以下几个...

    Struts2表单标签使用范例

    Struts2是一个强大的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的应用开发。在Struts2中,表单标签是用于处理用户输入和展示数据的关键组件,它们使得视图层的构建更加简洁和高效。本示例将...

    教案第五章struts2的标签库.pdf

    Struts 2 标签库概述 Struts 2 标签库是 Struts 2 框架中的一个核心组件,它提供了许多实用的标签来帮助开发者快速构建 web 应用程序。与 Struts 1 相比,Struts 2 标签库使用 OGNL 表达式作为基础,提供了更加强大...

    struts2常用标签详解

    本文将深入解析Struts2中的常用标签,这些标签在实际开发中非常实用,对于初学者理解并掌握Struts2的运行机制至关重要。 首先,我们需要了解Struts2标签库的主要组成部分,它们分为Action、Display、Logic、Field和...

    Struts2实例 国际化 类型转换 struts标签

    Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发。这个实例项目展示了如何在实际应用中结合Struts2、国际化、类型转换以及Struts2自定义标签来实现用户管理功能,包括用户数据的增删改查...

    struts八步教程:struts让我试着了解你

    同时,理解Struts2如何解析视图,例如使用FreeMarker或JSP作为视图技术。 9. **拦截器(Interceptor)**:拦截器是Struts2的一个强大特性,它们在Action调用前后执行,可以实现日志记录、权限控制等功能。 10. **...

    Java中:struts2+jQuery+ajax调用(引用)

    Java中:struts2+jQuery+ajax调用(引用) 代码,解析,源码,demo,实例,分析

Global site tag (gtag.js) - Google Analytics