我可以在同一个动作中使用多种方法吗?
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 的网格,该网格将填充项目,每行将有两个操作: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>
这是我的操作 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 String
或 Result
。 ActionSupport
class 为您提供操作 class.
的默认实现
除此之外,它还通过拦截器实现了很多涉及附加功能的接口。其中一个接口是 Action
。它是一个功能接口,只有一个方法 execute()
如果没有方法映射到操作,默认情况下会调用该方法。
从操作方法return编辑的值是结果代码。此代码或 Result
是 Struts 在执行操作后继续响应所必需的。因此,结果代码被 returned 到调用程序 (ActionInvocation
),调用程序查找并执行与操作配置中定义的名称相同的结果。默认结果 name
是 Action.SUCCESS
或 ActionSupport.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.
我正在使用 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>
这是我的操作 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 String
或 Result
。 ActionSupport
class 为您提供操作 class.
除此之外,它还通过拦截器实现了很多涉及附加功能的接口。其中一个接口是 Action
。它是一个功能接口,只有一个方法 execute()
如果没有方法映射到操作,默认情况下会调用该方法。
从操作方法return编辑的值是结果代码。此代码或 Result
是 Struts 在执行操作后继续响应所必需的。因此,结果代码被 returned 到调用程序 (ActionInvocation
),调用程序查找并执行与操作配置中定义的名称相同的结果。默认结果 name
是 Action.SUCCESS
或 ActionSupport.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 theActionSupport
base class. Predefined result namesString 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.