我是网络开发的初学者,我正在尝试做一个小项目。我使用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>
答案 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)
如果定义映射到操作类方法的操作,则该方法应返回String
或Result
。 ActionSupport
类为您提供了操作类的默认实现。
除此之外,它还通过拦截器实现了许多涉及附加功能的接口。其中一个接口是Action
。它是一个只有一个方法execute()
的函数接口,如果没有方法映射到该操作,则默认情况下会调用该方法。
从action方法返回的值是结果代码。执行操作后,Struts必须执行此代码或Result
。因此,结果代码将返回给调用者(ActionInvocation
),调用者查找并执行在操作配置中定义的相同名称的结果。您可以从操作返回的默认结果name
为Action.SUCCESS
或ActionSupport.SUCCESS
。应该导致动作配置隐式或显式定义名称为"success"
的结果。
您的配置中默认定义了"success"
结果,因为它缺少name
属性。因此,要执行此结果,您应该返回相同字符串的"success"
,Action.SUCCESS
或ActionSupport.SUCCESS
。
当动作类方法完成时,它返回
String
。该 String的值用于选择结果元素。一种行为 映射通常会有一组代表不同的结果 可能的结果。一组标准的结果标记由ActionSupport
基类。预定义的结果名称String SUCCESS = "success"; String NONE = "none"; String ERROR = "error"; String INPUT = "input"; String LOGIN = "login";
当然,应用程序可以定义其他结果令牌以匹配 具体案例。