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个回答

下面是我写的登录,提供给你看看
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');

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

writer.write(json);

writer.flush();
writer.close();

难道是因为没关闭的原因?

[code="java"]response.setContentType("application/x-json;charset=UTF-8");[/code]
这句有问题把,注释了试试。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问