03

首先创建代表产品的类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 extends ArrayList {
private static final long serialVersionUID = 1L ;

private Class t = null ;

public AutoInitArrayList(Class t) {
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的配置,内容如下:



< 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 name ="normalProductsForm"
type =”cn.org.jock.struts.form.NormalProductsForm” />

< 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 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" />

< message-resources parameter ="tipsAndTricks.ApplicationResources" />



然后,创建表单类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

< body >
< html:form action ="/batchWrappingNormal" method ="post" >
< table border ="0" >
< tr style ="background-color:powderblue; font-weight:bold;" >
< td > Product Name
< td > Price
< td > Date of production

< c:forEach begin ="0" end ="2" var ="i" >
< tr >
< td >< input name ="products[${i}].name" />
< td >< input name ="products[${i}].price" />
< td >< input name ="products[${i}].dateOfProduction" />


< tr >
< td colspan ="3" >< html:submit />







/addProducts2.jsp主要作用组装<input>的元素名称,Struts 1.x对名称格式类似“xxx[9].xx”的请求,会进行封装。发布运行应用程序,在浏览器的地址栏中输入:http://localhost:8080/Struts1_Batch/addProducts2.jsp。


Tags: , ,

作者:Jock

One Response to “Struts 中批量封装对象”

  1. Jock Says:

    关于这个原先也用到过,类似${account.name}
    不过不知道还可以用来设置name的值,然后就是这个list了,确实可以简化不少自己组装的过程。

Leave a Reply

You must be logged in to post a comment.

Switch to our mobile site