extjs 是否可以在同一操作中使用多种方法?

ar7v8xwq  于 2022-11-04  发布在  其他
关注(0)|答案(3)|浏览(167)

我正在使用Struts 2(2.5.10.1)和struts2-json-plugin-2.5.10.1。在我的页面上,我有一个使用ExtJs 4.2.2的网格,其中将填充项目,每行将有两个操作:editdelete中的一个或多个。
我所遇到的问题是:如果我尝试从同一个操作使用多个方法来完成上述所有操作,当我尝试填充网格时,我没有得到JSON响应。我尝试做的事情是否可能?(editdelete功能还没有实现)

这是我的struts.xml

<package name="admin" extends="json-default">

    <action name="requestProjectData"
        class="administrator.ACTION_ProjectsGrid"
        method="requestProjectData">
        <result type="json" >
            <param name="root">projectData</param>
        </result>
    </action>

    <action name="requestDeleteProject"
        class="administrator.ACTION_ProjectsGrid"
        method="deleteProject">
        <result type="json" >
            <param name="root">success</param>
        </result>
    </action>

    <action name="requestEditProject"
        class="administrator.ACTION_ProjectsGrid"
        method="editProject">
        <result type="json" >
            <param name="root">success</param>
        </result>
    </action>

这是我的Action类:

public class ACTION_ProjectsGrid extends ActionSupport {

private static final long serialVersionUID = 1L;

private List<Project> projectData;
private boolean success;

public void requestProjectData()
{
    ProjectManager pm = new ProjectManager();
    List<Project> listOfProjects = pm.getAllProjects();
    projectData = listOfProjects;
}

public void deleteProject()
{
    success = true;
}

public void editProject()
{
    success = true;
}

public List<Project> getProjectData() {
    return projectData;
}

public void setProjectData(List<Project> projectData) {
    this.projectData = projectData;
}

public boolean isSuccess() {
    return success;
}

public void setSuccess(boolean success) {
    this.success = success;
}

}

和我的JSP页面:

<body>
<script type="text/javascript">
    Ext.define('Project', {
        extend: 'Ext.data.Model',
        fields: [ 'projectId', 'projectName' ]
    });

    var projStore = Ext.create('Ext.data.Store', {
        model: 'Project',
        proxy: {
            type: 'ajax',
            pageParam: false,
            startParam: false,
            limitParam: false,
            noCache: false,
            url: 'requestProjectData',
            reader: {
                type: 'json'
            }
        },
        autoLoad: true
    });

    Ext.create('Ext.grid.Panel', {
        renderTo: Ext.getBody(),
        store: projStore,
        width: 641,
        height: 300,
        title: 'Projects',
        columns: [
            {
                text: 'ID',
                width: 80,
                dataIndex: 'projectId'
            },
            {
                text: 'Project Name',
                width: 80,
                dataIndex: 'projectName'
            },
            {
                xtype: 'actioncolumn',
                width: 80,
                items: [{
                    icon: '${pageContext.request.contextPath}/JavaScript/extjs/resources/user_edit.png',
                    tooltip: 'Edit',
                    handler: function(grid, rowIndex, colIndex) {
                        var rec = grid.getStore().getAt(rowIndex);
                        Ext.Ajax.request({
                            url: 'requestDeleteProject',
                            disableCaching: false,
                            params: {
                                projectId: rec.get("projectId").toString(), 
                                },
                            success: function(response)
                            {
                                grid.getStore().load();
                            }
                            });
                        }
                }]
            }
        ]
    });
</script>
</body>
njthzxwz

njthzxwz1#

Ext.Ajax.request({
       url: 'requestDeleteProject',
       disableCaching: false,
       params: {
            projectId: rec.get("projectId").toString(), 
       },
       success: function(response){
            grid.getStore().load();
       }
  });}

在你提出请求的那一部分...你应该解码成功里面的“响应”,然后把数据加载到你的存储中;您正在进行另一个请求,您想要的请求类似于

var json = Ext.decode(response.wtv..);

然后加载网格的存储,如下所示

grid.getStore().loadData(json);

非常喜欢

success: function(response){
    var json = Ext.decode(response.wtv..); 
    grid.getStore().loadData(json);
}
ao218c7q

ao218c7q2#

我发现了这个问题。要使这个解决方案起作用,所有的方法都必须像execute方法一样创建。在我将返回类型改为String并返回ActionSupport.SUCCESS之后,json响应出现了。但是我仍然不知道这个解决方案是正确的还是我违反了一些规则,有人能给我解释一下吗?

chhkpiq4

chhkpiq43#

如果定义了Map到操作类方法的操作,则该方法应返回StringResultActionSupport类为操作类提供了默认实现。
除此之外,它还通过拦截器实现了许多涉及附加功能的接口。其中一个接口是Action。它是一个函数接口,只有一个方法execute(),如果没有方法Map到该操作,默认情况下将调用该方法。
从操作方法返回的值是 result code。此代码或Result是Struts在执行操作后继续响应所必需的。因此,结果代码将返回给调用程序(ActionInvocation),它查找并执行与操作配置中定义的名称相同的结果。默认结果name是可以从操作返回的Action.SUCCESSActionSupport.SUCCESS。在隐式或显式定义名为"success"的结果的操作配置中应该有结果。
"success"结果是在您的配置中默认定义的,因为它缺少name属性。因此,要执行此结果,您应该返回相同字符串的"success"Action.SUCCESSActionSupport.SUCCESS
Result Configuration中查看更多信息。
当一个操作类方法完成时,它返回一个String。字符串的值用于选择结果元素。一个操作Map通常会有一组表示不同可能结果的结果。一组标准的结果标记由ActionSupport基类定义。预定义的结果名称

String SUCCESS = "success";
String NONE    = "none";
String ERROR   = "error";
String INPUT   = "input";
String LOGIN   = "login";

当然,应用程序可以定义其他结果标记来匹配特定的情况。

相关问题