逻辑比较运算
logic:equal/logic:notEqual
logic:equal 变量等于常量时结果为 true ,否则为 false 。
logic:notEqual 变量不等于常量时结果为 true
logic:greaterEqual/logic:greaterThan
logic:greaterEqual 变量大于或等于常量时结果为 true ,否则为 false 。
logic:greaterThan 变量大于常量时结果为 true ,否则为 false 。
logic:lessEqual/ logic:lessThan
logic:lessEqual 变量小于或等于常量时结果为 true ,否则为 false 。
logic:lessThan 变量小于常量时结果为 true ,否则为 false 。
用法
所有比较运算标记都比较一个变量和一个常量的大小。如果结果为 true ,则执行标签主体的内容,否则不执行任何动作。
常量由 value 属性指定。变量可以有五种指定方法
1. 使用 cookie 属性指定变量为某个 cookie 的关键字的名称。
2. 使用 header 属性指定变量为 HTTP 头的某个关键字的名称。
3. 使用 parameter 属性指定变量为某个请求参数
4. 使用 name 属性指定变量为任何范围的某个已存在的变量。若指定了 scope 属性则变量限定在由 scope 指定的某个范围里
5. 使用 name 和 property 属性指定变量为任何范围的某个已存在的 JavaBean 的某个字段。若指定了 scope 属性则变量限定在由 scope 指定的某个范围里
注意
1. 如果变量不存在则比较结果为 false ,而不是抛出异常。
2. 如果两个字符串都可以转换成数字,就比较数字的大小,否则进行字符串的比较如:
<%
request.setAttribute( "str" , "100" );
%>
< logic:greaterThan name = "str" value = "90" > greater </ logic:greaterThan >
结果为 true 。又如:
<%
request.setAttribute( "str" , "100x" );
%>
< logic:greaterThan name = "str" value = "90x" > greater </ logic:greaterThan >
结果为 false 。
字符串匹配
logic:match / logic:notMatch
logic:match 判断变量是否包含指定常量,如果是则执行标记主体内容,否则不做任何动作。 logic:notMatch 与 logic:match 相反。
用法
该标记本质上提供了 String 对象的 indexOf() 、 startsWith() 和 endsWith() 方法。所有匹配区分大小写。
location 属性:如果没有指定则执行 indexOf() 方法。如果指定为 start 则标记执行 startsWith 方法;如果指定为 end 则执行 endsWith() 方法。
常量由 value 属性指定。变量可以有五种指定方法
6. 使用 cookie 属性指定变量为某个 cookie 的关键字的名称。
7. 使用 header 属性指定变量为 HTTP 头的某个关键字的名称。
8. 使用 parameter 属性指定变量为某个请求参数
9. 使用 name 属性指定变量为任何范围的某个已存在的变量。若指定了 scope 属性则变量限定在由 scope 指定的某个范围里
使用 name 和 property 属性指定变量为任何范围的某个已存在的 JavaBean 的某个字段。若指定了 scope 属性则变量限定在由 scope 指定的某个范围里
判断指定内容是否存在
logic:empty/logic:notEmpty
判断指定变量是否为 null 或空字符串 ”” 。
如果指定的变量为空或不存在(即即变量没有定义或其值为 null ), logic:empty 返回 true ,否则 logic:empty 返回 false 。 logic:notEmpty 相反。
变量可以有 2 种指定方法
1. 使用 name 属性指定变量为任何范围的某个已存在的变量。若指定了 scope 属性则变量限定在由 scope 指定的某个范围里
2. 使用 name 和 property 属性指定变量为任何范围的某个已存在的 JavaBean 的某个字段。若指定了 scope 属性则变量限定在由 scope 指定的某个范围里
logic:present /logic:notPresent
判断角色、用户、 cookie 、 header 、 parameter 、 JavaBean 或某个范围的变量是否存在
如果指定变量不存在(即变量没有定义或其值为 null ), logic:present 范围 false ,如果存在(即使其值是空字符串),则返回 true 。 logic:notPresent 与 logic:present 相反
此标签除了进行标准的存在性检查外还提供了与 J2EE 安全系统交互的机制,以确定授权的用户是否具有指定的用户名
变量的指定有以下七种方法
1. 指定 cookie 属性
2. 指定 header 属性
3. 指定 parameter 属性
4. 指定 name 属性
5. 指定 name 和 property 属性
6. 指定 user 属性 判断当前通过授权的用户是否具有指定的用户名。可以设置多个用户名,用逗号分开如: user=”user1,user2” 。
7. 指定 role 属性判断当前通过授权的用户是否具有指定的安全角色。可以设置多个安全叫色,用逗号分开如: user=”role1,role2” 。
logic:present 和 empty 的区别
变量为空是指变量的值为空字符串如 String numberEmpty=”” 。
变量为 null 值变量的值未指定如 String numbserNull = null 。
变量未定义是指变量没有声明。
变量是否存在是指变量是否为 null 或变量有没有定义。
logic:present 主要有两个区别
1. logic:notEmpty 当变量是存在且变量不为空时结果为 true , logic:present 当变量存在时为 true
2. logic:empty 只能比较某个范围的变量, logic: 除了检查某个范围的变量外,还能检查 cookie,header,parameter 的某个值是否存在,还能进行安全性的检查。
logic:messagesPresent/ logic:messagesNotPresent
判断 request 范围内是否存在指定的 ActionMessages (或取子类 ActionErrors )对象,以及在此对象中是否存在指定的信息。
logic:messagesPresent 判断指定的信息是否存在。 logic:messagesNotPresent 与 logic:messagesNotPresent 相反。
name 属性:指定 request 范围内检索 ActionMessages 对象的属性 key ,默认为 Globals.ERROR_KEY 。
message 属性:如果为 true 则设定 request 范围内检索 ActionMessages 对象的属性 key 为 Globals.MESSAGE_KEY 。此时 name 属性无效。如果为 false ,则由 name 指定 key 。
property 属性:如果指定则检查指定的 message 是否存在,否则检查 ActiionMessages 是否存在。
举例如下:
meessagesPresent 用法 < br >
<%
ActionErrors errors = new ActionErrors();
errors.add( "errmsg" , new ActionMessage( " 信息内容 " ));
request.setAttribute(Globals.ERROR_KEY,errors);
%>
< logic:messagesPresent > 存在 message </ logic:messagesPresent >
logic:messagesPresent 标记的执行结果为 true 。
循环遍历
logic:iterate
遍历集合中的元素。
要遍历的集合通过以下三种方式指定:
1. collection 属性指定一个运行时的表达式
2. name 属性指定
3. name 和 property 属性指定
集合必须是以下集中类型:
1. 基本类型或引用类型的数组
2. java.util.Collection 类型,包括 ArrayList 和 Vector
3. Enumeration 类型
4. Iterator 类型
Map 类型,包括 HashMap, Hashtable, 和 TreeMap. 当遍历一个 Map 类型对象时,实际遍历的对象是 Map.Entry ,他包含两个属性
key – 关键字
value – 关键字对应的值
所以当你遍历 Map 时需要同时使用 name 和 property 属性指定 Map 和某个属性( property=”key” 或 property=”value” )
id 属性保存遍历出的每个元素。
indexId 保存此元素在集合中的位置。
length 属性指定要遍历元素的最大个数。不指定则便利集合中的所有元素。
offset 属性指定遍历的开始位置。默认从 0 开始。
scope 属性指定集合所在范围。没有指定则依次从 page,request,session,application 范围搜索集合。
举例如下:
<%
HashMap course = new HashMap();
course.put( "math" , new Integer(120));
course.put( "english" , new Integer(122));
course.put( "chinese" , new Integer(100));
course.put( "physics" , new Integer(111));
course.put( "chymistry" , new Integer(129));
course.put( "biology" , new Integer(111));
course.put( "politics" , new Integer(98));
course.put( "geography" , new Integer(132));
course.put( "history" , new Integer(98));
pageContext.setAttribute( "course" ,course);
%>
< bean:size id = "course_length" name = "course" />
< logic:present name = "course" >
< logic:iterate id = "c" name = "course" length = "<%= course_length.toString() %> " offset = "3" indexId = "course_id" >
< bean:write name = "c" property = "key" /> : < bean:write name = "c" property = "value" /> - < bean:write name = "course_id" />< br >
</ logic:iterate >
</ logic:present >
结果显示如下:
english:122 - 3
physics:111 - 4
history:98 - 5
geography:132 - 6
math:120 - 7
politics:98 – 8
转发或重定向
logic:forward
相当于在 struts 内部执行 PageContext.forward() or HttpServletResponse.sendRedirect() 。
该标记根据 name 属性在 Struts 配置文件中查找一个 forward ,再根据该 forward 的定义决定转至特定的 URL 。如果 forward 的 redirect 属性设置为 ”true” 则标记将重定向,否则直接转至。
redirect 向浏览器发送一个响应,提示浏览器加载另一个页面。 forward 直接转至要加载的页面
forward 只能转到相同服务器上的 URL , redirect 可以转到任何的 URL 。
logic:redirect
相当于在 struts 内部执行 HttpServletResponse.sendRedirect() 。浏览器不显示本页面的 URL 而是重定向后的 URL 。
有以下三种方法指定 URL :
l forward 属性
l page 属性
l href 属性
(以上三种方法的用法跟 link:rewrite 方法相同)。
l action 属性。指向一个 action 。
指定参数的方法有以下两种:
指定一个参数。
参数名由 paramId 指定,参数值由一个 JSP 变量指定,这个变量的值就作为 paramId 对应的参数的值。指定 JSP 变量有两种方法:
一种是由 paramName 属性指定。如:
<%
pageContext.setAttribute( "name" , "rolia" );
%>
< logic:redirect forward = "showparams"
paramId = "name"
paramName = "name"
scope = "page" />
一种是由 paramName 属性指定一个 JavaBean , paramProperty 属性指定这个 bean 的某个属性,这个属性的值作为参数值。
指定多个参数。
多个参数保存在一个 Map 对象中,它里面的每个 map.entry 对象作为一个参数名 / 值对传递。
指定 Map 对象有两种方法:
一种是由 name 属性指定。如:
<%
HashMap course = new HashMap();
course.put( "math" , new Integer(120));
course.put( "english" , new Integer(122));
course.put( "chinese" , new Integer(100));
course.put( "physics" , new Integer(111));
course.put( "chymistry" , new Integer(129));
course.put( "biology" , new Integer(111));
course.put( "politics" , new Integer(98));
course.put( "geography" , new Integer(132));
course.put( "history" , new Integer(98));
pageContext.setAttribute( "course" ,course);
%>
< logic:redirect forward = "showparams"
name = "course" />
一种是由 name 属性指定一个 JavaBean , property 属性指定 JavaBean 的某个属性,这个属性为一个 Map 对象。
小结
l 逻辑标签判断条件是否为 true ,是则执行标签主体的内容。
l 多数标签可以设置 name 属性,和 property 属性,用法一样。 scope 属性指定范围。如果没有指定,依次在 page,request,session 和 application 范围里查找。
l nest 标记库