SSH下的组合批量增加
项目中有如下需求。可能考虑到比较实用,因此特写下此文,仅供参考。
页面结构大致介绍如下:
下图是一个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开始的,如果没此条语句,则可能会报错,因为,把数组里面的值存错位置了。
摘自 幽灵柯南的技术blog
补充:软件开发 , Java ,