logic:iterate
logic:iterate标签用来迭代集合,您可以使用如下方式来为这个
标签指定其要叠代的集合:
使用一个运行时表达式,这个表达式的值是一个集合。
用name属性引用一个JSP Bean,这个JSP Bean本身就是一个集合。
用name属性引用一个JSP Bean,这个JSP Bean的一个属性是一个集合,
这时可以联合使用property来指定这个集合。
上面所提到的集合可以是:
对象类型或原子类型的数组(Array)。
java.util.Collection的实现,包括ArrayList,Vector。
java.util.Enumeration的实现。
java.util.Iterator的实现。
java.util.Map的实现,包括HashMap,Hashtable和TreeMap。
如果您叠代的集合中含有null的值,这时需要采取一定的措施,
因为这时logic:iterate不会在page作用域中创建对象。一般是
使用<logic:present>标签或<logic:notpresent>标签来判断一下。</logic:notpresent></logic:present>
下面是logic:iterate叠代ArrayList的示例的对象引用关系和部分代码:
在这里只是简单的加入了三个Person对象,在实际的应用中这些数据应该
取自数据库。具体的代码如下:
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
ListForm listForm = (ListForm) form;
List <person></person> persons = new ArrayList <person></person> ();
Person person1 = new Person();
person1.setId("00001");
person1.setName("赵辰");
Person person2 = new Person();
person2.setId("00002");
person2.setName("李为芳");
Person person3 = new Person();
person3.setId("00003");
person3.setName("王微");
persons.add(person1);
persons.add(person2);
persons.add(person3);
listForm.setPersons(persons);
return mapping.findForward("success");
}
标签输出的结果为:
00001-->赵辰 00002-->李为芳 00003-->王微
logic:present
如果指定的值出现该标签就会创建其标签体内的内容。该标签用于以下情况:
检查具有指定名称的cookie是否出现。
检查具有指定名称的header是否出现。
检查具有指定名称的JSP Bean是否出现 或 检查具有指定名称的JSP Bean中
的property属性是否出现。
检查request中指定名称的参数是否出现。
检查当前的认证用户是否与指定的安全角色相关联。
检查当前认证的主体是否具有指定的名字。
下面的代码示例了logic:present标签检查具有指定
名称User-Agent的header是否出现<logic:present header="User-Agent">
</logic:present>
logic:notPresent标签的应用正好和logic:present标签相反。
logic:messagesPresent
logic:messagesPresent标签用于以下情况:
在request作用域中存在一个ActionMessages对象,
标签的property属性和ActionMessages中的property对应。
在request作用域中存在一个ActionErrors对象,
标签的property属性和ActionErrors中的property对应。
存在一个String对象,将其转换(构造)成ActionMessage然后在添
加到ActionMessages中。 存在一个String Array对象,将数组中的
每一个String转换成一个ActionMessage,在将其添加到ActionMessages中。
标签的message属性值为true时将以Globals.MESSAGE_KEY为key
在request作用域中查找Message,其它情况下,将name的值作为key查找,
如果name 没有出现,默认值为Globals.ERROR_KEY。
下面的代码示例了logic:messagesPresent标签的典型用<logic:messagespresent>
</logic:messagespresent>
标签logic:messagesNotPresent的应用正好
和logic:messagesPresent的应用相反。
logic:empty
logic:empty标签是用来判断是否为空的。如果为空,
该标签体中嵌入的内容就会被处理。该标签用于以下情况:
当Java对象为null时
当String对象为""时
当java.util.Collection对象中的isEmpty()返回true时
当java.util.Map对象中的isEmpty()返回true时
下面的代码示例了logic:empty标签判断集合persons是否为空:
<logic:empty name="listForm" property="persons">
</logic:empty>
logic:notEmpty标签的应用正好和logic:empty标签相反。
logic:match
logic:match标签用来处理子串匹配问题。
如果指定的值匹配该标签就会创建其标签体内的内容。该标签用于以下情况:
检查具有指定名称的cookie是否与该标签的value匹配。
检查具有指定名称的header是否与该标签的value匹配。
检查具有指定名称的JSP Bean是否与该标签的value匹配
或 检查具有指定名称的JSP Bean中的property属性值是否与该标签的value匹配。
检查request中指定名称的参数值是否与该标签的value匹配。
下面的代码示例了logic:match标签的典型用法:<logic:present header="User-Agent">
<logic:match header="User-Agent" value="MSIE 6.0">
MS IE 6.0
</logic:match></logic:present>
logic:notMatch标签的应用正好和logic:match标签相反。
logic:equal
这里要介绍的不只是logic:equal(=)标签,而是要介绍一类标签,这类标签完成比较运算,
包括:
logic:equal(=)
logic:notEqual(!=)
logic:greaterEqual(>=)
logic:lessEqual(<=)
logic:graterThan(>)
logic:lessThan(<)
该类标签的用法类似,我们只介绍logic:equal标签,其它的留给您自己去完成。
logic:equal是用来判断是否相等的。如果相等,该标签体中嵌入的内容就会被处理。
该标签用于以下情况:
比较由该标签的cookie属性指定的cookie的值是否与该标签的value属性值相等。
比较由该标签的header属性指定的header的值是否与该标签的value属性值相等。
比较由该标签的name属性指定的JSP Bean是否与该标签的value属性值
相等(property属性不出现)或比较由该标签的name属性指定的JSP Bean中
的property属性值是否与该标签的value属性值相等。
比较由该标签的parameter属性指定的参数值(request中)是否与
该标签的value属性值相等。
logic:forward
我觉得将forward和redirect这两个动作放到一起对比着介绍更加有利于理解,
基于此原因也就将logic:forward和logic:redirect这两个标签也拿到这里一起介绍了。
让我们看看这两个动作的区别:
forward是在servlet内部执行,浏览器完全不会感知到这个动作,
原始的url也不会改变,浏览器重新装载的话也只是对原始的请求进行简单的重复。
redirect则分成两个步骤:第一步是web应用程序告诉浏览器第二个url,
然后浏览器向第二个url发送请求。
redirect比forward慢,因为浏览器要做二次请求。还有就是要注意,在
第一次的请求作用域(request作用域)内的bean对于第二次请求是不可见的。
理解了上面描述的区别也就知道了什么时候该选用logic:forward标签
什么时候该选用logic:redirect标签了。
logic:forward标签完成PageContext.forward()
或HttpServletResponse.sendRedirect(),
如何选择由控制器决定。logic:redirect标签完成HttpServletResponse.sendRedirect()。
在使用logic:redirect标签时我们可以向使用html:link一样构造baseurl
和query参数。如果您感兴趣可以参考html:link标签。