idealab 2009-01-08 15:22
浏览 301
已采纳

JsonStore数据请求方式,可以获得Response,却无法读出json格式数据..

我的登录页面,利用extJS的JsonStore组件向Server发送数据,验证用户名密码,然后Server返回将要跳转的页面URL(登录成功或失败页面).
客户端登录表单的【登入】按钮响应以上过程,以下是js代码:
[code="js"]
buttons : [{
text : '登入',
handler : function() {
var username = Ext.get('name').getValue();
var pwd = Ext.get('password').getValue();
var store = new Ext.data.JsonStore({
proxy : new Ext.data.HttpProxy({
url : 'logon.do' + '?username='
+ username + '&pwd='
+ pwd,
method : 'GET'
}),
reader : new Ext.data.JsonReader({
root : 'rows',
id : 'id',
totalProperty : 'counts',
fields : ['topage']
})
});

                    store.load();
                    if (store.getAt(0) != null) {
                        Ext.Msg.alert('Info', '共获得'+store.getCount()+'条数据');
                        window.open(store.getAt(0).get('topage'), '_blank');
                    }

                }
            }

[/code]
以下是Server端业务处理代码:
[code="java"]
public class LogonController extends HttpServlet{
String pageurl="";
String json="";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
response.setContentType("application/x-json;charset=UTF-8");
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
if(username.equals("jerry") && pwd.equals("1")){
pageurl="http://localhost:8080/hrms/index.html";
}else
pageurl="http://localhost:8080/hrms/failure.html";
PrintWriter writer = response.getWriter();
System.out.println(writer.toString());
JSONObject jObj = new JSONObject();
jObj.put("topage",pageurl);
json = jObj.toString();
System.out.println(json);
writer.write(json);

}

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
    doGet(request,response);
}

}
[/code]
通过测试,发现store对象中没有获取到数据(store.getCount()为空),利用FireBug调试,得到以下结果:
[img]/upload/attachment/67084/da5a4590-3d40-3015-ba43-93946e6bf5c6.jpg[/img]

说明客户端得到了response,但是json格式的数据没有被解析。
若将store.getAt(0)提出来单独执行,FireBug调试却又得到如下结果:
[img]/upload/attachment/67087/d6ead45e-c98e-386e-9b64-7461f271d330.jpg[/img]

请各位给断断,这是怎么回事?谢谢哈。
[b]问题补充:[/b]
rain2005:
注释掉也是不行啊,服务器应该是返回一个js页面的吧,这样json才能封装为对象。

  • 写回答

3条回答 默认 最新

  • 马勒格彼得 2009-01-09 10:47
    关注

    下面是我写的登录,提供给你看看
    var adminLoginForm=null;var adminLoginWin=null;function openLoginWindow(){adminLoginForm=new Ext.FormPanel({id:'operationInf', name:'OperationInf', frame:true, labelWidth:70, labelAlign:'right', bodyStyle:'padding:5px 5px 0', width:350, items:[{xtype:'textfield', fieldLabel:'用户名', id:'edit_SPID', name:'operatorId', allowBlank:false, vtype:'prolate_alphanum', vtypeText:'请您输入A-Z,a-z,0-9的字母数字组合!', minLength:4, minLengthText:'请您输入最少4个字符!', maxLength:20, maxLengthText:'请您输入最多20个字符!', anchor:'95%' }, {xtype:'textfield', fieldLabel:'密码', id:'edit_SPIP', name:'operatorPassword', inputType:'password', minLength:6, minLengthText:'请您输入最少6个字符!', maxLength:20, maxLengthText:'请您输入最多20个字符!', allowBlank:false, vtype:'prolate_alphanum', vtypeText:'请您输入A-Z,a-z,0-9的字母数字组合!', anchor:'95%' }], buttons:[{text:'登录', handler:doSubmit },{text:'取消', handler:function(){Ext.MessageBox.confirm('提示信息', '当前数据将不会保存,您确定要取消吗?',function(btn){if(btn=="yes"){ adminLoginForm.getForm().reset();}});}}],keys:[{key:Ext.EventObject.ENTER, fn:doSubmit, scope:this }] });adminLoginWin=new Ext.Window({id:'adminLoginWin', name:'adminLoginWin', title:'

    欢迎使用移动工单管理系统

    ', iconCls:'icon-lock-s', width:adminLoginForm.width, height:adminLoginForm.height, closable:false, collapsible:false, draggable:false, resizable:false, maximizable:false, modal:false, border:true, items:[adminLoginForm] });adminLoginWin.show();}function doSubmit(){if(adminLoginWin.getComponent('operationInf').form.isValid()){adminLoginWin.getComponent('operationInf').form.submit({url:'adminLogin.do', waitTitle:'提示', method:'POST', waitMsg:'正在处理您的请求,请稍候...', success:function(form,action){try{var flag=action.result.success;if(flag==false){Ext.MessageBox.alert('提示',action.result.message);}else if(flag==true){adminLoginForm.getForm().reset();window.location.href="index_Tree.jsp";}}catch(e){Ext.MessageBox.alert('提示','对不起,您无法连接系统,如果您的网络正常,请联系系统管理员!');}}, failure:function(form,action){try{Ext.MessageBox.alert('提示',action.result.message);}catch(e){Ext.MessageBox.alert('提示','对不起,您无法连接系统,如果您的网络正常,请联系系统管理员');}}});}}
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.form.Field.prototype.msgTarget='side';
    openLoginWindow();
    });

    你采用的这种方式不是很好,用store来登录,这样不好
    store.load();

    if (store.getAt(0) != null) {

    Ext.Msg.alert('Info', '共获得'+store.getCount()+'条数据');

    window.open(store.getAt(0).get('topage'), '_blank');

    }
    跟你说load()在执行的过程中,下面的方法也在执行,这样你往往获得不了值,明白吗,所以,要这样处理
    store.load({
    callback: function(r, options, success) {
    if (success == false) {

    alert("加载数据失败,无对应数据或者系统出现异常!");
    }else{
    if (store.getAt(0) != null) {

    Ext.Msg.alert('Info', '共获得'+store.getCount()+'条数据');

    window.open(store.getAt(0).get('topage'), '_blank');

    }
    }
    }
    });
    这样做你就可以取到值了,试试吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动