最近几年做管理比较多,对技术,特别是新技术已经不甚了解。这阵子感觉自己水平低了,打算自己提高下,于是就开始学习。
这次运用的框架是struts2,开始传值什么的还算顺利,但是在尝试复杂数据的情况下,页面和java之间传递数据遇到了问题,上网找了很久,总算有人在百度知道提供过简单的说明。
下面是我的成果。
1,设计对象的数据
public class Item {
private String itemName;
private int num;
public Item(){
super();
}
public Item(String itemName, int num){
this.itemName = itemName;
this.num = num;
}
public void setItemName(String itemName){
this.itemName = itemName;
}
public String getItemName(){
return itemName;
}
public void setNum(int num){
this.num = num;
}
public int getNum(){
return num;
}
public String toString(){
return "Item:["
+ "itemName = " + itemName.toString() + ","
+ "num = " + num + "]";
}
}
import java.util.ArrayList;
public class UserInfo {
private String name;
private int age;
private ArrayList<Item> items;
public UserInfo(){
super();
}
public UserInfo(String name, int age, ArrayList<Item> items){
this.name = name;
this.age = age;
this.items = items;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void setItems(ArrayList<Item> items){
this.items = items;
}
public ArrayList<Item> getItems(){
return items;
}
public String toString(){
return "UserInfo:["
+ "name = " + name.toString() + ","
+ "age = " + age + ","
+ "items = " + items.toString() + "]";
}
}
2,Action里赋值:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.infoCmu.login.st.Item;
import com.infoCmu.login.st.SessionMap;
import com.infoCmu.login.st.UserInfo;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MenuAction extends ActionSupport {
public String execute(){
// user1
// item1
Item item1 = new Item("item1", 3);
// item2
Item item2 = new Item("item2", 1);
// items1
ArrayList<Item> items1 = new ArrayList<Item>();
items1.add(item1);
items1.add(item2);
// userinfo1
UserInfo user1=new UserInfo("name1",30,items1);
// user2
// item3
Item item3 = new Item("item3", 2);
Item item4 = new Item("item4", 2);
ArrayList<Item> items2 = new ArrayList<Item>();
items2.add(item3);
items2.add(item4);
// userinfo2
UserInfo user2=new UserInfo("name2",20,items2);
// userlist
userList = new ArrayList<UserInfo>();
userList.add(user1);
userList.add(user2);
return "success";
}
private List<UserInfo> userList;
public void setUserList(List<UserInfo> userList){
this.userList = userList;
}
public List<UserInfo> getUserList(){
return userList;
}
3,Jsp里接收值:
<table>
<s:iterator value="userList" id="userinfo" status="idx">
<tr>
<!-- 输出username,根据持有道具件数修改td所占行数 -->
<td rowspan="<s:property value='#userinfo.items.size'></s:property>"><s:property value="#userinfo.name"></s:property></td>
<td rowspan="<s:property value='#userinfo.items.size'></s:property>"><s:property value="#userinfo.age"></s:property></td>
<!-- 循环输出item信息 -->
<s:iterator value="#userinfo.items" id="item" status="idx1">
<s:if test="#idx1.index==0">
<!-- 如果是该user的第一件道具,则不换行显示 -->
<td><s:property value="#item.itemName"></s:property></td>
<td><s:property value="#item.num"></s:property></td>
</s:if>
<s:else>
<!-- 第一件以外的道具,换行显示 -->
<tr>
<td><s:property value="#item.itemName"></s:property></td>
<td><s:property value="#item.num"></s:property></td>
</tr>
</s:else>
</s:iterator>
</tr>
</s:iterator>
</table>
这样画面显示的结果如下
但是如果希望画面能输入复杂数据的值并传输回来,以上的方式就不行了,需要用下面的方式:
<s:iterator value="userList" id="userinfo" status="idx">
<tr>
<!-- 输出username,这里的rowspan不知道该如何控制,目前用固定值 -->
<td rowspan="<s:property value='#userinfo.items.size'></s:property>"><s:textfield name="%{'userList['+#idx.index+'].name'}"></s:textfield></td>
<td rowspan="<s:property value='#userinfo.items.size'></s:property>"><s:textfield name="%{'userList['+#idx.index+'].age'}"></s:textfield></td>
<!-- 循环输出item信息 -->
<s:iterator value="#userinfo.items" id="item" status="idx1">
<s:if test="#idx1.index==0">
<!-- 如果是该user的第一件道具,则不换行显示 -->
<td><s:textfield name="%{'userList['+#idx.index+'].items['+#idx1.index+'].itemName'}"></s:textfield></td>
<td><s:textfield name="%{'userList['+#idx.index+'].items['+#idx1.index+'].num'}"></s:textfield></td>
</s:if>
<s:else>
<!-- 第一件以外的道具,换行显示 -->
<tr>
<td><s:textfield name="#item.itemName"></s:textfield></td>
<td><s:textfield name="#item.num"></s:textfield></td>
</tr>
</s:else>
</s:iterator>
</tr>
</s:iterator>
画面打开时,可以接收到数据并显示,这时如果submit给Action,里面的userList也可以得到完整的数据。
这里需要注意以下几点:
1,循环变量不要忘记加.index
即上面的:#idex.index
2,对于jsp传值给action,数据结构不支持set
我最开始时,items用的是set接口,一运行就报错,后来改用ArrayList就成功了。我想一定是只能支持List接口的类。当然,应该也能支持数组。
以上是一点心得,水平有限,给自己留个笔记,也给需要的朋友留点资料。