ExtJS4的JS代码如下:
Ext.onReady(function(){
//创建Model
Ext.define('User',{
extend:'Ext.data.Model',
fields:[
{name : 'username', mapping : 'username', type : 'string'},
{name : 'email', type : 'string'},
{name : 'phone', type : 'string'}
]
});
var store = Ext.create('Ext.data.Store',{
storeId:'userStore',
model:'User',
autoSync: true,
pageSize: pageSize,
fields:[{name : 'username', type : 'string'},
{name : 'email', type : 'string'},
{name : 'phone', type : 'string'}] ,
proxy: {
method: 'POST',
type: 'ajax',
url: 'entryActionToADUF!getEntryByPage.action',
//url: '../page/entry/grid.php',
reader: {
//数据格式为json
type: 'json',
root: 'myData',
//获取数据总数
totalProperty: 'totalRecord'
}
},
autoLoad:true
});
var grid = Ext.create('Ext.grid.Panel', {
store: store,
height: 300,
width: 480,
title: '日志列表',
renderTo: 'myGrid',
columns:[
{text:'姓名',width:168,dataIndex:'username'},
{text:'邮箱',width:168,dataIndex:'email'},
{text:'电话',flex : 1,dataIndex:'phone'}
],
bbar: Ext.create('Ext.PagingToolbar', {
store: store,
displayInfo: true,
displayMsg: '显示 {0} - {1} 条 共计 {2} 条',
emptyMsg: '没有日志'
})
});
store.loadPage(1);
});
struts.xml文件中的内容:
<package name="entry" extends="struts-default">
<action name="entryActionToADUF" class="entryActionBean">
<result name="entryGrid">/page/entry/myGrid.jsp</result>
</action>
</package>
问题描述:上面javascript中的store数据代理proxy中的url路径请求不到ACTION当中去,但如果改为“../page/entry/grid.php”时能正常访问grid.php中的JSON数据并正常显示。
为了让后面的网友少走弯路,我在这里讲下我是如何解决的以及解决此类问题的思路:
1、把代理数据中的url路径改为楼上所说的绝对路径(格式:http://localhost:8080/app/url );
2、把URL路径中的“XXX.action”改为“XXX.php”(XXX.php为php文件,将此文件内的所有内容全部删除,包括文件的头部等,只保留json数据,json数据格式如下:{start:0,limit:5,totalRecord:1,myData:[{"username":"luo","email":"AAA","phone":"15874288681"}]}),看是否能正常显示,如能,则EXTJS的JS代码是没有错的,极有可能是ACTION后台发生了ACTION错误,此时只需在ACTION中的重写Struts2中ActionSupport类的三个方法即可,此问题在下面再说;
3、在JSP页面用form表单、<a href="XX.action"></a>或者其它方式请求该URL路径,看是否能请求到ACTION后台,以检验URL路径的正确与否;
4、检查该路径是不是被其它什么拦截器给拦截了;
5、是笔者在本博客里要重点写的,如果是上面的第2点问题,那肯定是因为该URL请求到的后台ACTION发生了错误,而这种错误是ACTION级别的错误,不易发现,是因为请求到的后台ACTION的类中有属性的值为空,导致了ACTION级别的错误,而ActionSupport类中有个 public boolean hasErrors () 的方法, 它内部实现是这样的:(hasActionErrors() || hasFieldErrors()) ,会分别检查有无Action和Fidld级别的错误信息。所以只要让它检查不出Action和Fidld级别的错误即可,而解决此问题,只需重写ActionSupport类中的三个方法,参考代码如下:
public void addActionError(String actionError){
System.out.println("anErrorMessage:" + actionError);
}
public void addActionMessage(String actionMessage){
System.out.println("addActionMessage.aMessage:" + actionMessage);
}
public void addFieldError(String fieldName, String errorMessage){
System.out.println("addFieldError.fieldName:" + fieldName);
System.out.println("addFieldError.errorMessage:" + errorMessage);
}
只要不把ACTION级别的错误添加到ACTION当中,即检查不出Action级别的错误了,就能正常访问该ACTION了。
具体的有关该三个方法的信息可以查看源码,或到网上查找相关资料。