最近遇见一个问题就是struts2当中批量的数据如何提交到action中去,几经转折最终实现了这样的功能。
下面是action的代码:
public class OrderManageAction extends ActionSupport {
private Order order; //订单的PO
private List<Product> list = new ArrayList<Product>(); //订单物品list对象。数据库order和product是主从表关系。
...
...
...
...
public String execute() throws Exception{
System.out.println(order.getDate()+" "+order.getOrderName());
System.out.println(this.list.size());
// 简单的打印一下list的大小。查看是否把数据封装进去了
}
}
下面的工作就是定义一个转换器,如果是使用的struts2的标签库,那么日期格式的字符串Struts2会自动帮我们转换,但是对于普通的HTML标记,date类型的也是需要写转换器的。在此就不书写了。下面定义一个对list的转换器。
package com.wh.conversion;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.wh.bean.Product;
public class ProductListConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
int trNum = values.length / 7;
List<DetailPO> list = new ArrayList<DetailPO>();
int pointer = 0;
for (int i = 1; i <= trNum; i++) {
Product product = new Product();
product.setName(values[pointer]);
product.setAdress(values[++pointer]);
list.add(product);
pointer = i * 7;
}
return list;
}
//将页面的数据取出来。然后封装成Product对象,然后放置到list中去
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
return null;
}
}
最后是页面JSP书写了。页面很简单,就是你的批量的数据就是Product这个PO对应在页面的input框的name值都必须为list。这样就完成了。
在页面配置name的时候还可以采用一种方式,name="list[0].name",name="list[0].adress" 这样就不需要转换器就可以直接提交数据。但是个人觉得使用第一种方法比较好一点。