如何区分liferay中的多个提交按钮

时间:2013-06-13 13:05:26

标签: java html liferay submit-button

我有一个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如何做到的答案,但我无法让它发挥作用。它是否指向了正确的方向,我应该继续尝试那里给出的答案吗?

3 个答案:

答案 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;
    }

至少对我而言,此解决方案更干净,并且效果很好。