Несколько действий в режиме редактирования Liferay MVC

Я использую следующий пример: https://github.com/liferay/liferay-blade-samples/blob/7.1/maven/apps/configuration-action/src/main/java/com/liferay/blade/samples/configurationaction/MessageDisplayConfigurationAction.java В моей форме есть несколько кнопок отправки. Я хотел бы обрабатывать их несколькими способами. Это возможно в портлете Spring MVC. Например, вы можете сделать это: Прикрепите событие onlclick кнопки к функции, которая выглядит следующим образом:

function <portlet:namespace />addGroup(){
    var url = "<portlet:actionURL portletMode='edit'><portlet:param name='action' value='addGroup'/></portlet:actionURL>";
    submitForm(document.<portlet:namespace />fm, url);
}

И в коде мы можем сделать так:

 @RequestMapping("EDIT")
    @ActionMapping(params = "action=addGroup")
    public void handleAddGroup(ActionRequest actionRequest, ActionResponse response) throws ResearchLibraryException, Exception {
        PortletPreferences preferences = actionRequest.getPreferences();
        // Add something to preferences
        preferences.store();
    }

Как сделать то же самое в Liferay MVC. Я хотел бы использовать несколько методов. Прямо сейчас я могу использовать только один метод и переключаться в зависимости от условия и идентифицировать разные щелчки.


person sarathchandra-0507    schedule 19.12.2019    source источник


Ответы (2)



В дополнение к хорошему ответу Яна: даже спецификация портлета позволяет вам иметь несколько методов действий со стандартизированной аннотацией. Это стало еще проще с портлетами LiferayMVC, поскольку вы даже можете опустить аннотацию и просто использовать имя метода в качестве имени действия:

// this is the action method defined by the portlet spec (2.0)
@ProcessAction(name="doSomething")
public void doSomething(ActionRequest request, ActionResponse response) {
    log.info("doSomething");
}

// this works in Liferay MVC, the method name is the action name
public void doSomethingElse(ActionRequest request, ActionResponse response) {
    log.info("doSomethingElse");
}

Вы создадите такие URL-адреса, например, в JSP:

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:actionURL name="doSomething" var="doSomethingURL" />
<a href="<%=doSomethingURL %>">do something</a>

<br/>

<portlet:actionURL name="doSomethingElse" var="doSomethingElseURL" />
<a href="<%=doSomethingElseURL %>">do something else</a>

Кроме того, вы можете создавать ActionCommands и RenderCommands, как упоминает Ян. Это еще больше разобьёт функциональность на отдельные классы. ИМХО, это предпочтительнее (поскольку это делает их независимыми друг от друга и меньше)

Условием для получения этой функциональности является не переопределение processAction, так как его реализация по умолчанию пытается найти аннотированные методы или методы с требуемым интерфейсом.

person Olaf Kock    schedule 20.12.2019