1

我有一个 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 方法中时,我不知道如何区分按下了哪个按钮。我怎样才能做到这一点?

或者:我找到了这个关于如何做的答案,但我无法让它工作。它是否为我指明了正确的方向,我是否应该继续尝试那里给出的答案?

4

3 回答 3

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>
于 2013-06-14T05:54:55.593 回答
1

我已经成功实现了这种方式(在 liferay 6.1.2 和 FF 上测试)。我发现这篇文章非常有用!请注意函数名称:不能是“submitForm”!

<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>
于 2014-07-04T07:45:17.080 回答
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 代码中,我们只需使用一个开关来了解按下了哪个按钮并调用我们的不同函数:

String botonClicked= ParamUtil.getString(actionRequest, "botonClicked");

    switch (botonClicked) {
    case "Save":
        Guardar(actionRequest, actionResponse);
        break;
    case "Send":
        Enviar(actionRequest, actionResponse);
        break;
    default:
        break;
    }

对我来说,至少这个解决方案更干净,而且效果很好。

于 2018-08-24T10:10:25.663 回答