现需要实现:在jsp中一按钮,能够从本地导入txt文档,然后把txt文档里的json串,在jsp上展示给用户并能让用户修改json串(增加,删除)。修改后把完成的json串,放在新生一txt文件里。跪求大神指导!jsonjsp文档js

解决方案 »

  1.   

    无法直接读取和直接保存文件到客户端你需要用服务器做中介,负责读取文件内容输出客户端,保存的时候提交输入框中的内容给服务器,服务器设置content-disposition为attachment;filename="xxx.txt",然后输出提交的内容,就可以弹出保存文件对话框了要点就是将表单提交到隐藏的iframe中实现无刷新上传文件java不知道怎么设置响应头,下面是C#的Response.ContentType = "text/plain";
    Response.AddHeader("Content-Disposition", "attachment;filename=\"xxx.txt\"");
    Response.Write(Request.Form["txt"]);//输出提交的内容
    Response.End();HTML模型
    <script>
        function readContent(ifr) {
            document.getElementById('txt').value = ifr.contentWindow.document.body.innerHTML;
        }
    </script>
    <iframe name="readifr" onload="readContent(this)" style="display:none"></iframe>
    <!---选择文件后自动提交表单,xxxread.jsp负责获取文件内容并且输出--->
    <form target="readifr" method="post" action="xxxread.jsp" enctype="multipart/form-data">
    选择文件:<input type="file" name="fntxt" onchange="this.form.submit()"/>
    </form><!---xxxsave.jsp负责获取提交的内容,设置响应头并且输出--->
    <iframe name="saveifr" style="display:none"></iframe>
    <form target="ifr" method="post" action="xxxsave.jsp">
    <textarea rows="5" cols="50" name="txt" id="txt"></textarea><input type="submit" value="保存" />
    </form>
      

  2.   

    按按钮后用io流读txt文件 
    把读出的json部分在js里转换成js对象 
    之后操作这个对象的属性后转回json再用io流写入txt试试 
      

  3.   

    首先要确定一点,这个“本地”是服务器,还是客户端。如果是在服务器上,可以考虑直接读流打开,反到前台,修改完之后写回去。如果是在客户端,可以将文件上传,在Servlet中返回页面编辑,编辑完成之后提供下载。这样可以实现这个功能。(我不知道JSP可不可以直接编辑客户端的文件。。)
      

  4.   

    。。好麻烦。。前几天给你写了生成JSON的,照你这么说,还得写一个解析JSON再生成DOM节点的。。
      

  5.   

    大神 真的是这样啊 我这导师还要让我把写的那个txt文件 然后给读出来 然后展示出来让用户修改 改了 再存到项目下面 我都疯了 !!!啊 !!!
      

  6.   

    大神 能帮忙给个思路不?谢谢!我能不能先在java部分吧json转成map,然后传到jsp然后再怎么显示呢?
      

  7.   

    好麻烦。。麻烦的不想去弄。。又得解析JSON结构。。我了个去。不过有个简单点的方法,就是你在后台不要给JSON,给的是一个数组,一个元素对应的是一行,
    有键位名,键位值,键位的level,键位的父节点。[
    {id:1,parent:0,key:'user',value:''},
    {id:2,parent:1,key:'name',value:'test'},
    {id:3,parent:1,key:'age',value:'18'},
    {id:4,parent:1,key:'dress',value:[]},
    {id:5,parent:4,key:'Tshirt',value:'aa'},
    {id:6,parent:4,key:'shoe',value:'bb'},
    ]
    以上的数组可以解析成
    {
        "user" : {
            "name": "test",
            "age" : '18',
            "dress" : [
                {"Tshirt" : "aa"},
                {"shoe" : "bb"},
            ]
        }
    }不知道你理解没。
    不知道你明白不
      

  8.   

    你是说在后台就通过json串组装这个数组,然后传到jsp解析吗?
      

  9.   

    我之前的jsp已经完成了动态生成json串的步骤 现在就是读取这个json串以后 怎么样在页面显示让用户修改。
      

  10.   

    代码太长,分开来发。<!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>JSON生成</title>
        <style>
            .sub{
                margin-left:5px;
            }
            div{position:relative;}
            .sub_child{
                margin-left:20px;
            }
        </style>
    </head>
    <body>
        <div id="container">
            <div>
                <a href="javascript:void(0)" class="other" self="first_other" id="first_other" level="1">同</a><a self="first_sub" level="1" href="javascript:void(0)" id="first_sub" class="sub">子</a><input self="first_other" type="text" name="pname" level="1" id="first_pname">:<input self="first_sub" level="1" type="text" name="pvalue" id="first_pvalue"/>
                <div class="sub_child"></div>
            </div>
        </div>
        <input value="显示JSON" type="button" id="show" />
        <input value="读取JSON" type="button" id="read" />
        <div id="result"></div>
        <script type="text/javascript">
            function $(id){
                return document.getElementById(id);
            }
            function getElementsByClassName(className, element) {
                var children = (element || document).getElementsByTagName('*');
                var elements = new Array();
             
                for (var i = 0; i < children.length; i++) {
                    var child = children[i];
                    var classNames = child.className.split(' ');
                    for (var j = 0; j < classNames.length; j++) {
                        if (classNames[j] == className) {
                            elements.push(child);
                            break;
                        }
                    }
                }
             
                return elements;
            }
            var obj = {},sour = {};
            window.onload = function(){
                var d = document,container = $('container');            function jsonToKV(json){
                    var jsonObj = {};
                    function cutJson(json,key,par,level){
                        var name;
                        while(jsonObj[name]){
                            name = 'name'+(new Date()).getTime();
                        }
                        level = level || 0;
                        jsonObj[name] = {};
                        jsonObj[name].value = json;
                        jsonObj[name].key = key;
                        jsonObj[name].level = level;
                        par && (jsonObj[name].parent = par);
                        if(gettype(json)=='[object Object]'){
                            level++
                            for(var p in json){
                                cutJson(json[p],p,name,level);
                            }
                        }else if(gettype(json)=='[object Array]'){
                            level++
                            for(var i=0,len=json.length;i<len;i++){
                                cutJson(json[i],i,name,level);
                            }
                        }
                    }
                    cutJson(json);
                    for(var p in jsonObj){
                        if(p!=='undefined')
                        createDomTree(p,jsonObj[p]);
                    }
                    return jsonObj;
                }
                
                function createDomTree(id,obj){
                    var parentDom = obj.parent ? getElementsByClassName('sub_child',$(obj.parent))[0] : $('container');
                    var frag = d.createDocumentFragment();
                    var div = d.createElement('div');
                    div.id = id;
                    var othera = d.createElement('a');
                    othera.href="javascript:void(0)";
                    othera.setAttribute('level',obj.level);
                    othera.innerHTML = '同'
                    othera.setAttribute('self',id);
                    obj.parent && othera.setAttribute('parent',obj.parent);
                    var suba = othera.cloneNode();
                    suba.innerHTML = '子';
                    suba.className = 'sub';
                    var attrName = d.createElement('input');
                    attrName.name = 'pname';
                    attrName.type = 'text';
                    attrName.setAttribute('self',id);
                    attrName.value = (typeof obj.key != 'number') ? obj.key : '';
                    attrName.setAttribute('level',obj.level);
                    obj.parent && attrName.setAttribute('parent',obj.parent);
                    var split = d.createTextNode(':');
                    var attrValue = attrName.cloneNode();
                    attrValue.name = 'pvalue';
                    attrValue.setAttribute('level',obj.level);
                    if(gettype(obj.value)=='[object Object]'){
                        attrValue.type = 'checkbox'
                        attrValue.checked= false;
                    }else if(gettype(obj.value)=='[object Array]'){
                        attrValue.type = 'checkbox';
                        attrValue.checked= true;
                    }else{
                        attrValue.value = obj.value;
                    }
                    
                    var subcon = d.createElement('div')
                    subcon.className= 'sub_child'
                    
                    var del = othera.cloneNode();
                    del.innerHTML = '删';
                    
                    div.appendChild(othera);
                    div.appendChild(suba);
                    div.appendChild(attrName);
                    div.appendChild(split);
                    div.appendChild(attrValue);
                    div.appendChild(del);
                    div.appendChild(subcon);
                    
                    frag.appendChild(div);
                    parentDom.appendChild(frag);
                }
                
                function createAttr(level,who,sub){
                    var now = (new Date()).getTime();
                    var self = 'name'+now;
                    var _parent = level==1 ? container : (!sub ? who.parentNode.parentNode : getElementsByClassName('sub_child',who.parentNode)[0]);
                    var frag = d.createDocumentFragment();
                    var con = d.createElement('div');
                    var othera = d.createElement('a');
                    othera.href="javascript:void(0)";
                    othera.setAttribute('level',level);
                    othera.innerHTML = '同'
                    othera.setAttribute('self',self);
                    var suba = othera.cloneNode();
                    suba.innerHTML = '子';
                    suba.className = 'sub';
                    var attrName = d.createElement('input');
                    attrName.name = 'pname';
                    attrName.type = 'text';
                    attrName.setAttribute('self',self)
                    var attrValue = attrName.cloneNode();
                    attrValue.name = 'pvalue';
                    attrValue.type = 'text';
                    attrName.setAttribute('self','name'+now);
                    attrValue.setAttribute('self','name'+now);
                    attrName.setAttribute('level',level);
                    attrValue.setAttribute('level',level);
                    con.appendChild(othera);
                    con.appendChild(suba);
                    con.appendChild(attrName);
                    var split = d.createTextNode(':');
                    var subcon = d.createElement('div')
                    subcon.className= 'sub_child'
                    con.appendChild(split);
                    con.appendChild(attrValue);
                    var del = othera.cloneNode();
                    del.innerHTML = '删';
                    con.appendChild(del);
                    con.appendChild(subcon);
                    frag.appendChild(con);
                    if(who){
                        var parentName = sub ? who.getAttribute('self') : who.getAttribute('parent');
                        attrName.setAttribute('parent',parentName);
                        attrValue.setAttribute('parent',parentName);
                        othera.setAttribute('parent',parentName);
                        suba.setAttribute('parent',parentName);
                    }
                    del.onclick = function(){
                        var parent = this.parentNode;
                        parent.parentNode.removeChild(parent)
                    }
                    _parent.appendChild(frag);
                    othera.onclick = function(){
                        var level = this.getAttribute('level');
                        createAttr(level,this);
                    };
                    suba.onclick = function(){
                        var level = parseInt(this.getAttribute('level'));
                        var parent = this.parentNode;
                        var valueinput = parent.getElementsByTagName('input')[1];
                        if(valueinput.type!='checkbox'){
                            var tip = d.createTextNode('数组');
                            parent.insertBefore(tip,valueinput);
                            var checkbox = valueinput.cloneNode();
                            checkbox.type = 'checkbox';
                            parent.insertBefore(checkbox,tip);
                            parent.removeChild(valueinput);
                        }
                        createAttr(level + 1,this,true);
                    }
                }
      

  11.   


                function init(){
                    var key1 = $('first_other').getAttribute('self');
                    $('first_other').onclick = function(){
                        var level = this.getAttribute('level');
                        createAttr(level,this);
                    }
                    var now = (new Date()).getTime()
                    $('first_other').setAttribute('self','name'+now);
                    $('first_sub').setAttribute('self','name'+now);
                    $('first_pname').setAttribute('self','name'+now);
                    $('first_pvalue').setAttribute('self','name'+now);
                    $('first_sub').onclick = function(){
                        var level = parseInt(this.getAttribute('level'));
                        var parent = this.parentNode;
                        var valueinput = parent.getElementsByTagName('input')[1];
                        if(valueinput.type!='checkbox'){
                            var tip = d.createTextNode('数组');
                            parent.insertBefore(tip,valueinput);
                            var checkbox = valueinput.cloneNode();
                            checkbox.type = 'checkbox';
                            parent.insertBefore(checkbox,tip);
                            parent.removeChild(valueinput);
                        }
                        createAttr(level + 1,this,true);
                        var self = this.getAttribute('self');
                        sour[self] = {};
                    }
                }
                init();
                function gettype(obj){
                    return Object.prototype.toString.call(obj);
                }
                $('show').onclick = function(){
                    var nameinputs = document.getElementsByName('pname');
                    var valueinputs = document.getElementsByName('pvalue');
                    var len = nameinputs.length;
                    var ip,vip;
                    var arr = [],objarr = {};
                    for(var i=0;i<len;i++){
                        ip = nameinputs[i],vip = valueinputs[i];
                        var parent = ip.getAttribute('parent');
                        parent = (parent==null || parent==undefined || parent=='null') ? '' : parent;
                        var _k = ip.value,_v = vip.type=='checkbox' ? (vip.checked ? [] : {}) :vip.value,_id = ip.getAttribute('self');
                        var level = parseInt(ip.getAttribute('level'))
                        objarr[_id] = {
                            id:_id,
                            key:_k,
                            value : _v,
                            p : parent,
                            level : level
                        }
                    }
                    for(var p in objarr){
                        if(objarr[p].p){
                            var pid = objarr[p].p;
                            var selfid = objarr[p].id;
                            if(gettype(objarr[pid].value)=='[object Object]'){
                                objarr[pid].value[selfid] = objarr[p];
                            }else if(gettype(objarr[pid].value)=='[object Array]'){
                                objarr[pid].value.push(objarr[p]);
                            }else{
                                
                            }
                        }
                    }
                    var _final = {};
                    for(var p in objarr){
                        if(objarr[p].level == 1){
                            createObj(objarr[p],_final);
                        }
                    }
                    function createObj(obj,who){
                        var _type = gettype(obj.value);
                        if(_type=='[object Object]'){
                            if(gettype(who) == '[object Array]'){
                                var len = who.length;
                                who[len] = {};
                                for(var p in obj.value){
                                    createObj(obj.value[p],who[len]);
                                }
                            }else{
                                !who[obj.key] && (who[obj.key] = {});
                                for(var p in obj.value){
                                    createObj(obj.value[p],who[obj.key]);
                                }
                            }                    }else if(_type=='[object Array]'){
                            if(obj.key!=''){
                                !who[obj.key] && (who[obj.key] = []);
                            }else{
                                if(gettype(who)=='[object Array]'||gettype(who)=='[object Object]'){
                                    alert('有子字段且子字段为数组的字段名不得为空!');
                                    return;
                                }
                            }
                            for(var i=0,len=obj.value.length;i<len;i++){
                                if(obj.key==''){
                                    createObj(obj.value[i],who[who.length-1]);
                                }else{
                                    if(obj.value[i].key!=''){
                                        var thisobj = {}; 
                                        who[obj.key].push(thisobj);
                                        createObj(obj.value[i],thisobj);
                                    }else{
                                        createObj(obj.value[i],who[obj.key]);
                                    }
                                }
                            }
                        }else{
                            if(obj.key!=''){
                                if(gettype(who) == '[object Array]'){
                                    var thisobj = {};
                                    thisobj[obj.key] = obj.value;
                                    who.push(thisobj)
                                }else{
                                    who[obj.key] = obj.value;
                                }
                            }else{
                                obj.value!= '' && who.push(obj.value);
                            }
                        }
                    }
                    $('result').innerHTML = JSON.stringify(_final)
                    _final = {};
                }
                $('read').onclick = function(){
                    var json = {
                        a:1,
                        b:{
                            o1:1,
                            o2:2
                        },
                        c:[{v1:1,v2:2},{v3:3,v4:4}],
                        d:[1,2,3,4]
                    }
                    $('container').innerHTML = '';
                    jsonToKV(json);
                }
            }
        </script>
    </body>
    </html>
    写的很乱,但功能实现了。凑合用吧。。回头有时间再重构下。读取JSON重点在read按钮的事件里,我是直接写死了一个类JOSN的object,你可以通过AJAX去取到你从文件里读取出来的JSON字符串。
      

  12.   

    哦,读取JSON后生成的同跟子没有添加事件。
    把createDomTree函数改成一下内容即可
                function createDomTree(id,obj){
                    var parentDom = obj.parent ? getElementsByClassName('sub_child',$(obj.parent))[0] : $('container');
                    var frag = d.createDocumentFragment();
                    var div = d.createElement('div');
                    div.id = id;
                    var othera = d.createElement('a');
                    othera.href="javascript:void(0)";
                    othera.setAttribute('level',obj.level);
                    othera.innerHTML = '同'
                    othera.setAttribute('self',id);
                    obj.parent && othera.setAttribute('parent',obj.parent);
                    var suba = othera.cloneNode();
                    suba.innerHTML = '子';
                    suba.className = 'sub';
                    var attrName = d.createElement('input');
                    attrName.name = 'pname';
                    attrName.type = 'text';
                    attrName.setAttribute('self',id);
                    attrName.value = (typeof obj.key != 'number') ? obj.key : '';
                    attrName.setAttribute('level',obj.level);
                    obj.parent && attrName.setAttribute('parent',obj.parent);
                    var split = d.createTextNode(':');
                    var attrValue = attrName.cloneNode();
                    attrValue.name = 'pvalue';
                    attrValue.setAttribute('level',obj.level);
                    if(gettype(obj.value)=='[object Object]'){
                        attrValue.type = 'checkbox'
                        attrValue.checked= false;
                    }else if(gettype(obj.value)=='[object Array]'){
                        attrValue.type = 'checkbox';
                        attrValue.checked= true;
                    }else{
                        attrValue.value = obj.value;
                    }
                    
                    var subcon = d.createElement('div')
                    subcon.className= 'sub_child'
                    
                    var del = othera.cloneNode();
                    del.innerHTML = '删';
                    
                    div.appendChild(othera);
                    div.appendChild(suba);
                    div.appendChild(attrName);
                    div.appendChild(split);
                    div.appendChild(attrValue);
                    div.appendChild(del);
                    div.appendChild(subcon);
                    
                    frag.appendChild(div);
                    parentDom.appendChild(frag);
                    del.onclick = function(){
                        var parent = this.parentNode;
                        parent.parentNode.removeChild(parent)
                    }
                    othera.onclick = function(){
                        var level = this.getAttribute('level');
                        createAttr(level,this);
                    };
                    suba.onclick = function(){
                        var level = parseInt(this.getAttribute('level'));
                        var parent = this.parentNode;
                        var valueinput = parent.getElementsByTagName('input')[1];
                        if(valueinput.type!='checkbox'){
                            var tip = d.createTextNode('数组');
                            parent.insertBefore(tip,valueinput);
                            var checkbox = valueinput.cloneNode();
                            checkbox.type = 'checkbox';
                            parent.insertBefore(checkbox,tip);
                            parent.removeChild(valueinput);
                        }
                        createAttr(level + 1,this,true);
                    }
                }