运用struts2标签进行复杂数据的传值

来源:互联网 发布:sai绘图软件官方下载 编辑:程序博客网 时间:2024/06/06 07:44

最近几年做管理比较多,对技术,特别是新技术已经不甚了解。这阵子感觉自己水平低了,打算自己提高下,于是就开始学习。

这次运用的框架是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接口的类。当然,应该也能支持数组。

 

以上是一点心得,水平有限,给自己留个笔记,也给需要的朋友留点资料。

 

原创粉丝点击