我正在使用Struts 2(2.5.10.1)和struts2-json-plugin-2.5.10.1。在我的页面上,我有一个使用ExtJs 4.2.2的网格,其中将填充项目,每行将有两个操作:edit
和delete
中的一个或多个。
我所遇到的问题是:如果我尝试从同一个操作使用多个方法来完成上述所有操作,当我尝试填充网格时,我没有得到JSON响应。我尝试做的事情是否可能?(edit
和delete
功能还没有实现)
这是我的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>
3条答案
按热度按时间njthzxwz1#
在你提出请求的那一部分...你应该解码成功里面的“响应”,然后把数据加载到你的存储中;您正在进行另一个请求,您想要的请求类似于
然后加载网格的存储,如下所示
非常喜欢
ao218c7q2#
我发现了这个问题。要使这个解决方案起作用,所有的方法都必须像execute方法一样创建。在我将返回类型改为String并返回ActionSupport.SUCCESS之后,json响应出现了。但是我仍然不知道这个解决方案是正确的还是我违反了一些规则,有人能给我解释一下吗?
chhkpiq43#
如果定义了Map到操作类方法的操作,则该方法应返回
String
或Result
。ActionSupport
类为操作类提供了默认实现。除此之外,它还通过拦截器实现了许多涉及附加功能的接口。其中一个接口是
Action
。它是一个函数接口,只有一个方法execute()
,如果没有方法Map到该操作,默认情况下将调用该方法。从操作方法返回的值是 result code。此代码或
Result
是Struts在执行操作后继续响应所必需的。因此,结果代码将返回给调用程序(ActionInvocation
),它查找并执行与操作配置中定义的名称相同的结果。默认结果name
是可以从操作返回的Action.SUCCESS
或ActionSupport.SUCCESS
。在隐式或显式定义名为"success"
的结果的操作配置中应该有结果。"success"
结果是在您的配置中默认定义的,因为它缺少name
属性。因此,要执行此结果,您应该返回相同字符串的"success"
、Action.SUCCESS
或ActionSupport.SUCCESS
。在Result Configuration中查看更多信息。
当一个操作类方法完成时,它返回一个
String
。字符串的值用于选择结果元素。一个操作Map通常会有一组表示不同可能结果的结果。一组标准的结果标记由ActionSupport
基类定义。预定义的结果名称当然,应用程序可以定义其他结果标记来匹配特定的情况。