write>标签的name属性的值和iterate标签的id值一致.如下图三所示.
● name:
指定包含要迭代的集合对象的名称,如果还指定了property属性,将调用对象中该属性定义的一个字段的值获取方法,以返回一个要迭代的集合.也就是说,在没有property属性的时候,name属性指的是一个集合,而在有property属性的时候,name属性指的一般是一个form-bean,当然你也可以用jsp:
userBean标签指定一个bean,而property属性指的是这个form-bean(bean)的一个集合类.
下面是logic:
iterate叠代ArrayList的示例的对象引用关系和部分代码:
图示3.logic:
iterate中对象的引用关系
图中的persons列表是在ListAction中填充的,在这里只是简单的加入了三个Person对象,在实际的应用中这些数据应该取自数据库。
具体的代码如下:
publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){
ListFormlistForm=(ListForm)form;
Listpersons=newArrayList();
Personperson1=newPerson();
person1.setId("00001");
person1.setName("赵辰");
Personperson2=newPerson();
person2.setId("00002");
person2.setName("李为芳");
Personperson3=newPerson();
person3.setId("00003");
person3.setName("王微");
persons.add(person1);
persons.add(person2);
persons.add(person3);
listForm.setPersons(persons);
returnmapping.findForward("success");
}
标签输出的结果为:
00001-->赵辰
00002-->李为芳
00003-->王微
在struts中,读取数据库中的多条数据然后显示到jsp页面上可以用如下的方法去做:
∙1.在Form中定义一个ArrayListimportjava.util.ArrayList;
importjavax.servlet.http.HttpServletRequest;
importorg.apache.struts.action.ActionErrors;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionMapping;
publicclassAlloperationFormextendsActionForm{
privateArrayListlist;
publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){}
publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){}publicArrayListgetList(){returnlist;}publicvoidsetList(ArrayListlist){this.list=list;}}
∙2.在Action中调用一个返回游标的存储过程,得到所有的记录,找把它封装成一个Bean.publicclassAlloperationActionextendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){AlloperationFormoperationForm=(AlloperationForm)form;
Connectionconn=ConnectDataBase.connection();
StringcallFunction="{?
=callalloperation.getalloperation}";
ResultSetrs=null;
ArrayListalist=newArrayList();try{CallableStatementstmt=conn.prepareCall(callFunction);
stmt.registerOutParameter(1,OracleTypes.CURSOR);
stmt.execute();
rs=((OracleCallableStatement)stmt).getCursor
(1);
while(rs.next())
{
StringoperationName=rs.getString
(1);
StringoperationType=rs.getString
(2);
Stringcharge=rs.getString(3);
StringcharegeType=rs.getString(4);
System.out.println("operationName"+operationName);
System.out.println("operationType"+operationType);
System.out.println("charge"+charge);
System.out.println("chargeType"+charegeType);
AllOperationBeanoperationBean=newAllOperationBean
(operationName,operationType,charge,charegeType);
alist.add(operationBean);
}
conn.close();
operationForm.setList(alist);
}catch(SQLExceptione){e.printStackTrace();
}
returnmapping.getInputForward();
}
}
∙定义的bean:
packagecom.penguin.bean;
publicclassAllOperationBean{
privateStringoperationName;
privateStringoperationType;
privateStringchargeType;
privateStringcharge;
publicAllOperationBean(StringoperationName,StringoperationType,Stringcharge,StringchargeType)
{this.operationName=operationName;
this.operationType=operationType;
this.charge=charge;
this.chargeType=chargeType;
}publicStringgetCharge(){
}
publicvoidsetCharge(Stringcharge){
this.charge=charge;
}
publicStringgetChargeType(){
returnchargeType;
}
publicvoidsetChargeType(StringchargeType){
this.chargeType=chargeType;
}
publicStringgetOperationName(){
returnoperationName;
}
publicvoidsetOperationName(StringoperationName){
this.operationName=operationName;
}publicStringgetOperationType(){
returnoperationType;
}publicvoidsetOperationType(StringoperationType){
this.operationType=operationType;
}
}
∙在jsp页面中用标签调用代码如下图:
其中alloperationFormation是在struts配置文件中定义的form-bean的名称.
通过上述步骤就可以在jsp页面中显示出多条记录了..
iterate>是Logic标签库中最复杂的标签,也是用途最广的一个标签,它能够在一个循环中遍历数组、Collection、Enumeration、Iterator或Map中的所有元素。
1.遍历集合
iterate>的name属性指定需要进行遍历的集合对象,它每次从集合中检索出一个元素,然后把它放在page范围内,并以id属性指定的字符串来命名这个元素,例如:
<%
Vectoranimals=newVector();
animals.addElement("Dog");
animals.addElement("Cat");
animals.addElement("Bird");
animals.addElement("Chick");
request.setAttribute("Animals",animals);
%>
iterateid="element"name="Animals">
writename="element"/>
iterate>
以上代码先定义了一个Vector类型的集合变量Animals,它存放在request范围内.接下来iterate>标签在一个循环中遍历Animals集合(这个集合名就是在标签中的name属性的值)中所有元素,每次检索到一个元素,就把它命名为"element"(标签id属性的值),并存放在page范围内.
在iterate>中,还嵌套了一个write>标签,它用于输出每个元素的内容.以上代码的输出内容如下:
Dog
Cat
Bird
Chick
length 属性指定需要遍历的元素的数目,如果没有设置length属性,就遍历集合中的所有元素.
offset 属性指定开始遍历的起始位置,默认值为"0",表示从集合的第一个元素开始遍历.
scope:
可以指定指定作用范围如:
scope=”request”或session.
indexId属性定义一个代表当前遍历元素序号的变量,这个变量被存放在page范围内,可以被标签主体的write>标签访问.例如:
iterate
id="element" //指定输出元素的名与write>中name属性一致
indexId="index" //遍历元素序号的变量,这个变量放在page范围内
name="Animals" //request中的集合名,从中取循环取出元素
offset="1" //从集合的第2条记录开始取数
length="2"> //取出2个元素
writename="index"/>. //输出每个元素的序号,与indexId的属性一致
writename="element"/>
//输出每个元素的内容,与id的属性一致
iterate>
2.遍历Map
iterate>标签还可以遍历HashMap中的元素,例如:
<%
HashMapmonths=newHashMap();
months.put("Jan","January");
months.put("Feb","February");
months.put("Mar","March");
request.setAttribute("month",months);
%>
iterateid="element"indexId="ind"name="months">
writename="ind"/>. //序号
writename="element"property="key"/>:
//键名
writename="element"property="value"/> //键值
iterate>
以上代码先定义一个名为"months"的HashMap,存放在request范围内.接下来在iterate>标签遍历months对象的每一个元素,每一个元素包含一对key/value.在iterate>标签主体中包含三个write>标签,分别输出每个元素的序号、key和value.以上代码的输出内容如下:
0.Mar:
March
1.Feb:
February
2.Jan:
January
如果HashMap中的每个元素的value是集合对象,则可以采用嵌套的iterate>标签遍历集合中的所有对象,例如:
<%
HashMaph=newHashMap();
Stringvegetables[]={"pepper","cucumber"};
Stringfruits[]={"apple","orange","banana","cherry","watermelon"};
Stringflowers[]={"chrysanthemum","rose"};
Stringtrees[]={"willow"};
h.put("Vegetables",vegetables);
h.put("Fruits",fruits);
h.put("Flowers",flowers);
h.put("Trees",trees);
request.setAttribute("catalog",h);
%>
iterate id="element" //与write>中的name属性对应,输出内容
indexId="ind" //与write>中的name属性对应,输出序号
name="catelog"> //指定输出元素的名称
writename="ind"/>. //输出序号
writename="element" //与iterate>中id属性对应
property="key"/> //集合中的键名
iterate
id="elementValue" //与write>中的name属性对应
name="element" //指定输出元素的名称
property="value" //集合中的键值
length="3" //取3个元素
offset="1"> //从第2个位置取
-------writename="elementValue"/>
iterate>
iterate>
以上代码先定义一个名为"catelog"的HashMap,存放在request范围内,它的每个元素的value为字符串数组.
接下来外层的iterate>标签遍历HashMap中的所有元素,内层的iterate>标签访问每个元素的value属性,遍历value属性引用的字符串数组中的所有元素.
3.设置被遍历的变量
可以通过以下方式来设置需要遍历的变量
(1)设置name属性,name属性指定需要遍历的集合或Map,例如:
iterateid="element"name="Animals">
writename="element"/>
iterate>
(2)设置name属性和property属性,name属性指定一个JavaBean,property属性指定JavaBean的一个属性,这个属性为需要遍历的集合或Map,例如:
iterateid="element"indexId="ind"name="catelog">
writename="ind"/>
writename="element"property="key"/>
iterateid="elementValue"name="element"property="value"length="3"offset="1">
--------writename="elementValue"/>
iterate>
iterate>
(3)设置collection属性,collection属性指定一个运行时表达式,表达式的运算结果为需要遍历的集合或Map,例如:
iterateid="header"collection"<%=request.getHeaderNames()%>">
writename="header"/>
iterate>
4.读取JavaBean中的数据
(1)在Jsp页面中加入JavaBean如:
useBeanid="articleClasses"class="com.GetArticleClasses"/>
上面这个JavaBean要求必须存在一个集合数组对象,如Vector,Collection,ArrayList等;在这个JavaBean的构造函数中,取得数据
库中的数据,并将其存入数组对象中。
(2)使用iterate>标签,取出JavaBean中存放的数组对象中的数据
iterate