论坛首页 Java企业应用论坛

struts使用list提交多行表单(提供完整示例)

浏览 10720 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-09  
    在struts框架中常常会遇到多行表单的情况, 如何有效的利用struts框架提供的自动收集机制来处理呢? 这里提供一个示例.

1.示例功能:通过一个【提交】按钮保存多行人员信息,如附件中的图片所示。

2.核心类代码:

  TestForm.java
public class TestForm extends ActionForm{

	private List voList = null;
	public List getVoList() {
		return voList;
	}
	public void setVoList(List voList) {
		this.voList=voList;
	}

}

PreAction.java:准备初始数据
public class PreAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		TestForm aform = (TestForm)form;
		TestVo vo1=new TestVo("1","vo1","11");
		TestVo vo2=new TestVo("2","vo2","22");
		TestVo vo3=new TestVo("3","vo3","33");
		List voList = new ArrayList();
		voList.add(vo1);
		voList.add(vo2);
		voList.add(vo3);
		aform.setVoList(voList);
		return mapping.findForward("jsp1");
		
	}
}

jsp1.jsp:编辑保存的页面
<%@ page language="java" contentType="text/html;charset=UTF-8"pageEncoding="GBK"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

<html>
	<head><title>This is jsp1.</title></head>

	<body>
		<B>Edit</B>
		<html:form action="/saveAction">
			<TABLE>
				<TR>
					<TD>id</TD>
					<TD>name</TD>
					<TD>age</TD>
				</TR>
				<logic:iterate id="vo" name="testForm" property="voList" indexId="index1">
				<TR>
					<TD><input name='voList[<bean:write name="index1"/>].id' value='<bean:write name="vo" property="id"/>'></TD>
					<TD><input name='voList[<bean:write name="index1"/>].name' value='<bean:write name="vo" property="name"/>'></TD>
					<TD><input name='voList[<bean:write name="index1"/>].age' value='<bean:write name="vo" property="age"/>'></TD>
				</TR>
				</logic:iterate>
			</TABLE>
			<input type="submit" value=" 提交 " />
		</html:form>

	</body>
</html>

SaveAction.java:保存多行数据
public class SaveAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		TestForm aform = (TestForm)form;
		List voList=aform.getVoList();
		//TODO:you can save data to database here.
		
		request.setAttribute("voList", voList);
		return mapping.findForward("jsp2");
	}

}

jsp2.jsp:展示保存结果
<%@ page language="java" contentType="text/html;charset=UTF-8"
	pageEncoding="GBK"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

<html>
	<head><title>This is jsp2.</title></head>
	<body>
		<B>View</B>
		<br>
			<TABLE border=1>
				<TR>
					<TD>id</TD>
					<TD>name</TD>
					<TD>age</TD>
				</TR>
				<logic:iterate id="vo" name="voList">
				<TR>
					<TD><bean:write name="vo" property="id"/></TD>
					<TD><bean:write name="vo" property="name"/></TD>
					<TD><bean:write name="vo" property="age"/></TD>
					
				</TR>
				</logic:iterate>
			</TABLE>
	</body>
</html>


3.几点说明:
A.strut填充ActionForm的方法:
如果key是简单的'name',直接form.setName(map.get('name'));
如果key是'person.name', 执行的操作是 form.getPerson().setName(map.get('person.name');
如果key是'voList[0].name', 它可以对应到数据或集合中,如对于数组 form.voList[0].name=map.get('voList[0].name'); 对于集合(List) form.getVoList().get(0).setName(map.get('voList[0].name'))
B.如果同时需要删除、添加行的功能:
实现添加不难但实现删除较难,建议有这样需求的还是不要同时提交多行的较好。
  • testguo.rar (993.6 KB)
  • 描述: MyEclipse工程(所有示例代码)
  • 下载次数: 1315
  • 描述: jsp页面效果
  • 大小: 3.5 KB
   发表时间:2008-03-09  
你删除的界面是作出 和邮箱里删邮件一样的吗
0 请登录后投票
   发表时间:2008-09-23  
我按你的方法同样写了一个却不能运行,初始化出来了,但提交的保存的时候报这个有问题,
name='voList[<bean:write name="index1"/>].id
用你的代码却没问题,不知道是哪边出了问题。
0 请登录后投票
   发表时间:2008-10-29  
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:44)

0 请登录后投票
   发表时间:2008-10-29  
是过10行,或20行添加也不需要改变代码的情况没?
0 请登录后投票
   发表时间:2008-10-29  
这个貌似用DWR很容易解决。
楼主确定没有造轮子?
0 请登录后投票
   发表时间:2008-10-30  
LZ用心了,
0 请登录后投票
   发表时间:2008-10-30  
更实用的代码,解决空值的异常问题
import java.util.ArrayList;
//如果有20行表单输入域但只输入了前三行,后面的输入域会变成空值,重写ArrayList 的get()会避免这一问题
public class AutoArrayList extends ArrayList {
    
    private Class itemClass;
    
    public AutoArrayList(Class itemClass) {
        this.itemClass = itemClass;
    }
    
    public Object get(int index) {
        try<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script> {
            while (index >= size()) {
                add(itemClass.newInstance());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.get(index);
    }
}

public class TestForm extends ActionForm{

	private List voList = new AutoArrayList(FieldItem.class);
	public List getVoList() {
		return voList;
	}
	public void setVoList(List voList) {
		this.voList=voList;
	}

}

<c:forEach begin="0" end="20" var="i">
	<tr>
		 
		<td class="tdEditContent"><input type="text" name="voList.[${i}].id" value="voList${[i]       .id}">
		</td>
	<td class="tdEditContent"><input type="text" name="voList.[${i}].name" value="voList${[i]       .name}">
		</td>
	<td class="tdEditContent"><input type="text" name="voList.[${i}].age" value="voList${[i]       .age}">
		</td>
		 
	</tr>
</c:forEach>

 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics