Struts 中批量封装对象
首先创建代表产品的类cn.org.jock.Product,代码如下:
package cn.org.jock;
import java.sql.Date;
public class Product {
private String name;
private double price;
private Date dateOfProduction;
public Date getDateOfProduction() {
return dateOfProduction;
}
public void setDateOfProduction(Date dateOfProduction) {
this .dateOfProduction = dateOfProduction;
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public double getPrice() {
return price;
}
public void setPrice( double price) {
this .price = price;
}
}
本例子中的dateOfProduction属性使用了java.sql.Date,而不是java.util.Date。这是因为Struts 1.x不支持请求参数到java.util.Date的转换,归根到底是由于org.apache.commons.beanutils.ConvertUtilsBean.convert()不支持关于java.util.Date的转换。另外,值得注意的是common-beanutils是通过java.sql.Date.valueOf()方法工作的,所以在页面输入的字符串的格式必须为“yyyy-MM-dd”。
表单(Actoin Form)+ 列表(List)
首先,我们要创建类cn.org.jock.struts.util.AutoInitArrayList,代码如下:
/**
*
*/
package cn.org.jock.struts.util;
import java.util.ArrayList;
/**
* @author Jock
*
*/
public class AutoInitArrayList
private static final long serialVersionUID = 1L ;
private Class
public AutoInitArrayList(Class
this.t = t;
}
@Override
public E get( int index) {
try {
while (index >= size()) {
add(t.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
return super .get(index);
}
}
AutoInitArrayList继承ArrayList并重载get()方法,作用就是在Struts 1.x框架调用这个方法时,如果index超出列表大小,则会实例化新项放到列表中,避免出现(IndexOutOfBoundsException)异常。
接着,让我们看Struts的配置,内容如下:
xml version="1.0" encoding="UTF-8" ?>
< struts-config >
< data-sources />
< form-beans >
< form-bean name ="dynaProductsForm"
type =”org.apache.struts.action.DynaActionForm” >
< form-property name ="products"
type =”cn.org.jock.Product[]” size =”3″ />
form-bean >
< form-bean name ="normalProductsForm"
type =”cn.org.jock.struts.form.NormalProductsForm” />
form-beans >
< global-exceptions />
< global-forwards />
< action-mappings >
< action attribute ="dynaProductsForm" input ="/addProducts.jsp"
name =”dynaProductsForm” path =”/batchWrappingWithArray”
scope =”request” type =”cn.org.jock.struts.action.BatchWrappingWithArrayAction”
validate =”false” >
< forward name ="success" path ="/viewProducts.jsp" />
action >
< action attribute ="normalProductsForm" input ="/addProducts.jsp"
name =”normalProductsForm” path =”/batchWrappingNormal” scope =”request”
type =”cn.org.jock.struts.action.BatchWrappingNormalAction” validate =”false” >
< forward name ="success" path ="/viewProducts.jsp" />
action >
action-mappings >
< message-resources parameter ="tipsAndTricks.ApplicationResources" />
struts-config >
然后,创建表单类cn.org.jock.struts.form.NormalProductsForm,代码如下:
package cn.org.jock.struts.form;
import java.util.List;
import org.apache.struts.action.ActionForm;
public class NormalProductsForm extends ActionForm {
private List products = new AutoInitArrayList < Product > (Product. class );
public List getProducts() {
return products;
}
public void setProducts(List products) {
this .products = products;
}
}
接下来是Action类cn.org.jock.struts.action.BatchWrappingNormalAction,代码如下:
/**/ /*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.org.jock.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class BatchWrappingNormalAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
NormalProductsForm normalProductsForm = (NormalProductsForm) form;
request.setAttribute( ” products ” , normalProductsForm.getProducts());
return mapping.findForward( ” success ” );
}
}
基本上与方法一的Action一样。下面,再看看新的输入文件/addProducts2.jsp,内容如下:
<% @ page language = " java " pageEncoding = " utf-8 " %>
<% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %>
<% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %>
< html >
< head >
< title > Add Products title >
head >
< body >
< html:form action ="/batchWrappingNormal" method ="post" >
< table border ="0" >
< tr style ="background-color:powderblue; font-weight:bold;" >
< td > Product Name td >
< td > Price td >
< td > Date of production td >
tr >
< c:forEach begin ="0" end ="2" var ="i" >
< tr >
< td >< input name ="products[${i}].name" /> td >
< td >< input name ="products[${i}].price" /> td >
< td >< input name ="products[${i}].dateOfProduction" /> td >
tr >
c:forEach >
< tr >
< td colspan ="3" >< html:submit /> td >
tr >
table >
html:form >
body >
html >
/addProducts2.jsp主要作用组装<input>的元素名称,Struts 1.x对名称格式类似“xxx[9].xx”的请求,会进行封装。发布运行应用程序,在浏览器的地址栏中输入:http://localhost:8080/Struts1_Batch/addProducts2.jsp。
Tags: Struts, 技巧, 示例
One Response to “Struts 中批量封装对象”
Leave a Reply
You must be logged in to post a comment.
六月 3rd, 2007 at 15:47
关于这个原先也用到过,类似${account.name}
不过不知道还可以用来设置name的值,然后就是这个list了,确实可以简化不少自己组装的过程。