ITEEDU

6.4 逻辑标记

逻辑库的标记能够用来处理外观逻辑而不需要使用scriptlet。Struts 逻辑标签库包含的标记能够有条件地产生输出文本,在对象集合中循环从而重复地产生输出文本,以及应用程序流程控制。它也提供了一组在JSP 页中处理流程控制的标记。这些标记封装在文件名为struts-logic.tld 的标记包中。逻辑标记库定义的标记能够执行下列三个功能:
 条件逻辑
 重复
 转发/重定向响应

6.4.1 条件逻辑

struts 有三类条件逻辑。第一类可以比较下列实体与一个常数的大小:
 cookie
 请求参数
 bean 或bean 的参数
 请求标头
以下列出了这一类标记:

标记	          功能
<equal>	        如果常数与被定义的实体相等,返回true
<notEqual>	    如果常数与被定义的实体不相等,返回true
<greaterEqual>	如果常数大于等于被定义的实体,返回true
<lessEqual>	    如果常数小于等于被定义的实体,返回true
<lessThan>	    如果常数小于被定义的实体,返回true
<greaterThan>	   如果常数大于被定义的实体,返回true
rue

这一类的所有标记有相同的属性

属性	    描述
Value	    要进行比较的常数值
Cookie	  要进行比较的HTTP cookie 的名称
Header	  要进行比较的HTTP 请求标头的名称
parameter	要进行比较的HTTP 请求参数的名称
Name	    如果要进行比较的是bean 或bean 的属性,则这个属性代表bean 的名称
property	要进行比较的bean 属性的名称
Scope	Bean 的作用域,如果没有指定作用域,则它的搜索范围是从页到应用程序

例如:

<logic:equal parameter=”name” value=”SomeName”>
	The entered name is SomeName
</logic:equal>

判断名为”name”的请求参数的值是否是”SomeName”。

<logic:greaterThan name=”bean” property=”prop” scope=”page” value=”
	7”>
	The value of bean.Prop is greater than 7
</logic:greaterThan>

判断在页的作用域中是否有一个名为”bean”的bean,它有一个prop 属性,这个属性的值是否大于7。如果这个属性能够转化为数值,就进行数值比较,否则就进行字符串比较。
第二类条件标记定义了两个标记:
<logic:present>
<logic:notPresent>
它们的功能是在计算标记体之前判断特定的项目是否存在。标记的属性和属性值决定了要进行检查的项目。

属性	   描述
Cookie	  由这个属性指定的cookie 将被检查是否存在
Header	  由这个属性指定的请求标头将被检查是否存在
parameter	由这个属性指定的请求参数将被检查是否存在
Name	     如果没有设置property 属性,那么有这个属性指定的bean 将被检查是
否存在。  如果设置了,那么bean 和bean 属性都将被检查是否存在。
property	检查有name 属性指定的bean 中是否存在指定的属性
Scope	    如果指定了bean 的名称,这就是bean 的作用域。如果没有指定作用域,搜索的范围从页到应用程序作用域。
Role	    检查当前已经确认的用户是否属于特殊的角色
User	    检查当前已经确认的用户是否有特定的名称

例如:

<logic:notPresent name=”bean” property=”prop” scope=”page”>
	The bean property bean.prop is present
</logic:notPresent>

标记判断在页作用域中是否存在一个名为”bean”的bean,这个bean 有一个prop 属性。
第三类条件标记比较复杂,这些标记根据模板匹配的结果检查标记体的内容。换句话说,这些标记判断一个指定项目的值是否是一个特定常数的子字符串:
 <logic:match>
 <logic:notMatch>
这些标记允许JSP 引擎在发现了匹配或是没有发现时计算标记主体。属性如下:

属性	    描述
Cookie	  要进行比较的HTTP cookie 的名称
Header	  要进行比较的的HTTP 标头的名称
parameter	要进行比较的的HTTP 请求参数的名称
Name	    若要对bean 或bean 的属性进行比较,这个属性是用户指定bean 的名称
scope	    如果对bean 进行比较,这个属性指定了bean 的作用域。如果没有设置这个参数,搜索范围是从页到应用程序作用域
property	要进行比较的bean 的属性名称

