现在的位置: 首页 > 综合 > 正文

struts Logic标签介绍

2013年05月11日 ⁄ 综合 ⁄ 共 7957字 ⁄ 字号 评论关闭

 

 

Logic标签库
Logic标签库提供条件处理、循环以及流控制的标签。
?    条件处理:equal/notEqual,empty/notEmpty,greaterEqual/lessEqual/greaterThan/ lessThan,match/notMatch,messagesPresent/messagesNotPresent以及present/ notPresent。
?    循环:iterate标签。
?    流控制:forward和redirect标签。
所有这些标签,除了涉及到流控制的那两个,都有JSTL对应物,所以应该尽可能地使用JSTL版本。
C.4.1  公共属性集
对于Logic标签库,有两个公共的属性集。第一个,我们称做基础对象属性集(或简称base- attrs),列于表C-11中,以及属于对应的标签所适用于的JavaBean对象。
表C-11  base-attrs属性集
属性名称     用    法
name     基础对象的名称。如果这个属性被忽略,那么隐含的基础对象(如果有)会被使用。如果该标签被包围在一个<html:form>中,隐含的基础对象将是与该表单关联的表单bean
property     基础对象上的属性,其值被用于标签的功能。例如标签是一个比较标签,那么基础对象上的属性的值便被用于比较。这假定基础对象上有一个对应的getXXX()函数
scope    表示一个作用域,将在其上根据给定的name属性查找对象。如果scope没有被声明,那么要根据name 属性指定的名称查找所有作用域。有效的作用域是page、request、session和application
一些标签允许使用来自其他来源的值(也就是说,除了基础对象上的属性之外)来完成它们的工作。这些扩展Property属性(exprop-attrs)列出在表C-12中。
表C-12  exprop-attrs属性集
属性名称     用    法
cookie     要使用的cookie的名称
header     要使用的HTTP请求头变量的名称。该名称的匹配是忽略大小写的
parameter     要使用的URL请求参数的名称。如果不只一个,将使用第一个
C.4.2  选择器属性
Logic库中的许多标签都使用选择器属性。这些属性被用于选择对象或属性来执行该标签的功能。选择器属性是cooki、header、name/property和parameter。
Struts将按这个次序询问这些属性。例如,如果指定了cookie和parameter,只有cookie属性被用于执行该标签的任务。
注意,name/property属性在这里被视做一对。也就是说如果指定了name,可以同时可选地指定property属性。如果它们的作用是选择器属性的话,不能仅仅单独指定property,必须同时指定name。可以参考每个标签的说明文档来区分是否是这种情况。
C.4.3  针对Logic标签库的Struts-EL标签
只有下列标签在逻辑库具有EL使能的版本:forward、iterate、match/notMatch、messages- Present/messagesNotPresent、present/notPresent以及redirect。其他标签具有更简单的JSTL对应物。
注意    EL使能的标签是指那些允许使用EL表达式的标签。参看第10章的例子。
C.4.4  empty/notEmpty
empty将在指定的属性或基础对象为null的时候,即一个零长度字符串,或一个空的集合或Map的时候,有条件地执行它的标签体。如果property属性没有被指定,测试将基于name属性给定的基础对象进行。
notEmpty是empty的逆命题。
1. 使用限制
name属性必须指定,即使嵌套在一个<html:form>内部。
2. 属性
只有base-attrs属性集适用。
3. 示例
以下例子展示了如果MyCollection是空的,将使用<logic:empty>标签来有条件地处理嵌套的<bean:write>标签。
 
下一个例子说明了property属性的使用:
 
<bean:write>只有当getEmail()函数返回null,或一个零长度字符串时才会被执行。还可以使用作用域变量来指定在其中查找bean的作用域:
 
在前面的例子中,如果MyBean可以在请求作用域中找到,<bean:write>将在基础对象之上被调用。
4. 对应物
可以轻易地使用JSTL的<c:if>或<c:choose>... <c:when>来创建empty和notEmpty的对应物。例如使用<c:if>,前面的例子将成为:
 

 
必须使用JSTL隐含的对象(requestScope、sessionScope等)来指定一个作用域:
 
