一: struts-config.xml 配置
<struts-config> <form-beans> <form-bean name="trafficForm" type="com.ccit.safetm.controller.traffic.TrafficForm"></form-bean> </form-beans> <action-mappings> <action path="/traffic/addTraPolicy" type="com.ccit.safetm.controller.traffic.AddTraPolicyAction" name="trafficForm" scope="request"> <forward name="success" path="/jsp/success.jsp"></forward> <forward name="error" path="/jsp/error.jsp"></forward> </action> </action-mappings> </struts-config> 二: 输入页面 add_traffic_policy.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" isELIgnored="false"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%> <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <base href="<%=basePath%>" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>添加流量监控策略</title> <link href="<%=request.getContextPath()%>/css/css_blue.css" rel="stylesheet" type="text/css" id="cssStyle" /> <script type="text/javascript" src="<%=request.getContextPath()%>/js/judge.js"></script> <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-1.2.6.js"></script> <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.cookie.js"></script> <script type="text/javascript"> $(document).ready(function() { $('#btnAdd').click(function() { var num = $('.clonedInput').length; // how many "duplicatable" input fields we currently have var newNum = new Number(num + 1); // the numeric ID of the new input field being added // create the new element via clone(), and manipulate it's ID using newNum value var newElem = $('#input' + num).clone().attr('id', 'input' + newNum); // manipulate the name/id values of the input inside the new element // newElem.children(':first').attr('id', 'name' + newNum).attr('name', 'name' + newNum); newElem.children(':first').attr('id', 'user['+ newNum + ']day' ).attr('name', 'user['+ newNum + ']day' ); newElem.children(':next').attr('id', 'user['+ newNum + ']per' ).attr('name', 'user['+ newNum + ']per' ); newElem.children(':last').attr('id', 'user['+ newNum + ']content' ).attr('name', 'user['+ newNum + ']content' ); // insert the new element after the last "duplicatable" input field $('#input' + num).after(newElem); // enable the "remove" button $('#btnDel').attr('disabled',''); // business rule: you can only add 5 names if (newNum == 5) $('#btnAdd').attr('disabled','disabled'); }); $('#btnDel').click(function() { var num = $('.clonedInput').length; // how many "duplicatable" input fields we currently have $('#input' + num).remove(); // remove the last element // enable the "add" button $('#btnAdd').attr('disabled',''); // if only one element remains, disable the "remove" button if (num-1 == 1) $('#btnDel').attr('disabled','disabled'); }); $('#btnDel').attr('disabled','disabled'); }); </script> </head> <body class="main_bg"> <html:form method="post" action="/traffic/addTraPolicy.do"> <table width="90%" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="1%" height="33" background="<%=request.getContextPath()%>/images/main_02.gif"> <img src="<%=request.getContextPath()%>/images/main_01.gif" width="9" height="33" /> </td> <td width="3%" height="33" background="<%=request.getContextPath()%>/images/main_02.gif"> <img src="<%=request.getContextPath()%>/images/main_03.gif" width="18" height="17" /> </td> <td width="96%" background="<%=request.getContextPath()%>/images/main_02.gif" class="text10"> 添加流量监控策略 </td> </tr> </table> <br /> <table class="admintable" width="90%" border="0" align="center" cellpadding="4" cellspacing="0" bgcolor="#cde6f6"> <tr> <td> <div id="input1" style="margin-bottom:4px;" class="clonedInput"> 提醒日: <input type="text" name="traffics[0].checkDay" id="traffics[0].checkDay" /> 提醒百分比: <input type="text" name="traffics[0].warnPercent" id="traffics[0].warnPercent" /> 推送消息内容: <input type="text" name="traffics[0].warnContent" id="traffics[0].warnContent" /> </div> </td> <td> <div> <input type="button" id="btnAdd" value="添加策略" /> <input type="button" id="btnDel" value="移除策略" /> </div> </td> </tr> <tr> <td height="25" colspan="4" align="center" bgcolor="#FFFFFF"> <input type="submit" value="提交" /> </td> </tr> </table> </html:form> </body> </html>
三: TrafficForm的关键代码
public class TrafficForm extends BaseActionForm implements Serializable { private static final long serialVersionUID = 454397279205151336L; private List traffics = new AutoArrayList(Traffic.class); public List getTraffics() { return traffics; } public void setTraffics(List traffics) { this.traffics.clear(); this.traffics.addAll(traffics); } }
四.bean,提问页面省略了get set方法
public class Traffic extends BaseActionForm implements Serializable { private static final long serialVersionUID = 454397279205151336L; /** * Fields */ private Integer policyId; private Integer checkDay; private Integer warnPercent; private String warnContent; /** default constructor */ public Traffic() { } /** full constructor */ public Traffic(Integer policyId, Integer checkDay, Integer warnPercent, String warnContent) { super(); this.policyId = policyId; this.checkDay = checkDay; this.warnPercent = warnPercent; this.warnContent = warnContent; }
五. 自定义的 AutoArrayList
public class AutoArrayList extends ArrayList implements Serializable { private static final long serialVersionUID = 1L; private Class itemClass; public AutoArrayList(Class itemClass){ this.itemClass = itemClass; } public Object get(int index){ try { while(index >= size()){ add(itemClass.newInstance()); } } catch (Exception e) { e.printStackTrace(); } return super.get(index); } }
六.AddTraPolicyAction
TrafficForm trafficForm = (TrafficForm)form; List traffics = trafficForm.getTraffics(); System.out.println("traffics.size():"+traffics.size()); for (int i = 0; i < traffics.size(); i++) { Traffic traffic = (Traffic) traffics.get(i); System.out.println("Traffic["+i+"]CheckDay:"+traffic.getcheckDay()+" WarnPercent:"+traffic.getWarnPercent()+" WarnContent:"+traffic.getWarnContent()); } // Integer checkDay = trafficForm.getcheckDay(); // Integer warnPercent = trafficForm.getWarnPercent(); // String warnContent = trafficForm.getWarnContent(); // System.out.println("checkDay:"+checkDay); // System.out.println("warnPercent:"+warnPercent); // System.out.println("warnContent:"+warnContent); // // String[] days = request.getParameterValues("day"); // String[] pers = request.getParameterValues("per"); // String[] contents = request.getParameterValues("content"); // System.out.println("测试day数组元素个数"+days.length); // System.out.println("测试pers数组元素个数"+pers.length); // System.out.println("测试contents数组元素个数"+contents.length); // while(request.getParameterNames().hasMoreElements()){ // String day=(String)request.getParameterNames().nextElement(); // String value=request.getParameter(day); // System.out.println("测试name:"+day+",它的值是:"+value); // }
在action中测试,试过traffics的size总是1,总是只能获取表格中的第一行数据。也试过request.getParameterValues依然取不到其他行的数据,求解哪里有问题呢?附上我参考的页面
http://tech.ddvip.com/2008-12/122881555798671_2.html