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

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

<%@ 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>
moveOrCopyPageList

移动和复制的代码(需要初始化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);
            }
        }
    }
View Code

深度复制&串行化,序列化: 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 ;
    }
View Code

 

posted @ 2017-04-13 16:12  SKYisLimit  阅读(111)  评论(0)    收藏  举报