项目中有如下需求。可能考虑到比较实用,因此特写下此文,仅供参考。
页面结构大致介绍如下:
下图是一个frameset的结构,;
- <frameset rows="*" cols="216,683" frameborder="no" border="0" framespacing="0">
- <frame src="web/event/left.jsp" name="left" scrolling="No" noresize="noresize" id="leftFrame"/>
- <frame src="right.html" name="right"/>
- </frameset>
左侧的“组别”,对应的是一组List的返回值,也就是说这些组别是从数据库里面读取出来的。
右侧的项目名称,也是一组List的返回值,取里面的name值,后面的赛次数,等其他字段是需要批量保存进数据库表A的。
表A里面的名称是由 组别 + 项目名称 组合起来的。
例如:中学男子甲组60米 这样。
下面,帖上代码,并做有详细的讲解。
①需批量增加的文本框,均是name="eventSelects"
- <input type="text" name="eventSelects"/>
- <input type="text" name="eventSelects"/>
- 。。。
下面的两隐藏域,是用来做拼接之用。左侧的组别名字,可以通过参数传递过来,
- <input type="hidden" name="eventSelects" value="<%=request.getParameter("fullName")%>"/>
- <input type="hidden" name="eventSelects" value="<s:property value="name" />"/>
传递参数的方法如下:
- <a href="item/findByUserId2.action?id=${session.userId}&&fullName=<s:property value="fullName"/>" target="right">
注意:此处是中文参数名,会出现乱码等情况,需要我们后台来处理下。见下面的代码。
②后台部分如下:
- private String[] eventSelects;
- public String[] getEventSelects() {
- return eventSelects;
- }
- public void setEventSelects(String[] eventSelects) {
- this.eventSelects = eventSelects;
- }
③Action代码如下:
- public String saveEventBatch() throws Exception {
- try {
- HttpServletRequest request = ServletActionContext.getRequest();
- eventSelects = request.getParameterValues("eventSelects");
- Map session = ActionContext.getContext().getSession();
- String userId = session.get("userId").toString();
- for (int i = 0; i < eventSelects.length; i++) {
- event = new Event();
- String a = new String(eventSelects[i].getBytes("iso-8859-1"),"UTF-8");
- event.setName(a+eventSelects[i+1]);
- event.setRace(eventSelects[i+2]);
- event.setGroupTime(Long.parseLong(eventSelects[i+3]));
- event.setTrackPriority(eventSelects[i+4]);
- i+=4;
- event.setUserId(Long.parseLong(userId));
- this.eventService.saveEvent(event);
- }
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- return INPUT;
- }
- return SUCCESS;
- }
其中需要注意的是,第6行,
- HttpServletRequest request = ServletActionContext.getRequest();
- eventSelects = request.getParameterValues("eventSelects");
获取这个数组,然后在下面的代码中进行迭代,取出数组里面的值,然后批量保存。
第10行代码,此处需要new 一个event对象,因为一般Struts2中通过属性封装,
即
- private Event event;
- public void setEvent(Event event) {
- this.event = event;
- }
- public Event getEvent() {
- return event;
- }
,然后页面 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开始的,如果没此条语句,则可能会报错,因为,把数组里面的值存错位置了。
转载于:https://blog.51cto.com/enetq/836624