C.4.5  equal/notEqual
equal检查给定的属性(或扩展属性)是否等于一个给定值。如果是这样的话,equal标签的标签体便会被执行。
notEqual是equal的逆命题。
1. 使用限制
value属性是必需的。必须同时指定一个选择器属性(参见本节开始的定义)。
2. 属性
base-attrs和exprop-attrs属性集都是接受的。还有一个额外的value属性,它是属性或扩展属性将要与之比较的一个常数值。
3. 示例
以下例子展示了,如果变量client等于“Joe”,<logic:equal>标签将会处理嵌套的<bean:write>标签。
 
下一个例子说明parameter属性的使用。
 
标签体部分只有在请求URL中具有一个值为Susan的名为username的参数才会被执行。如果有不只一个这样的参数,URL上第一个遇到的参数将被使用。
还可以使用scope变量来指定在其中查找一个bean的作用域。
 
在这个例子中,如果在会话作用域中有一个名为MyBean的bean,并且它的getEmail()函数返回一个等于joey@_joey.com的值,<bean:write>便会在基础对象之上被调用。注意,如果MyBean值为null,或者不具有一个getEmail()函数,则会抛出一个异常。
4. 对应物
可以轻易地使用JSTL的<c:if>或<c:choose>... <c:when>来创建equal和notEqual的对应物。例如使用<c:if>,前面的例子将成为:
 
下一个例子说明parameter属性的使用。
 
还可以使用scope变量来指定在其中查找一个bean的作用域。
 
此外还要注意,不同于那些仅允许一个常数值的Struts标签,JSTL对应物没有这样的限制。下面是将一个变量与另一个变量比较的例子(用Struts标签是不可能实现这个的,因为要与之比较的值必须是常量,当然,除非你乐意使用scriptlet):
 
C.4.6  forward
这个标签导致页面被转发到指定的全局转发(参见第9章和第17章)。此标签没有标签体。参见<logic:redirect>。
1. 使用限制
name属性是必需的。
2. 属性
name属性是要使用的全局转发的名称。
注意    如果希望转发到一个Tiles定义,可以从一个Action子类中进行,然后它又被暴露为一个全局转发。
3. 示例
考虑在struts-config.xml中声明的全局转发:
 
那么,转发
 
将导致页面login.jsp被显示。同样地,转发
 
将导致Logoff.do表单处理器被调用,可以使用它来加载一个Tiles定义。
4. 对应物
无。
C.4.7  greaterEqual/lessEqual/greaterThan/lessThan
greaterEqual是一个有条件标签,只有在给定的属性(或扩展属性)大于或等于由value属性给出的常数值的时候,其标签体才会被执行。本组中的其他标签也是类似定义的。
注意,如果值不是一个数值,它会被解释为一个字符串,并且会执行字符串之间的比较(使用Java的标准字符串比较)。
1. 使用限制
value属性是必需的。必须同时指定一个选择器属性(参见本节开始的定义)。
2. 属性
base-attrs和exprop-attrs属性集都是接受的。还有一个额外的value属性,它是属性或扩展属性将要与之比较的一个常数值。
3. 示例
下面的例子展示了使用<logic:greaterThan>标签来在变量hits大于或等于10的时候处理嵌套的标签(没有具体展示出来)。
 
下一个例子说明cookie属性的使用。
 
只有当称做logintries的cookie大于3的时候,<bean:message>才会执行。
4. 对应物
可以轻易地使用JSTL的<c:if>或<c:choose>...<c:when>来创建这些标签的对应物。例如使用<c:if>,前面的例子将成为:
 
下一个例子说明cookie属性的使用:
 
还要注意,JSTL对应物不同于仅容许一个常数值的Struts标签,它没有这样的限制。
C.4.8  iterate
<logic:iterate>标签可用于在Collections、Map、Enumerations、数组或Iterator(都被认为是可迭代的对象)之上进行迭代。嵌套在一个<logic:iterate>之内的标签(或静态文字)将被执行为JSP的响应流(即写出到最终的HTML页面中)。
1. 使用限制
id属性是必需的。此外还必须指定可迭代的对象(使用name/property属性或者collection属性)。
2. 属性
iterate标签使用base-attrs来指定要对其进行迭代的Collection/Map/Enumerations /数组/Iterator的基础对象。除了这些,还有其他几个可以使用。
?    collection。name/property组合仅允许在可以被读取为JavaBean属性的可迭代对象之上迭代。这可以是十分限制性的。例如:
 
