Несколько точек входа в действии Struts (Migration 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 кто -нибудь столкнулся с этим?Помощь приветствуется :]
Решение
Это происходит потому, что вы отключили DMI.А method
Атрибут работает с тегом отправки, как и раньше, даже после повторных исправлений безопасности.Включите 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";
}
}