在Struts应用中,Struts Logic标签库主要用于:
1 根据特定的逻辑条件来判断网页内容
2 判断指定的内容是否存在
3 循环遍历集合元素
4 进行字符串的匹配
5 进行请求转发和重定向
与比较运算相关的Logic标签详解
<logic:equal>
比较变量是否等于指定的常量
<logic:notEqual>
比较常量是否不等于指定的常量
<Logic:lessThan>
比较常量是否小于指定的常量
<logic:lessEqual>
比较常量是否小于或等于指定的常量
<logic:geraterThan>
比较常量是否大于指定的常量
<logic:geraterEqual>
比较常量是否大于或等于指定的常量
与比较运算相关的Logic标签的常用属性:
Value 指定一个用于供比较的常量值
Cookie 指定一个cookie值与给定的常量值进行比较
Header 指定一个header属性值与给定的常量值进行比较
Name 指定一个变量或JavaBean对象与给定的常量值进行比较
Property 如果name属性指定的是JavaBean对象,则由property属性指定一个 属性与给定的常量值进行比较
Parameter 指定一个请求参数与给定的常量值进行比较
Scope 指定name属性指定对象的作用范围
与字符串匹配相关的Logic的标签详解:
Struts Logic 标签库中与字符串匹配相关的标签有:
<logic:match>
标签判断变量中是否包含指定的常量字符串
<logic:notMatch>
标签判断变量中是否不包含指定的常量字符串
与字符串匹配相关的Logic标签的属性:
Value 指定一个用于供比较的常量字符串
Location 指定子字符串的匹配位置,有两个可选值:
Start:表示子串位于母串的起始处
End:表示子串位于母串的结尾处
Cookie 指定一个cookie值与给定的常量字符串进行比较
Header 指定一个header值与给定的常量字符串进行比较
Name 指定一个变量或JavaBean对象与给定的常量字符串进行比较
Property 如果name属性指定的是JavaBean对象,则由property属性指定一个 属性与给定的常量字符串进行比较
Parameter 指定一个请求参数值与给定的常量字符串进行比较
Scope 指定name属性指定对象的作用范围
<logic:empty>与<logic:notEmpty>
这对标签主要用于判断指定的变量是否为null或空字符串
<logic:empty>
判断指定变量是否为null或空字符串
<logic:notEmpty>
判断指定的变量是否不是null或非空字符串
<logic:empty>与<logic:notEmpty>
Name 指定一个变量或JavaBean对象判断是否存在
Property 如果name属性指定的是JavaBean对象,则由property属性指定一个 属性判断其属性是否存在
Scope 指定name属性指定对象的作用范围
<logic:present>与<logic:notPresent>
这对标签主要用于判断指定对象是否存在
<logic:present> 判断指定对象是否存在
<logic:notPresent> 判断指定对象是否不存在
<logic:present>与<logic:notPresent>常用属性:
Value 判断指定的cookie是否存在
Name 判断指定的变量后JavaBean对象是否存在
Header 判断指定的header是否存在
Property 如果name属性指定的是JavaBean对象,则判断由property属性指定 一个属性是否存在
Parameter 判断指定的请求参数是否存在
Scope 指定name属性指定对象的作用范围
Role 判断当前通过权限验证的用户是否具有指定的安全角色
User 判断当前通过权限验证的用户是否具有指定的用户名
<logic:messagePresent>与<logic:messageNotPresent>
这对标签主要用于判断指定的消息对象或消息是否存在与request范围内
<logic:messagePresent>
判断指定消息是否存在
<logic:messageNotPresent>
判断指定消息是否不存在
<logic:messagePresent>与<logic:messageNotPresent>常用属性:
Name 指定在request范围内检索ActionMessage或ActionErrors对象的属性 key
Property 指定从ActionMessages或ActionErrors对象中检索某条消息key
Message 如果设置为true,则name属性指定的值无效,如果为false,则根据 name的属性指定的属性key
<logic:iterate>标签
<logic:iterate>能够在一个循环中遍历数组、Collection、Enumeration、Iterator或Map中的所有元素
<logic:iterate>常用属性:
Id 指定一个用于引用集合中当前元素的变量名
Collection 指定一个用于得到集合对象的运行时表达式
Name 指定一个需要遍历的集合对象
Property 如果name属性指定的是JavaBean对象,则有Property属性指定其中 一个属性作为需要遍历的集合对象
Scope 指定name属性指定对象的作用范围
Type 指定集合中每个元素的类型
indexId 指定一个用于存放当前元素序号的变量名
Length 指定需要遍历的元素数目,默认值为集合的所有元素
Offset 指定开始遍历的起始位置,默认为0
<logic:forward>标签
用于请求转发,它的name属性与Struts配置文件的<global-forwards>的子元素<forward>元素匹配
<logic:redirect>标签
Logic 标签库
此标签库可以分为三种类型:条件、循环、转发/重定向。
一.) 条件类型
1. logic:empty和logic:notEmpty
logic:empty标签判断脚本变量是否为null,是否是一个空的字符串(长度为0),是否是一个空的collection或map(调用isEmpty()方法来判断)。logic:notEmpty标签类似。
<logic:empty name="myBean"> |
2. 上段代码表示当一个名为myBean的bean在所有的scope中都不存在时,输出The bean is missing;存在的话输出The bean is not missing。
此标签有三个属性:name、property和scope。
3. logic:equal, logic:notEqual, logic:lessThan, logic:greaterThan,logic:lessEqual, and logic:greaterEqual
这堆logic:*equal*标签从名字上就能知道意思,它们使用起来有些笨拙。
有如下属性:name、property、scope、value、cookie、header、parameter。
<logic:equal name="bean" property="doubleProperty" value="<%= doub1 %>"> |
4.
5. logic:present和logic:notPresent
检查header、request parameter、cookie、JavaBean或JavaBean propertie是否存在且不等于null。另外还可以检查当前用户的身份,使用属性user和role。
其它的属性有:name、property、scope、cookie、header、parameter。
<logic:notPresent name="myBean" property="prop" scope="page"> |
6. 上段代码检查在page作用域内名为myBean的bean是否有一个prop属性。
7. logic:match和logic:notMatch
比较两字符串是否相等,可以比较字符串的开始的、结尾的或其中的某个部分。
location属性:指定从某个位置开始进行比较。
其它的属性有:name、property、scope、value、cookie、header、parameter。
下面的例子是检查浏览器类型:
<logic:match header="User-Agent" value="Mozilla"> |
8.
检查bean属性是否匹配"hello world"字符串:
<logic:match name="bean" property="stringProperty" value="hello world"> |
9.
检查名为"name"的请求参数是否是"xyz"的子字符串,但是子字符串必须从"xyz"的索引位置1开始(也就是说子字符串必须是"y"或"yz"):
<logic:match parameter="name" value="xyz" location="1"> |
二.) 循环类型
logic:iterate
重复嵌套在此标签体内的指定集合的元素,集合必须为如下类型:array 、Collection(包括ArrayList和Vector)、Enumeration、Iterator、Map(包括HashMap、Hashtable和TreeMap)。例如:
<logic:iterate id="employee" name="department" property="employees" scope= "request"> |
上面的代码迭代了一个employee的集合,是department属性employees的一个集合,作用域为request。
为了输出第五个到第十个employee,需要使用length和offset属性:
<logic:iterate id="employee" name="department" property="employees" scope= "request" length="10" offset="5"> |
你可以定义一个变量保存当前的索引值:
<ol> |
三.) 转发/重定向类型
logic:forward和logic:redirect
logic:forward标签和jsp:forward标签和相似,但它可以使用global forward中的一个ActionForward:
<logic:forward name="login" /> |
logic:redirect标签和上面的标签类似,但它默认调用的方法是response.sendRedirect(),取代了上面的requestDispatcher.forward()。最大的不同是它支持所有html:link标签的属性,所以你能够指定request参数:
<logic:redirect name="login" paramId="employeeId" paramName="employee" property="id" /> |
提示:1.) 在MVC框架下,不推荐使用这两个标签,你应该是从controller中选择下一个view,而不是从view中选择。
2.) 在Jsp页面中不要过多的使用logic标签。
1.<logic:equal> and so on比较标签
以下eg都是由一个servlet转发过来的
MyBean mb = new MyBean();
mb.setName("yc");
mb.setCount(200);
request.setAttribute("mybean",mb);
request.getRequestDispatcher("jsp1.jsp").forward(request,response);
eg1:<bean:define id="myint" value="100"/> //当前页面定义一个字符串
<logic:equal name="myint" value="100">
myint=100
</logic:equal>
eg2:<bean:define id="bean3" name="mybean" scope="request"/> //从request上获取bean
<logic:lessThan name="bean3" property="count" value="200.a"> //比较bean的count属性和200.a
bean3 LessThan 200.a
</logic:lessThan>
注意:如果两个字符串都能够成功转为数字,则是比较数字的大小,否则像eg2就是比较字符串的大小
eg3:<bean:define id="bean1" name="mybean" property="name" scope="request"/>
<logic:equal name="bean1" value="yc">
name1=yc
</logic:equal>
eg4:<bean:define id="bean2" name="mybean" scope="request"/>
<logic:equal name="bean2" property="name" value="yc">
name2=yc
</logic:equal>
注意:eg3和eg4都是比较bean属性,只是写法不同
eg5:比较请求参数
<logic:equal parameter="id" value="150">
<bean:parameter id="myid" name="id"/>
parameter:<bean:write name="myid"/>=150
</logic:equal>
2.<logic:match>
查看指定字符串是否被包含
<logic:match name="" value="被包含字符串" location="start/end也可以不写,就是任意位置"/>
eg:<bean:define id="bean4" name="mybean" property="name" scope="request"/>
<logic:match name="bean4" value="y" location="start">
yc is start with bean4
</logic:match>
3.< logic:iterator>
a.遍历Vector等集合,value形式的
<logic:iterator id="每个集合的元素" name="集合在当前页面的绑定名" indexId="序号"
offset="起始位置,0开始" length="遍历长度"/>
前提: Vector v = new Vector();
v.add("dog");
v.add("girl");
v.add("bird");
v.add("cat");
request.setAttribute("myvector",v);
request.getRequestDispatcher("jsp1.jsp").forward(request,response);
eg1:<bean:define id="vector1" name="myvector" scope="request"/>
<logic:iterate id="element" name="vector1">
<bean:write name="element"/>
<br />
</logic:iterate>
eg2:<bean:define id="vector2" name="myvector" scope="request"/>
<logic:iterate id="element" name="vector2" indexId="index" offset="1" length="3">
<bean:write name="index"/>.<bean:write name="element"/><br />
</logic:iterate>
b.遍历Map等,key/value形式
只是输出的时候有所不同
<bean:write name="" property="key"/>输出元素的key部分
<bean:write name="" property="value"/>输出元素的value部分
前提: HashMap hm = new HashMap();
hm.put("yc","yuechen");
hm.put("tjs","tianjinsong");
hm.put("xc","xiaocen");
hm.put("xk","xukai");
request.setAttribute("mymap",hm);
eg:<bean:define id="map1" name="mymap" scope="request"/>
<logic:iterate id="element" name="map1" indexId="index">
<bean:write name="index"/>.<bean:write name="element" property="key"/>:<bean:write name="element" property="value"/><br />
</logic:iterate>
c.遍历map中的集合
双层iterator,内层iterator需要加入property="value"
前提: HashMap hm2 = new HashMap();
String[]asia = {"china","japan","korea"};
hm2.put("asia",asia);
String[]erop = {"greman","rasa","england"};
hm2.put("erop",erop);
String[]us = {"usa","canada"};
hm2.put("us",us);
request.setAttribute("country",hm2);
eg:<bean:define id="myc" name="country" scope="request"/>
<logic:iterate id="element" name="country" indexId="index">
<bean:write name="index"/>.<bean:write name="element" property="key"/><br />
<logic:iterate id="inelement" name="element" indexId="inindex" property="value">
-----<bean:write name="inindex"/>.<bean:write name="inelement"/><br />
</logic:iterate>
</logic:iterate>