意味着调用函数:
 
以决定可迭代的对象。然而,许多Java类不使用JavaBeans的getXXX()约定,所以对它们需要使用一个不同的方法。解决方案是随一个scriptlet一起使用的collection属性。
 
?    id:指定从可迭代的对象中读出的单个元素的名称。
?    indexId:当前索引,从零开始。
?    length:从可迭代对象读取的元素的最大数目。如果不存在,所有的元素都会被读取。
?    offset:从可迭代的对象中返回的第一个元素的索引。例如,如果该可迭代对象是一个数组[a,b,c],使用offset = "1"将导致仅读取b和c。注意,偏移量是零基的,就像Java中的约定一样。
?    type:从可迭代对象中读取的元素的全限定类名。如果元素不匹配这个类名,将会抛出一个ClassCastException异常。
3. 示例
这就是基本用法:
 
使用collection属性的用法:
 
以及使用indexId属性来显示当前迭代编号的用法:
 
4. 对应物
JSTL的<c:forEach>是<logic:iterate>的最好替代。这里是使用JSTL前面的那个例子:
 
第二个例子不需要collection属性:
 
 
最后可以这样来暴露迭代编号:
 
C.4.9  match/notMatch
match标签将在一个在给定属性(或扩展属性)包含作为一个子串的value属性的时候执行其标签体的条件处理标签。notMatch是match的逆命题。
1. 使用限制
value属性是必需的。必须同时指定一个选择器属性(参见本节开始的定义)。
2. 属性
base-attrs和exprop-attrs属性集都是可接受的,并且具有它们的通常意义。除这些之外,还有两个额外的属性:
?    value:属性或扩展属性将要匹配的一个常数子串。例如,如果属性或扩展属性等于字符串“Visit Zimbabwe”,那么value="im"将导致一次匹配,而value="Zic"则不会。
?    location:此属性值可以取值start或者end,指定在源字符串内部可以从哪里发生匹配。如果忽略,匹配可以从任何地方开始。
3. 示例
下面是查找一个具有.sg后缀的电子邮件地址的简单例子:
 
或可以询问HTTP请求头:
 
4. 对应物
可以轻易地使用JSTL的<c:if>(或<c:choose>...<c:when>)以及JSTL函数创建这些标签的对应物。(这是一个标准JSTL函数库。要使用它,必须声明JSTL函数标签库。)例如,使用<c:if>的前面的例子将是:
 
 

 
5. messagesPresent/messagesNotPresent
messagesPresent是一个如果给定的消息或错误信息存在于当前请求之中的时候,就执行其标签体的条件处理标签。messagesNotPresent是messagesPresent的逆命题。
请注意以下术语:
?    “错误消息(Error messages)”是保存在一个ActionMessages/ActionErrors实例中的ActionMessage实例,ActionMessages或ActionErrors实例又在请求中保存在关键字Globals.ERROR_KEY之下。
?    “消息(Messages)”是保存在一个ActionMessages/ActionErrors实例中的ActionMessage实例,ActionMessages或ActionErrors实例又在请求中保存在关键字Globals.MESSAGE_ KEY之下。
例如,ActionForm的validate()函数可能返回一个ActionErrors实例,其中包含一个或多个ActionMessage 实例。这些ActionMessage实例被按关键字保存,如在第6章以及第7章所见。关键字被作为对应的错误信息/消息的名称。

错误消息和消息都可以使用<html:errors>显示出来,或者使用<html:messages>进行迭代。
6. 使用限制
7. 属性
有3个属性:name,property和message。注意,name和property属性不具有它们通常的意义。反之,取决于这些属性的设置,将进行以下检查:
?    如果没有指定任何属性,messagesPresent简单地检测是否在当前请求中有错误消息存在。如果有错误消息,便执行它的标签体。设置message = " true "将导致messagesPresent检查所有消息。
?    如果property属性被指定,messagesPresent将检测是否有具有该名称的错误消息。再次说明,设置message = "true"导致检查所有适当的消息。
?    name属性允许你在请求之中,根据Globals.ERROR_KEY或Globals.MESSAGE_KEY之外的关键字寻找错误消息/消息。注意,如果指定了message属性,name属性会被忽略。
?    如果name属性被指定,那么即使一个String或者String数组在请求中也会导致匹配。
最好以例子来说明不同的组合。
8. 示例
最简单的例子是测试错误消息是否存在:
 
 
或者可以测试一个特定的错误信息:
 
