2011-10-08 48 views
1

我遇到下面的代码有问题,任何人都可以解释为什么该方法可能不会被激发jobListAction?提交表单后,“安装程序”会被调用两次。总之,我似乎无法使用struts按钮来调用多个方法。任何指针/要检查的东西?Struts2提交按钮方法调用不会触发

public class JobListAction { 
    public String execute() { 
     System.out.println("setup"); 
    } 

    public String deactivate() { 
     System.out.println("called"); 
    } 
    public String callonme() 
    { 
    } 
} 

JSP:

<s:form id="recordsListForm" method="post" action="jobList"> 
<s:submit type="button" action="deactivate" value="Deactivate Selected Jobs" method="deactivate" /> 
<s:submit type="button" action="callonme" value="CallonMe" method="callonme" /> 

</s:form> 

struts.xml的

<!-- Job List --> 
    <action name="jobList" class="JobListAction"> 
     <result name="input">/jsp/admin/jobList.jsp</result> 
     <result name="success">/jsp/admin/jobList.jsp</result> 
    </action> 

    <!-- Job List - Deactivate Job --> 
    <action name="deactivate" class="JobListAction" method="deactivate"> 
     <result name="input">/jsp/admin/jobList.jsp</result> 
     <result name="success">/jsp/admin/jobList.jsp</result> 
    </action> 

    <action name="callonme" class="JobListAction" method="callonme"> 
     <result name="input">/jsp/admin/jobList.jsp</result> 
     <result name="success">/jsp/admin/jobList.jsp</result> 
    </action> 
+1

再一次,所有这些都不应该是必须的.​​.....并且不起作用,因为现在你对同一个URL有一堆定义:它如何知道def哪个动作需要调用“/ jobList”?操作名称必须是唯一的,因为它是用来确定要调用的操作/方法的。 –

+0

@DaveNewton - 尝试了一个替代解决方案,该行动具有唯一名称,并指定了提交操作方法。仍然没有果汁。 – Paul

+0

如果没有我在回答中询问的信息,我不知道如何提供帮助 - 并不是要求占用空间。但是现在你在*提交按钮*和*动作配置中定义了方法,并且我怀疑它会起作用,尽管我从未尝试过,因为它是多余的。 –

回答

2

我想在Struts 2 u需要告诉在struts.xml中文件的方法名,尝试了这一点,我希望它的作品...

<action name="jobList" class="JobListAction" method = "deactivate"> 
    <result name="input">/jsp/admin/jobList.jsp</result> 
    <result name="success">/jsp/admin/jobList.jsp</result> 
</action> 
+0

你的传说。看起来确实需要在struts文件中定义的方法。通过“多种方法”,我的意思是我需要在同一页面上提供几个提交按钮,并与不同的方法进行交谈,但希望首先使其工作。 – Paul

+1

@Paul不,它*不需要在Struts文件中定义的方法。它*工作*,但不是必需的。 –

+0

在这个特定的实例中,Action已经有了相同的XML声明。因此,按照您所写的定义(我猜测)已经重写了最初的声明,并因此调用了该方法。但是,嘿,如果它有效,它就可以工作! – Paul

1

适合我的工作;什么版本?是否启用动态方法调用(默认情况下)?

你是什么意思“致电多重方法?”每个请求只能调用一个方法。

我的标准输出:

setup // On initial form display 
called // Clicking submit 

(或多或少)逐字剪切和粘贴代码。

2

如果你想有一个单一的行动声明,可以调用相同的动作类的多个方法,考虑使用wilcard mappings

查看

<s:form id="recordsListForm" method="post" action="jobList"> 
    <s:submit type="button" action="jobList_deactivate" value="Deactivate Jobs" /> 
    <s:submit type="button" action="jobList_callonme" value="CallonMe" /> 
</s:form> 

struts.xml的

<!-- Job List --> 
<action name="jobList_*" method="{1}" class="JobListAction"> 
    <result name="input">/jsp/admin/jobList.jsp</result> 
    <result name="success">/jsp/admin/jobList.jsp</result> 
</action> 

上述映射将匹配任何actionjobList_开头,然后使用匹配的其余部分作为在JobListAction类中调用的方法。

+0

当然可以使用,但不必*使用动态方法调用。另外,您不需要使用此设置提交按钮中的“方法”属性;行动名称应该足够,不是? –

+0

@DaveNewton良好的捕获,删除提交按钮上的'方法'属性。 – Pat