如何使用 javascript 在 Struts2 操作 Class 方法中调用方法
How to call a method in Struts2 Action Class method with javascript
我们目前使用以下 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>
然后转到操作 class NameAction
的 execute()
方法,我必须在其中检查表单是否是从 javascript 提交的。
我更愿意直接从 javascript 调用 NameAction
中的 findName()
方法。换句话说,我希望 javascript 像下面的 jsp 代码一样工作。
<s:submit method="findName" key="button.clear" cssClass="submit" >
您可以使用相同的操作 class 来映射使用 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 中的其他可能性。
有不同的方法可以实现你想要的,但可能更简单的是将不同的动作映射到同一动作 class 文件的不同方法,例如。带注释:
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 ;
为了完整起见,这里是我如何实施 Andrea 和 Roman 的建议的。
当用户在 firstName
和 lastName
字段中输入数据时,我们会向他们显示一个名称列表,供他们选择以填写表单的其余部分。 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,它调用操作 class 的 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>
我们目前使用以下 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>
然后转到操作 class NameAction
的 execute()
方法,我必须在其中检查表单是否是从 javascript 提交的。
我更愿意直接从 javascript 调用 NameAction
中的 findName()
方法。换句话说,我希望 javascript 像下面的 jsp 代码一样工作。
<s:submit method="findName" key="button.clear" cssClass="submit" >
您可以使用相同的操作 class 来映射使用 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 中的其他可能性。
有不同的方法可以实现你想要的,但可能更简单的是将不同的动作映射到同一动作 class 文件的不同方法,例如。带注释:
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 ;
为了完整起见,这里是我如何实施 Andrea 和 Roman 的建议的。
当用户在 firstName
和 lastName
字段中输入数据时,我们会向他们显示一个名称列表,供他们选择以填写表单的其余部分。 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,它调用操作 class 的 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>