Несколько точек входа в действии Struts (Миграция Struts 2.2.3 -> 2.3.1)

У меня есть действие в Struts.xml

<action name="reprint" class="reprintAction">
        <result name="success" type="redirectAction">
            <param name="actionName">reprint</param>
            <param name="namespace">/x</param>
            <param name="errorFlag">${errorFlag}</param>
            <param name="message">${message}</param>
        </result>
        <result name="view">/jsp/reprintOverview.jsp</result>
</action>

JSP:

<s:form action="reprint">
    <s:select name="selectedPdfPrinter" list="shopPdfPrinterList" listKey="deviceId" listValue="deviceId" theme="simple"/>
    <s:submit value="Print" theme="simple" method="shopPdfReprint"/>
</s:form>

с несколькими элементами формы, все связаны с одним действием. Каждая форма имеет отдельную кнопку отправки с отдельным method (например, "shopPdfReprint"). каждый method отображается на метод в соответствующем классе.

Все отлично работает со Struts 2.2.3. Но после перехода на 2.3.1 метод-мэппинг не работает. Вместо вызова соответствующего метода (например, "shopPdfReprint"), только executeметод класса вызывается.

Я посмотрел на Документы, но, к сожалению, не нашел подсказки, как адаптироваться к 2.3.1 Кто-нибудь сталкивался с этим? Помощь приветствуется:]

2 ответа

Решение

Это происходит потому, что вы отключили DMI. method Атрибут работает с тегом submit, как и раньше, даже после повторной отправки исправлений безопасности. Включить DMI используя константу

<constant name="struts.enable.DynamicMethodInvocation" value="true"/> 

дайте мне знать, если это не сработало.

Если кто-то перемещается или работает над Struts 2.5, ему не нужно отображать действия с использованием struts.xml. Strtus 2.5 основан на аннотациях, поэтому в классе действий разработчик может отобразить несколько действий в одном классе с помощью аннотации.

Может быть, эта ссылка полезна со старых версий Struts до версии Struts 2.5.

https://struts.apache.org/docs/struts-23-to-25-migration.html

Ниже приведен простой демонстрационный код.

package com.stsh.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;
import com.stsh.intercepter.AuthRequired;

@ParentPackage(value="default")
@Namespace(value="/dashboard")
public class DashboardAction extends ActionSupport implements AuthRequired{

    private static final long serialVersionUID = 1L;

    @Action(value = "home", results = { @Result(name = "success", location = "dashboard.tiles", type = "tiles") })
    public String dashboard(){
        return "success";
    }
}
Другие вопросы по тегам