2013-11-18 4 views
4

У меня есть действие в struts.xmlМножественные точки входа в Struts действий (миграции Struts 2.2.3 -> 2.3.1)

<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"/> 

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

+0

Танки много! К сожалению, я мог бы попробовать это только завтра. Я дам вам немедленную обратную связь. Я не изменил конфигурацию. Мне интересно, что вы упоминаете «отключение DMI». Существует ли другое поведение по умолчанию? –

+0

По умолчанию DMI включен, что позволяет использовать специальный синтаксис в URL-адресе для выполнения других методов, кроме сопоставления с этим URL-адресом, и его использование использует тег submit. –

+0

Да! Большое спасибо! Работает как шарм. После того, как вы дали мне подсказку, я снова посмотрел на эту проблему. Кажется, DMI отключен по умолчанию по соображениям безопасности. Если бы мы не перенесли процесс миграции в Spring MVC, я бы теперь решил переключиться. –

0

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

Может быть, эта ссылка полезна из старых версий стойки для версии 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"; 
    } 
} 
Смежные вопросы