我有一个liferay portlet,其中包含一个简单的表单,用于输入两个数字并提交它们进行添加:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<portlet:defineObjects />
<portlet:actionURL var="calculateURL">
<portlet:param name="mvcPath" value="/html/calculator/edit.jsp" />
</portlet:actionURL>
<aui:form action="<%= calculateURL %>" method="post">
<aui:input label="x" name="x" type="text" value="${x}"/>
<aui:input label="y" name="y" type="text" value="${y}"/>
<aui:button type="submit" value="add"/>
</aui:form>
这很好用。我现在想添加一个按钮,允许我减去数字。但是当我添加新按钮时,我不知道如何区分按下哪个按钮,当我在我的processAction方法中时。我怎么能这样做?
或者:我已经找到this如何做到的答案,但我无法让它发挥作用。它是否指向了正确的方向,我应该继续尝试那里给出的答案吗?
答案 0 :(得分:2)
您可以在控制器类和jsp中根据单击的按钮设置两种不同的操作方法,相应地调用操作URL。查找下面的代码,根据点击的按钮更改表单操作。这有助于您在控制器类中保持业务逻辑分离。否则,您只能执行操作,然后将参数传递给操作以确定要执行的操作(添加或减去)
<portlet:actionURL var="subtractNumberURL">
</portlet:actionURL>
<portlet:actionURL var="addNumberURL">
<portlet:param name="mvcPath" value="/html/calculator/edit.jsp" />
</portlet:actionURL>
<script type="text/javascript" charset="utf-8">
function submitForm(action){
if(action==0){
A.one('<portlet:namespace/>form').set('action',"<%=addNumberURL%>");
}else{
A.one('<portlet:namespace/>form').set('action',"<%=subtractNumberURL%>");
}
}
</script>
<aui:form action="<%= addNumberURL%>" name="form" method="post">
<aui:input label="x" name="x" type="text" value="${x}"/>
<aui:input label="y" name="y" type="text" value="${y}"/>
<aui:button type="submit" value="add" onClick="submitForm(0)"/>
<aui:button type="submit" value="subtract" onClick="submitForm(1)"/>
</aui:form>
答案 1 :(得分:1)
我已成功实施此方法(在liferay 6.1.2和FF上测试)。 我发现this article非常有用! 考虑到功能名称:不得为&#34; submitForm&#34;!
<aui:script use="aui-base">
Liferay.provide(window, 'mysubmitForm', function(action) {
if(action=='add'){
A.one('#<portlet:namespace/>form').set('action','<%=addNumberURL.toString()%>');
}else{
A.one('#<portlet:namespace/>form').set('action','<%=subtractNumberURL.toString()%>');
}
});
</aui:script>
答案 2 :(得分:1)
个人而言,我更喜欢一个干净,简单的javascript解决方案,其中只有一个输入隐藏在HTML代码上,然后在操作中使用开关选择要执行的正确代码。 我使用Jquery,但是代码也可以在纯JavaScript上实现:
在表单内部,我们放置了一个隐藏变量,如下所示:
<aui:input name="botonClicked" id="botonClicked" type="hidden"></aui:input>
然后我们定义按钮,但使用“ type ='button'”,而不用“ type ='submit'”,例如:
<aui:button icon="icon-save" iconAlign="left" value="Save" type="button" cssClass="btn-primary buttonListener" name="Save"></aui:button>
<aui:button icon="icon-save" iconAlign="left" value="Send" type="button" cssClass="btn-primary buttonListener" name="Send"></aui:button>
然后使用简单的jquery,将按钮单击到隐藏的输入上并提交表单:
$(".buttonListener").click(function(){
var nombre = $(this).attr("name");
nombre = nombre.replace(namespace,'');
$("#botonClicked").val(nombre);
$("#OurForm").submit();
});
在您的Java代码中,在Action代码中,只需使用一个开关即可知道按下了“ wich”按钮并调用了我们的不同功能:
String botonClicked= ParamUtil.getString(actionRequest, "botonClicked");
switch (botonClicked) {
case "Save":
Guardar(actionRequest, actionResponse);
break;
case "Send":
Enviar(actionRequest, actionResponse);
break;
default:
break;
}
至少对我而言,此解决方案更干净,并且效果很好。