如果Action提交了消息,也可以测试它们:
 
并且可以在请求中基于一个特定的关键字寻找错误消息或者消息,或者String或者String数组。
 
9. 对应物
无。当然,有一些技巧可以让你同时使用JSTL的<c:if>和scriptlet。
C.4.10  present/notPresent
present会检查请求作用域,是否在指定属性或者扩展属性之下有一个对象存在。如果该对象存在,该标签的标签体会被执行。notPresent是present的逆命题。
1. 使用限制
必须指定一个选择器属性(参见本节开始的定义)或者user或者role属性。
2. 属性
base-attrs和exprop-attrs属性集都是可以接受的,并且具有它们通常的意义。如果property属性被指定,present会检查出返回值不是null。
除此之外,还有user和role属性。这取决于基础的servlet认证一个用户的技术,以及为该用户指定一个或多个角色。关于这些是如何执行的超过本书范围之外,因此如果你还感兴趣,应该参考最新的servlet参考文档。user属性指定当前请求的远程用户的名称。role属性是角色的一个逗号定界字符串。如果任何一个这些角色是当前用户的一个有效角色,present会执行其标签体。
3. 示例
最简单的用法是检查请求上一个对象是否存在:
 
类似地,property属性的使用是为了保证给定的属性不是null。
 
你还可以检查当前经过认证的用户名:
 
或者该当前认证用户具有任何指定的角色:
 
4. 对应物
可以轻易地使用JSTL的<c:if>或<c:choose>...<c:when>来创建这些标签的对应物。例如使用<c:if>,前面的例子将成为:
 
 
不幸的是,最后一个检查角色的例子没有JSTL对应物。然而有一个JSF安全扩展可以简洁地处理这些情况。如果感兴趣,请参考http://jsf-security.sourceforge.net。
C.4.11  redirect
这个标签执行一次页面重定向。该标签没有标签体。参见<logic:forward>。
1. 使用限制
必须指定forward、href、action或者page属性来指定重定向到的基础URL。
2. 属性
有两个主要的属性集。第一个属性集指定重定向到的页面的基础URL。有4种方式来完成这个任务。
?    forward:重定向到的全局转发的名称(例如,forward = "login")。
?    href:重定向到的原始的URL(例如,href = "http:/www.kenyir.org")。
?    action:重定向到的表单处理器的名称(也就是说,动作映射)。这必须以“/”开头,因为它相对于默认模块(例如action = "/Logoff")(关于模块参见第17章)。
?    page:重定向到的当前Web应用程序中的Web页面的路径。这个路径相对于Web应用程序的基础文件夹。路径必须以“/”开头(例如,page = "/index.jsp")。
redirect也允许在重定向URL上指定参数:
?    anchor:让你指定一个锚的名称。锚是标准的HTML,可为较长的网页标识段落,以便于导航。
?    name/property/scope:这些属性用来在请求或者会话上定位一个Map实例。该映射的关键字是参数的名称并且值是对应的值。在值是一个数组的情况下,多个参数会被写出到URL中,其中每个都具有相同名称但是具有不同的值。如果创建了超过一个URL参数,可以使用这三个变量的组合。
?    paramname、paramproperty、paramscope和paramid:第一个用来在当前请求或者会话上定位一个对象。如果这个对象不是一个数组,它的toString()方法将被调用并且其返回值是一个参数值。如果该对象是一个数组,那么正在创建的是多个同名的但是不同值的参数。参数的名称是由paramId给出的。
剩下的属性是useLocalEncoding和transaction。
?    useLocalEncoding:如果被设置为true,告诉Struts对当前HttpServletResponse使用什么字符编码方案。
?    transaction属性则需要一些详细描述。

抱歉!评论已关闭.