先上图,有这样的业务场景,一次表单提交需要批量添加n本书籍的信息
我们来看下如何用Struts2的特性来一步搞定它!
1.创建model类Book
package com.crazycoder2010.struts2.bean;
public class Book {
private String name;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
2.编写业务处理Action类AddBookAction
package com.crazycoder2010.struts2.action;
import java.util.ArrayList;
import java.util.List;
import com.crazycoder2010.struts2.bean.Book;
import com.opensymphony.xwork2.ActionSupport;
public class AddBookAction extends ActionSupport {
private static final long serialVersionUID = 8136233165580827673L;
private List<Book> books = new ArrayList<Book>();
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
@Override
public String execute() throws Exception {
for(Book book : books){
System.out.println(book.getName()+":"+book.getPrice());
}
return SUCCESS;
}
}
3.编写页面add_book.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
</head>
<body>
<s:form action="addBook" method="post">
<s:iterator value="new int[3]" var="book" status="status">
<label>Name:</label>
<s:textfield name="%{'books['+#status.index+'].name'}" theme="simple"></s:textfield>
<label>Price:</label>
<s:textfield name="%{'books['+#status.index+'].price'}" theme="simple"></s:textfield>
<br/>
</s:iterator>
<s:submit value="Add"></s:submit>
</s:form>
</body>
</html>
这个表单中我们模拟创建3个book信息,每个book有name和price属性,这里需要特别注意的是表单元素的命名需要和我们AddBookAction中的List<Book> books 保持一直,名字分别为books[0].name,books[0].price;books[1].name,books[1].price,依次类推
4.在AddBookAction类同目录下建立一个AddBookAction-conversion.properties文件,内容如下
Element_books=com.crazycoder2010.struts2.bean.Book
其中Element_作为前缀books就是这个AddBookAction中用来接受list参数的参数名
5.Run it!
结果展示出我们的action已经可以接受页面提交过来的批量表单参数,这是struts2的一个非常有用的功能