我可以在同一个动作中使用多个方法吗?

时间:2017-05-28 10:21:06

标签: java json extjs struts2

我是网络开发的初学者,我正在尝试做一个小项目。我使用struts2(2.5.10.1)和struts2-json-plugin-2.5.10.1。在我的页面上,我有一个使用ExtJs 4.2.2的网格,它将填充项目,每行将有两个动作:编辑和删除。我遇到的问题是,如果我尝试使用同一个动作中的多个方法来完成上述所有操作,当我尝试填充网格时,我得不到json响应。我想做什么甚至可能? (编辑和删除功能尚未实现)

这是我的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>

这是我的动作类:

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>

3 个答案:

答案 0 :(得分:0)

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

在你发出请求的那一部分里面......你应该解码成功中的“响应”并将数据加载到你的商店之后;制作grid.getStore().load() 您正在提出您想要的另一个请求

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

然后你想加载网格的商店,如

grid.getStore().loadData(json); 

soo like

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

答案 1 :(得分:0)

我发现了问题。要使此解决方案起作用,必须像执行方法一样创建所有方法。在我将返回类型更改为String并返回ActionSupport.SUCCESS之后,出现了json响应。但我仍然不知道这个解决方案是否正确,或者我违反了一些规则,有人可以向我解释这个吗?

答案 2 :(得分:0)

如果定义映射到操作类方法的操作,则该方法应返回StringResultActionSupport类为您提供了操作类的默认实现。

除此之外,它还通过拦截器实现了许多涉及附加功能的接口。其中一个接口是Action。它是一个只有一个方法execute()的函数接口,如果没有方法映射到该操作,则默认情况下会调用该方法。

从action方法返回的值是结果代码。执行操作后,Struts必须执行此代码或Result。因此,结果代码将返回给调用者(ActionInvocation),调用者查找并执行在操作配置中定义的相同名称的结果。您可以从操作返回的默认结果nameAction.SUCCESSActionSupport.SUCCESS。应该导致动作配置隐式或显式定义名称为"success"的结果。

您的配置中默认定义了"success"结果,因为它缺少name属性。因此,要执行此结果,您应该返回相同字符串的"success"Action.SUCCESSActionSupport.SUCCESS

请参阅Result Configuration

中的详情
  

当动作类方法完成时,它返回String。该   String的值用于选择结果元素。一种行为   映射通常会有一组代表不同的结果   可能的结果。一组标准的结果标记由   ActionSupport基类。预定义的结果名称

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

当然,应用程序可以定义其他结果令牌以匹配   具体案例。