项目中有如下需求。可能考虑到比较实用,因此特写下此文,仅供参考。

页面结构大致介绍如下:

下图是一个frameset的结构,;

 

 
  
  1. <frameset rows="*" cols="216,683" frameborder="no" border="0" framespacing="0"> 
  2.   <frame src="web/event/left.jsp"  name="left" scrolling="No" noresize="noresize" id="leftFrame"/> 
  3.     <frame src="right.html"  name="right"/> 
  4. </frameset>   

左侧的“组别”,对应的是一组List的返回值,也就是说这些组别是从数据库里面读取出来的。

右侧的项目名称,也是一组List的返回值,取里面的name值,后面的赛次数,等其他字段是需要批量保存进数据库表A的。

表A里面的名称是由 组别 + 项目名称 组合起来的。

例如:中学男子甲组60米 这样。

 

下面,帖上代码,并做有详细的讲解。

①需批量增加的文本框,均是name="eventSelects"

 
  
  1. <input type="text" name="eventSelects"/> 
  2. <input type="text" name="eventSelects"/>
  3. 。。。


 

下面的两隐藏域,是用来做拼接之用。左侧的组别名字,可以通过参数传递过来,

 

 
  
  1. <input type="hidden" name="eventSelects" value="<%=request.getParameter("fullName")%>"/> 
  2.                                                         <input type="hidden" name="eventSelects" value="<s:property value="name" />"/> 

传递参数的方法如下:

 
  
  1. <a href="item/findByUserId2.action?id=${session.userId}&&fullName=<s:property value="fullName"/>" target="right"> 

注意:此处是中文参数名,会出现乱码等情况,需要我们后台来处理下。见下面的代码。

②后台部分如下:

 

 
  
  1. private String[] eventSelects;  
  2. public String[] getEventSelects() {  
  3.         return eventSelects;  
  4.     }  
  5.  
  6.     public void setEventSelects(String[] eventSelects) {  
  7.         this.eventSelects = eventSelects;  
  8.     } 


③Action代码如下:
 

 
  
  1. public String saveEventBatch() throws Exception {  
  2.         try {  
  3.  
  4.             HttpServletRequest request = ServletActionContext.getRequest();  
  5.               
  6.             eventSelects = request.getParameterValues("eventSelects");  
  7.             Map session = ActionContext.getContext().getSession();  
  8.             String userId = session.get("userId").toString();  
  9.             for (int i = 0; i < eventSelects.length; i++) {  
  10.                 event = new Event();  
  11.                 String a = new String(eventSelects[i].getBytes("iso-8859-1"),"UTF-8");  
  12.                 event.setName(a+eventSelects[i+1]);  
  13.                 event.setRace(eventSelects[i+2]);  
  14.                 event.setGroupTime(Long.parseLong(eventSelects[i+3]));  
  15.                 event.setTrackPriority(eventSelects[i+4]);   
  16.                 i+=4;  
  17.                 event.setUserId(Long.parseLong(userId));  
  18.                 this.eventService.saveEvent(event);  
  19.  
  20.             }  
  21.               
  22.  
  23.         } catch (Exception e) {  
  24.             // TODO: handle exception  
  25.             e.printStackTrace();  
  26.             return INPUT;  
  27.         }  
  28.         return SUCCESS;  
  29.     }  

其中需要注意的是,第6行,

 

 
  
  1. HttpServletRequest request = ServletActionContext.getRequest();  
  2.             eventSelects = request.getParameterValues("eventSelects"); 

获取这个数组,然后在下面的代码中进行迭代,取出数组里面的值,然后批量保存。

第10行代码,此处需要new 一个event对象,因为一般Struts2中通过属性封装,

 
  
  1. private Event event;  
  2. public void setEvent(Event event) {  
  3.         this.event = event;  
  4.     }  
  5.  
  6.     public Event getEvent() {  
  7.         return event;  
  8.     } 

,然后页面 event.name ,event.userId等这样,就相当于封装了一个form,我们这里没有这样做,name 不是对象.属性这种方式,因此需要在局部new一个对象出来。

第11行,还记得上文的那个中文参数吗?此处就是用来转码的,如果不转码,会发现url中文参数,存入的是乱码。

第12行--第15行,分别读取数组里面的字段,然后依次存入对象里面。因为数组里面的值类似下面【1,2,3,4,5,6,7,8】 这样,是通过序号index(也叫数组下标)来访问的。12行实现了字符串的拼接。

第16行 i+=4,是因为,下一条的数据是序号从5开始的,如果没此条语句,则可能会报错,因为,把数组里面的值存错位置了。