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

Can I use multiple methods in the same action?

我正在使用 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>

这是我的操作 class:

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>
Ext.Ajax.request({
       url: 'requestDeleteProject',
       disableCaching: false,
       params: {
            projectId: rec.get("projectId").toString(), 
       },
       success: function(response){
            grid.getStore().load();
       }
  });}

在那部分你提出你的请求...你应该在成功中解码 "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);
}

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

如果您定义映射到操作 class 方法的操作,该方法应该 return StringResultActionSupport class 为您提供操作 class.

的默认实现

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

从操作方法return编辑的值是结果代码。此代码或 Result 是 Struts 在执行操作后继续响应所必需的。因此,结果代码被 returned 到调用程序 (ActionInvocation),调用程序查找并执行与操作配置中定义的名称相同的结果。默认结果 nameAction.SUCCESSActionSupport.SUCCESS,您可以从操作中 return。在操作配置中应该有一个结果,它隐式或显式地定义了一个名称为 "success".

的结果

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


Result Configuration 中查看更多信息。

When an action class method completes, it returns a String. The value of the String is used to select a result element. An action mapping will often have a set of results representing different possible outcomes. A standard set of result tokens are defined by the ActionSupport base class. Predefined result names

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

Of course, applications can define other result tokens to match specific cases.