SSH+ExtJS4的整合问题的解决思路

本文详细介绍了使用ExtJS4框架时遇到的AJAX请求无法到达Struts2后台的问题,并提供了解决步骤及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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了。

具体的有关该三个方法的信息可以查看源码,或到网上查找相关资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值