调查统计系统--页面和题目的移动复制

点击移动/复制页,把源页面移动/复制到目标页面前面或者后面,(相同的调查表,改变排序进行移动,不同的调查表就复制)

<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>移动/复制页面</title> <link rel="stylesheet" type="text/css" href='<s:url value="/styles.css" />'> </head> <body> <s:include value="/header.jsp" /> <table> <tr> <td colspan="3" class="tdWhiteLine"></td> </tr> <tr> <td colspan="3" class="tdHeader">移动/复制页:[同一调查内是移动,不同调查间是复制]</td> </tr> <tr> <td colspan="3" class="tdWhiteLine"></td> </tr> <s:iterator var="s" value="surveys"> <s:set var="sId" value="#s.id" /> <tr> <td colspan="3" class="tdSHeaderL"><s:property value="title" /></td> </tr> <s:iterator var="p" value="#s.pages" status="st"> <s:set var="pId" value="#p.id"/> <!-- 当前的页面高亮 --> <s:if test="#pId == srcPid"> <!-- 设置字符串变量值,保持颜色 --> <s:set var="bgcolor" value='"rgb(200,125,200)"' /> </s:if> <s:else> <s:set var="bgcolor" value='"bgcolor=\"white\""' /> </s:else> <tr bgcolor='<s:property value="#bgcolor"/>'> <td style="width:30px;border-width:0;background-color: white"></td> <td><s:property value="#p.title" /></td> <td> <s:if test="#pId != srcPid"> <s:form name="form%{#pId}" action="MoveOrCopyPageAction_doMoveOrCopyPage" method="post"> <s:hidden name="srcPid" /> <s:hidden name="targPid" value="%{#pId}" /> <!-- 当移动/复制完成后,需要重定向到目标调查的设计页面 --> <s:hidden name="sid" value="%{#sId}" /> <s:radio list="#{0:'之前',1:'之后'}" listKey="key" listValue="value" name="pos"/> <input type="submit" class="btn" value="确定"> </s:form> </s:if> </td> </tr> </s:iterator> </s:iterator> </table> </body> </html>
移动和复制的代码(需要初始化page下面的question,访问以下即可,因为代理对象不会复制过来的)
/** * 进行移动和复制操作 */ public void moveOrCopyPage(Integer srcPid, Integer targPid, int pos){ Page srcPage = this.getPage(srcPid); Survey srcSurvey = srcPage.getSurvey(); Page targPage = this.getPage(targPid); Survey targSurvey = targPage.getSurvey(); //移动复制? if(srcSurvey.getId().equals(targSurvey.getId())){//相同的调查表,改变排序进行移动 setOrderno(srcPage,targPage,pos); } //复制 else{ //对源页面进行深度复制 srcPage.getQuestions().size(); Page copy = (Page) DataUtil.deeplyCopy(srcPage) ; //对srcPage进行深度复制 //设置新的关联关系 copy.setSurvey(targSurvey); //分别保存新的页面和问题 pageDao.saveEntity(copy); for(Question q : copy.getQuestions()){ questionDao.saveEntity(q); } setOrderno(copy,targPage,pos); } } /** * 设置页序,移动到最前orderno就-0.01,最后就+0.01,中间就取前后的平均值 */ private void setOrderno(Page srcPage, Page targPage, int pos) { //之前/之后? if(pos == 0){ if(isFirstPage(targPage)){ srcPage.setOrderno(targPage.getOrderno() - 0.01f); } else{ Page prePage = getPrePage(targPage); srcPage.setOrderno((targPage.getOrderno() + prePage.getOrderno()) / 2); } } //之后 else{ if(isLastPage(targPage)){ srcPage.setOrderno(targPage.getOrderno() + 0.01f); } else{ Page nextPage = getNextPage(targPage); srcPage.setOrderno((targPage.getOrderno() + nextPage.getOrderno()) / 2); } } }
深度复制&串行化,序列化: java obj---->byte[], 再反序列化,
Page对象属性中的survey 不需要持久化,加一个瞬态属性。(因为surey下面关联了好多个page,但是我们只需要复制一个page,很浪费性能)
private transient Survey survey ;
/** * 深度复制,复制的整个对象图. */ public static Serializable deeplyCopy(Serializable src){ try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); //构造一个对象输出流 oos.writeObject(src); //把对象写到流里面去 oos.close(); baos.close(); byte[] data = baos.toByteArray(); //转换成字节数组 ByteArrayInputStream bais = new ByteArrayInputStream(data); ObjectInputStream ois = new ObjectInputStream(bais);//转换成对象输入流 Serializable copy = (Serializable) ois.readObject();//读取对象 ois.close(); bais.close(); return copy ; } catch (Exception e) { e.printStackTrace(); } return null ; }

浙公网安备 33010602011771号