要求是用户不管填了什么,都把JSP页面中用户填写的内容当成草稿保存下来。
由于数据库那里有很多限制,比如只能数字,或者不能为空,或者长度限制。
所以不能把数据存在原来一样的table里。  
并且要求草稿可以有多个,可以在以后的查询里找到继续填写。现在考虑再建一个DB,(由于有很多种草稿,即很多种页面都需要草稿保存功能,所以没有在同一个库建很多类似的表,
而直接建个库)把table not null都去掉,都存文本。问题是,我看很多blog也有草稿功能,当然也许他们的要求是填正确了才能存草稿。
我想问,这种需求一般怎么实现?? 如果没有固定模式,大家也可以帮我想想办法。(其实我觉得这也许是个数据库的问题,但不知道放在哪个板块)ldh911有空看看吗??

解决方案 »

  1.   

    我还有个想法就是把各个页面的form序列化存DB。
    但是这样就不方便检索了,所以放弃了。
      

  2.   

    我遇到的都是一两条草稿数据,就是直接要求填写正确的数据后才能存草稿,not null的栏位一定要填写才能存
      

  3.   

    很有意思的问题。我们也有存草稿的问题,而且也应该是随时随地;而且是复杂表单(超级复杂),但是一般没有RichText。不过我们的做法不见得通用,因为我们把任何表单数据都处理为XML结构,提交或暂存(草稿)时都是先将页面数据封装为XML数据结构(或者理解为字符串也行),然后再将整个字符串以Ajax方式POST给服务器端。再次查询出来的时候,界面也是用Ajax向服务器请求XML数据报文,然后服务器从数据库中直接把XML查询出来,界面再将XML映射回各控件。我们的复杂表单会有20张以上主副表单组成,近2000个单元格需要填写,且表格之间存在逻辑自动计算和对照校验关系,所以不太好切分成N个页面去填写(用户要经常在表单之间切换),此外必然需要随时能暂存。供参考~~~
      

  4.   

    如果用户没有值的话那你就给他赋予默认值不就好了呢?然后草稿其实就是一个状态嘛。比如0是未审核,1是审核,2是草稿之类的状态,
    当然到最后的话,你可以放个ajax到页面上,然后定时保存下也好嘛。哈哈
      

  5.   


    不错。 请问下你们处理为XML是用什么库的吗?
    我知道java可以用xstream,你们是在客户端序列化成xml的吗? 怎么做的?
      

  6.   

    to ldh911
    还有万一界面上多了几个输入框(设计变了),你们那样做是不是以前的草稿可能不能用了??
      

  7.   

    觉得一般还是用文件的形式保存,不直接存在数据库中。
    上面说到用xml保存,如果页面多了输入框,也没有问题吧,保存草稿是保存最后一次的数据并覆盖掉原来的。
      

  8.   


    服务器端,早期处理XML的是我自己写的一个库,因为嫌开源组件大多速度不够快、内存开销大;最近用的是 VTD-XML。客户端你是指浏览器吧?用JS直接将对象转为XML字符串,这个算法倒是很简单,而且也有JS包可以做。这个风险是永远存在的。不过对于XML而言,常规调整不会产生影响:
      界面多录入控件:这无非就是XML反填的时候缺一个值而已,并不会形成任何危害;
      界面少录入控件:这就是XML反填时,有一个元素没地方填了,控制好异常也不会形成危害。
    真正怕的是:XML报文的结构调整,这个是颠覆性的。不过换个想法,你直接用数据库字段来存,只怕影响更大。所以对于存档数据,我们会考虑将其固化(样式+数据),可以理解为静态HTML了,不过我们推荐是PDF之类的。你可能会好奇我是怎么考虑控件如何跟XML配对,其实也挺简单的:
    <input type="text" name="head.publicHead.info.name" readonly="readonly" datatype="string"/>它表示:
    1、该控件值映射到XML的:\head\publicHead\info\name 节点
    2、只读
    3、数据类型是string
    4、无需任何校验Anyway,只是一种做法,既不是业界推荐,更谈不上流行了。
      

  9.   

    1. 建一张表,字段为标题,内容,创建时间。
    2. 通过ajax实现自动保存。

    <script language="javascript">
    var saveReq = false;
    //保存 草稿 
    function autoSave(){
    var title=document.getElementById("title").value;
    var content=document.getElementById("content").value;
    if(title!="") { //当文章标题不为空时
    var url = "saveDraft.jsp";
    var param = "title="+title+"&content="+content;
    //调用编写的Ajax请求方法 
    saveReq = httpRequest("post",url,true,callbackFunc_save,param);
    }
    }
    //回调函数 
    function callbackFunc_save(){
    if(saveReq.readyState == 4){
    if(saveReq.status == 200){
    document.getElementById("sysTip").innerHTML = saveReq.responseText;
    }
    }
    }
    var selectReq = false;
    function selectArticle(){
    var url = "getDraft.jsp";
    var param = "nocache="+new Date().getTime();
    selectReq = httpRequest("get",url,true,callbackFunc_select,param);
    }
    function callbackFunc_select(){
    if(selectReq.readyState == 4){
    if(selectReq.status == 200){
    document.getElementById("draftBox").innerHTML = selectReq.responseText;
    }
    }
    }var delay=1000*60*5; //定义延迟时间,这里为5分钟
    timer=window.setInterval(autoSave,10000); //每隔5分钟保存一次草稿
    timer=window.setInterval(selectArticle,delay); //每隔5分钟保存一次草稿</script>
      

  10.   


    不会有问题,多了输入框,无非是在草稿中找所映射XML节点找不到,那么该输入框就留空,并不会导致出错啊。
      

  11.   


    谢谢,我参考了很多例子。
    弄了个用javascript序列化和反序列化form内容的例子。
    http://goro.iteye.com/admin/blogs/1671322基本决定这样做了。 嘿嘿。要是再有问题,我发贴再问。
      

  12.   

    上面的地址重发。
    http://goro.iteye.com/blog/1671322