例如:

<logic:match parameter=”name” value=”xyz” location=”1”>
	The parameter name is a sub-string of the string  xyz from index 1
</logic:match>

标记检查名为”name”的请求参数是否是”xyz”的子字符串,但是子字符串必须从”xyz”的索引位置1 开始(也就是说子字符串必须是”y”或”yz”)。

6.4.2 重复标记

在逻辑标记库中定义了<logic:iterate>标记,它能够根据特定集合中元素的数目对标记体的内容进行重复的检查。集合的类型可以是java.util.Iterator,java.util.Collection
,java.util.Map 或是一个数组。有三种方法可以定义这个集合:
 使用运行时间表达式来返回一个属性集合的集合
 将集合定义为bean,并且使用name 属性指定存储属性的名称。
 使用name 属性定义一个bean,并且使用property 属性定义一个返回集合的bean 属性。
当前元素的集合会被定义为一个页作用域的bean。属性如下,所有这些属性都能使用运行时表达式。

属性	      描述
collection	如果没有设置name 属性,它就指定了要进行重复的集合
Id	       页作用域bean 和脚本变量的名称,它保存着集合中当前元素的句柄
indexed	   页作用域JSP bean 的名称,它包含着每次重复完成后集合的当前索引
Length	   重复的最大次数
Name        作为集合的bean 的名称,或是一个bean 名称,它由property 属性定义的属性,是个集合
Offset	   重复开始位置的索引
property	 作为集合的Bean 属性的名称
Scope	     如果指定了bean 名称,这个属性设置bean 的作用域。若没有设置,搜索范围从页到应用程序作用域
Type	     为当前定义的页作用域bean 的类型

例如:

<logic:iterate id=”currentInt”
	collection=”<% =myList %>”
		type=”java.lang.Integer”
		offset=”1”
		length=”2”>
		<% =currentint %>
		</logic:iterate>

代码将从列表中的第一个元素开始重复两个元素并且能够让当前元素作为页作用域和java.lang.Integer 类型的脚本变量来使用。也就是说,如果myList 包含元素1,2,3,4等,代码将会打印1 和2。

6.4.3转发和重定向标记

转发标记
<logic:forward>标记能够将响应转发给重定向到特定的全局ActionForward 上。
ActionForward 的类型决定了是使用PageContext 转发响应,还是使用sendRedirect 将响应进行重定向。此标记只有一个”name”属性,用来指定全局ActionForward 的名称,例如:
<logic:forward name=”myGlobalForward”/>
重定向标记
<logic:redirect>标记是一个能够执行HTTP 重定向的强大工具。根据指定的不同属性,它能够通过不同的方式实现重定向。它还允许开发人员指定重定向URL 的查询参数。属性如下:

属性	     		描述
Forward	   		映射了资源相对路径的ActionForward
Href					资源的完整URL
Page					资源的相对路径
Name 					Map	类型的页名称,请求,会话或程序属性的名称,其中包含要附加大哦重定向URL(如果没有设置property 属性)上的“名称-值”参数。或是
          		具有Map 类型属性的bean 名称,其中包含相同的信息(没有设置property属性)
Property 			Map	类型的bean 属性的名称。Bean 的名称由name 属性指定。
Scope					如果指定了bean 的名称,这个属性指定搜索bean 的范围。如果没有设置,搜索范围从页到应用程序作用域
ParamID				定义特定查询参数的名称
ParamName			字符串类型的bean 的名称,其中包含查询参数的值(如果没有设置paramProperty 属性);或是一个bean 的名称,它的属性(在paramProperty
              属性中指定)包含了查询参数值
paramProperty	字符串bean 属性的名称,其中包含着查询参数的值
ParamScope		ParamName 定义的bean 的搜索范围

使用这个标记时至少要指定forward,href 或page 中的一个属性,以便标明将响应重定向到哪个资源。