【问题标题】:How to call a method in Struts2 Action Class method with javascript如何使用javascript调用Struts2 Action Class方法中的方法
【发布时间】:2016-03-03 17:07:21
【问题描述】:

我们目前使用以下 javascript 在其中一个字段值更改时提交表单。

var url = "project/location/myAction.action?name="+ lname ; 
document.forms[0].action = url;
document.forms[0].submit();

调用以下 Struts2 动作

<action name="myAction" class="project.location.NameAction">
    <result name="success" type="tiles">myAction</result>   
</action>

然后转到 Action 类 NameActionexecute() 方法,我必须检查表单是否是从 javascript 提交的。

我更愿意直接从 javascript 调用 NameAction 中的 findName() 方法。换句话说,我希望 javascript 的行为类似于以下 jsp 代码。

<s:submit method="findName" key="button.clear" cssClass="submit" >

【问题讨论】:

  • 你知道这样的提交默认不起作用吗?
  • @Roman 你指的是javascript提交还是struts提交?
  • 如果你想让javascript像struts提交一样,你应该知道struts提交不应该有方法属性,请参阅下面的答案。你应该详细说明是什么意思。

标签: javascript jsp configuration struts2 struts-action


【解决方案1】:

有不同的方法来实现你想要的,但可能更简单的是将不同的动作映射到同一个动作类文件的不同方法,例如。带注释:

public class NameAction {

    @Action("myAction")
    public String execute(){ ... }

    @Action("myActionFindName")
    public String findName(){ ... }

}

或使用 XML:

<action name="myAction" class="project.location.NameAction">
    <result name="success" type="tiles">myAction</result>   
</action>

<action name="myActionFindName" class="project.location.NameAction" method="findName">
    <result name="success" type="tiles">myAction</result>   
</action>

然后在javascript中:

var url = "project/location/myActionFindName.action?name="+ lname ;

【讨论】:

  • 如果我使用不同的动作映射到同一个动作类,我会丢失任何已经输入的值吗?我需要 javascript 将我发送到同一页面,以便我可以保存任何输入的值,然后再执行其他操作来处理数据。我想像你展示的那样使用 XML,但我不知道我是否会丢失页面上已经输入的数据。
  • 绝对不行,这就是将同一个java文件共享给两个动作的好处:你共享所有的属性,getter和setter。你会发现(第二次登陆JSP,执行findName()之后)调用findName()之前在JSP页面中的所有属性,唯一缺少的是静态数据,比如选择框元素。但是,当发生验证或转换错误时,单个操作也会发生这种情况……这就是 prepare()(以及其他替代方法)的用途。阅读更多stackoverflow.com/a/25682007/1654265
  • 也不要使用DMI...即使仍然可以启用它,也要像瘟疫一样避免它。
  • 我正在进行的项目是由其他人设置的,所以我不确定我是否可以更改它。这是他在多年使用 Struts1 之后使用 Struts2 的第一个项目。如果您不使用 DMI,您会根据您的示例使用注释或 XML 来完成同样的事情吗?
  • 我是否应该避免同时使用&lt;s:url&gt; 标记的method 属性,而是将action 属性与xml 一起使用?
【解决方案2】:

你可以通过method属性使用相同的动作类来映射不同的方法

<action name="myAction" class="project.location.NameAction" method="findName">

默认情况下,method 属性如果省略则使用execute 方法。

这种方法需要更改动作名称,因此需要更改 URL 来映射动作。如果您想为不同的操作保留相同的 URL,那么您应该将方法名称作为参数传递给操作。然后在execute方法中解析这个参数为方法名,调用对应的方法。

当在以前的版本中启用DMI 来调用该方法时,您可以使用s:submit 标记的method 属性。目前method: 参数名称被params 拦截器阻止,即使它到达了动作映射器。

您还从How to exclude the submit action from a list of parameters in struts2 中了解了其他可能性。

【讨论】:

  • 我们目前按照您的建议解析执行方法,但如果可以的话,我想简化执行方法。我们一直使用 s:submit 标记的方法属性,它仍然在 Struts2 文档中列出,所以我一定不明白你关于参数名称被阻止的观点。
  • 如果你使用 s:submit 标签和方法属性,那么你应该启用 DMI。由于安全原因默认禁用 DMI 并且更改影响了 s:submit 标记的功能,如果禁用 DMI,则该标记不适用于方法属性。您可以发布struts.xml 以查看您的配置。
  • 我们确实启用了它。
  • 如果你开启了,那么你可以通过myAction.action!findName中包含的方法修改url
  • @ponder275 您是否找到了如何使用 DMI 或者您需要更多信息?如果您使用将方法映射到 url,则必须更改 url 以执行不同的操作,但是如果您正在执行 post 请求,则可以保持不变。
【解决方案3】:

为了完整起见,这里是我如何实施 Andrea 和 Roman 的建议。

当用户在firstNamelastName 字段中输入数据时,我们会向他们显示一个名称列表,供他们选择以填写表格的其余部分。这个jsp是

                <div class="row">
                <div class=" col-sm-2 col-xs-12 no-padding-right text-right"><span class="required">*</span><label class="pull-right" for="lastNameId"><s:text name="lastName"></s:text>:</label></div>             
                <div class=" col-sm-2 col-xs-12 no-padding-right ">
                    <s:textfield name="lastName"  id="lastNameId" maxlength="50" onchange ="dirtyFlag();" onblur="selectNameInfo(\'newRequest\');" class="form-control"/>
                </div>
                <div class=" col-sm-2 col-xs-12 no-padding-right text-right " ><span class="required">*</span><label class="pull-right" for="firstNameId"><s:text name="firstName"></s:text>:</label></div>             
                <div class=" col-sm-2 col-xs-12 no-padding-right ">
                    <s:textfield name="firstName" id="firstNameId" maxlength="50" onchange ="dirtyFlag();" onblur="selectNameInfo(\'newRequest\');" class="form-control"/>
                </div>   
            </div>      

javascript是

        function selectNameInfo(formId) {
        var lastName = document.forms[0].elements["lastNameId"].value;
        var firstName = document.forms[0].elements["firstNameId"].value;

        if(lastName != "" && firstName != ""){
        clearDirtyFlag(); 
        var oldAction = document.getElementById(formId).action;
        var actionName = document.getElementById(formId).name;
        var url = oldAction.replace(actionName,actionName+"_NameSearch");
            document.forms[0].action = url;
            document.forms[0].submit();
        };
    }

javascript 通过将“_NameSearch”添加到调用selectNameInfo() 函数的表单的action 来形成一个url。在这种情况下,新操作是 newRequest_NameSearch,它转到以下 xml,它调用操作类的 generateNameList() 方法,而不使用 DMI,这是我最初的问题。

    <action name="newRequest_NameSearch" class="gov.mo.dnr.egims.controller.evaluation.NewRequestAction" method = "generateNameList">           
        <result name="success" type="tiles">newRequest</result>
        <result name="nameSearch" type="tiles">selectNameInfo</result>
        <result name="error" type="tiles">error</result>            
    </action>

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2016-02-29
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多