action方法调用的问题
老框架二次开发,出了一点问题,请高手解惑,先看代码:publicActionForwardexecute(ActionMappingmapping,ActionFormf...
老框架二次开发,出了一点问题,请高手解惑,先看代码:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,httpServletResponse response)throws Exception {
String method = request.getParameter("method");
if ("removeSong".equals(method)) {
return removeSong(mapping, form, request, response);
}
else{
return mapping.findForward("success");
}
public ActionForward removeSong(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
........
return mapping.findForward("removeSong");
}
这是我写的代码,觉得很奇怪吧,因为尽管继承了DispatchAction。但是还是无法通过method调用execute之外的方法,而是不管.do?meghod=什么都会进入execute。所以只能手动用if控制进入哪个方法了
问题一,为什么不能通过struts1默认的功能调用其他的方法?而是每次都进入execute,问题可能出在什么地方???
问题二,用断点和打印发现,每次通过if跳转到的第二个方法返回的mapping.findForward("removeSong");都会导致execute再被执行一次,所以第二个方法也会执行两次,而如果if不成立而执行execute方法则很正常的操作完返回findForward就结束了,这个问题让我百思不得其解,问题可能出现在什么地方? 展开
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,httpServletResponse response)throws Exception {
String method = request.getParameter("method");
if ("removeSong".equals(method)) {
return removeSong(mapping, form, request, response);
}
else{
return mapping.findForward("success");
}
public ActionForward removeSong(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
........
return mapping.findForward("removeSong");
}
这是我写的代码,觉得很奇怪吧,因为尽管继承了DispatchAction。但是还是无法通过method调用execute之外的方法,而是不管.do?meghod=什么都会进入execute。所以只能手动用if控制进入哪个方法了
问题一,为什么不能通过struts1默认的功能调用其他的方法?而是每次都进入execute,问题可能出在什么地方???
问题二,用断点和打印发现,每次通过if跳转到的第二个方法返回的mapping.findForward("removeSong");都会导致execute再被执行一次,所以第二个方法也会执行两次,而如果if不成立而执行execute方法则很正常的操作完返回findForward就结束了,这个问题让我百思不得其解,问题可能出现在什么地方? 展开
2015-08-08
展开全部
动态方法调用:
Struts2支持动态方法调用,它指的是一个Action中有多个方法,系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。
使用动态方法调用前必须设置Struts2允许动态方法调用,它是通过设置
struts.enable.DynamicMethodInvocation = true来完成的。
Struts2有多种方式实现动态方法调用(以下action请求的后缀均设置为do,而非默认的action):
(1). 修改页面Form的action请求方式
将页面上action的请求方式改为:action = “ActionName!MethodName.do”,示例:
Login.jsp
……
var contextPath = “<%=request.getContextPath()%>”;
<script type=”text/javascript”>
function dynamicMethodInvoke(){
document.forms[0].action = contextPath + “Login!dynamicMethod.do”;
document.forms[0].submit();
}
</script>
……
<input type=”button” value=”动态方法调用” onclick=”dynamoicMethodInvoke()”/>
……
当点击“动态方法调用”按钮时,执行dynamoicMethodInvoke方法,在此方法中修改提交的action为Login!dynamicMethod.do,它的意思是将表单提交给Login Action的dynamicMethod方法进行处理。
LoginAction.java
public class LoginAction {
……
public String dynamicMethod() throws Exception{
……
return “success”;
}
public String execute() throws Exception{
……
if (…){
return “error”;
}
……
return “success”
}
}
通过这种方式,可以在一个Action中包含多个方法,通过指定不同的action属性来提交给Action的不同方法进行处理。
对于使用动态方法调用的方法,它的声明与系统默认的execute方法的方法声明只有方法名不同,其他的如参数、返回值类型都必须相同。
Struts2支持动态方法调用,它指的是一个Action中有多个方法,系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。
使用动态方法调用前必须设置Struts2允许动态方法调用,它是通过设置
struts.enable.DynamicMethodInvocation = true来完成的。
Struts2有多种方式实现动态方法调用(以下action请求的后缀均设置为do,而非默认的action):
(1). 修改页面Form的action请求方式
将页面上action的请求方式改为:action = “ActionName!MethodName.do”,示例:
Login.jsp
……
var contextPath = “<%=request.getContextPath()%>”;
<script type=”text/javascript”>
function dynamicMethodInvoke(){
document.forms[0].action = contextPath + “Login!dynamicMethod.do”;
document.forms[0].submit();
}
</script>
……
<input type=”button” value=”动态方法调用” onclick=”dynamoicMethodInvoke()”/>
……
当点击“动态方法调用”按钮时,执行dynamoicMethodInvoke方法,在此方法中修改提交的action为Login!dynamicMethod.do,它的意思是将表单提交给Login Action的dynamicMethod方法进行处理。
LoginAction.java
public class LoginAction {
……
public String dynamicMethod() throws Exception{
……
return “success”;
}
public String execute() throws Exception{
……
if (…){
return “error”;
}
……
return “success”
}
}
通过这种方式,可以在一个Action中包含多个方法,通过指定不同的action属性来提交给Action的不同方法进行处理。
对于使用动态方法调用的方法,它的声明与系统默认的execute方法的方法声明只有方法名不同,其他的如参数、返回值类型都必须相同。
展开全部
这个是我的配置文件 多了一个 parameter="method"
<action attribute="userForm" name="userForm"
parameter="method" path="/user" scope="request"
type="cn.goldenbean.struts.action.xt.UserAction"
validate="false" />
访问的时候 user.do?method="XXX" 你要访问的方法
<action attribute="userForm" name="userForm"
parameter="method" path="/user" scope="request"
type="cn.goldenbean.struts.action.xt.UserAction"
validate="false" />
访问的时候 user.do?method="XXX" 你要访问的方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你既然用分发action了 怎么还这么写呢?
直接配置文件了parameters属性给个method 然后前台
*.do?method=removeSong 不就完事了 - - ?
是不parameters没设置 所以他去找默认的execute?
用分发 就不用些execute了 直接全改成想调用方法的名字就完了
直接配置文件了parameters属性给个method 然后前台
*.do?method=removeSong 不就完事了 - - ?
是不parameters没设置 所以他去找默认的execute?
用分发 就不用些execute了 直接全改成想调用方法的名字就完了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询