如何使用javascript调用Struts2 Action类方法中的方法
当其中一个字段值更改时,我们当前使用以下javascript提交表单如何使用javascript调用Struts2 Action类方法中的方法,javascript,jsp,configuration,struts2,struts-action,Javascript,Jsp,Configuration,Struts2,Struts 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.N
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类使用
method
属性映射不同的方法
<action name="myAction" class="project.location.NameAction" method="findName">
在以前的版本中启用了来调用方法,您可以使用s:submit
标记的方法
属性。当前,方法:
参数名被params
拦截器阻止,即使它到达动作映射器
您还可以从中阅读其他可能性。有不同的方法来实现您想要的,但可能更简单的方法是将不同的操作映射到同一操作类文件的不同方法,例如,使用注释:
public class NameAction {
@Action("myAction")
public String execute(){ ... }
@Action("myActionFindName")
public String findName(){ ... }
}
或使用XML:
我的行动
我的行动
然后在javascript中:
var url=“项目/位置/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通过在调用selectNameInfo()
函数的表单的action
中添加“\u NameSearch”来形成url。在本例中,新操作是newRequest\u NameSearch
,它转到以下xml,该xml调用action类的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>
新请求
选择名称信息
错误
你知道这样的提交在默认情况下不起作用吗?@Roman你指的是javascript提交还是struts提交?如果你想让javascript像struts提交一样,你应该知道struts提交不应该有method属性,请参阅下面我的回答。你应该详细说明你所说的“像”是什么意思。如果我使用不同的动作映射到同一个动作类,我会丢失任何已经输入的值吗?我需要javascript将我发送到同一页面,这样我就可以在执行其他操作处理数据之前保存任何输入的值。我曾想过使用如您所示的XML,但我不知道是否会丢失页面上已经输入的数据。绝对不会,这就是将同一java文件共享给两个操作的好处:共享所有属性,即getter和setter。您将发现(在执行findName()
之后第二次登录JSP时)在调用findName()
之前JSP页面中的所有属性,唯一缺少的是静态数据,如选择框元素。但当验证或转换错误发生时,这也会发生在单个操作中。。。这就是prepare()
(以及其他替代方法)的用途。阅读更多信息也不要使用DMI。。。即使仍然可以启用它,也要像避免瘟疫一样避免它。我正在进行的项目是由其他人设置的,所以我不确定是否可以更改它。这是他在使用Struts1多年后的第一个Struts2项目。如果您不使用DMI,您是否会根据您的示例使用注释或XML来完成相同的任务?我是否应该避免同时使用
标记的方法
属性,而是将操作
属性与XML一起使用?我们目前按照您的建议在execute方法中进行解析,但我希望简化execute方法如果可以的话。我们一直使用s:submit标记的method属性,但它仍然列在Struts2文档中,因此我一定不理解您关于被阻止的参数名称的观点。如果您使用s:submit标记的method属性,则应该启用DMI。由于安全原因,DMI在默认情况下被禁用,并且更改影响了s:submit标记的功能,如果DMI被禁用,则该标记与method属性不起作用。您可以发布struts.xml
来查看您的配置。我们确实启用了它。如果您启用了它,那么您可以使用包含的myAction.action方法修改url!findName
@Pounder275您找到如何使用DMI了吗?或者您需要更多信息吗?如果使用将方法映射到url,则必须更改url以执行不同的操作,但是如果执行post请求,则可以保持相同。
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();
};
}
<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>