2013-05-08 7 views
5

Я следующее отображение действийПолучение Interceptor параметров в Struts 2

<action name="theAction" ...> 
... 
    <param name="param1">one</param> 
    <param name="param2">two</param> 
    ... 
    <param name="paramN">nth-number</param> 
... 
</action> 

я могу получить карту параметров, используя следующую строку в перехватчик

Map<String, Object> params = ActionContext.getContext().getParameters(); 

Так же, как и выше, есть ли способ, чтобы получить перехватчик параметры, как определено в следующем отображении.

<action name="theAction" ...> 
... 
    <interceptor-ref name="theInterceptor"> 
     <param name="param1">one</param> 
     <param name="param2">two</param> 
     ... 
     <param name="paramN">nth-number</param> 
    </interceptor-ref> 
... 
</action> 

И параметры действия определяются следующим образом, параметры действия и параметры перехватчика должны быть доступны отдельно.

<action name="theAction" ...> 
... 
    <param name="param1">one</param> 
    <param name="param2">two</param> 
    ... 
    <param name="paramN">nth-number</param> 
    .... 
    <interceptor-ref name="theInterceptor"> 
     <param name="param1">one</param> 
     <param name="param2">two</param> 
     ... 
     <param name="paramN">nth-number</param> 
    </interceptor-ref> 
... 
</action> 

Пожалуйста, обратите внимание, что я не хочу, чтобы объявить поля параметров в моем перехватчик, как

//all fields with their getters and setters 
private String param1; 
private String param2; 
... 
private String paramN; 

После asnwer Dev гасятся, я реализовал свой метод. Это не сработало, поэтому я делюсь своим кодом здесь. Я использую Struts 2.3.1.2.

Библиотеки

  • ASM-3.3.jar
  • ASM-Обще-3.3.jar
  • ASM-дерево-3.3.jar
  • Обще-FileUpload-1.2.2.jar
  • Обще-ю-2.0.1.jar
  • Обще-Ланг-2.5.jar
  • FreeMarker-2.3.18.jar
  • Javassist-3.11.0.GA.jar
  • OGNL-3.0.4.jar
  • struts2-ядро-2.3.1.2.jar
  • xwork-ядро-2,3 .1.2.jar

Struts.xml

<?xml version="1.0" encoding="UTF-8" ?> 

<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
    <constant name="struts.devMode" value="true" /> 

    <package name="the-base" namespace="/" extends="struts-default" abstract="true"> 

     <interceptors> 
      <interceptor name="header" class="demo.interceptors.HttpHeaderInterceptor"></interceptor> 

     <interceptor-stack name="theStack"> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
       <interceptor-ref name="header"></interceptor-ref> 
      </interceptor-stack> 
     </interceptors> 

     <default-interceptor-ref name="theStack"></default-interceptor-ref> 

    </package> 

    <package name="the-module" extends="the-base"> 
     <action name="theAction"> 
      <result>/the-action.jsp</result> 
      <interceptor-ref name="theStack"> 
       <param name="header.Cache-control">no-store,no-cache</param> 
       <param name="header.Pragma">no-cache</param> 
       <param name="header.Expires">-1</param> 
       <param name="header.arbitrary">true</param> 
      </interceptor-ref> 
     </action> 
    </package> 
</struts> 

перехватчик

package demo.interceptors; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 

import javax.servlet.http.HttpServletResponse; 

import org.apache.struts2.StrutsStatics; 

import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; 

public class HttpHeaderInterceptor extends AbstractInterceptor { 

    private final Map<String, String> interceptorConfigs = new HashMap<String, String>(); 

    @Override 
    public String intercept(ActionInvocation invocation) throws Exception { 
     System.out.println("Calling 'intercept' method."); 
     HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE); 

     for(Entry<String, String> entry: interceptorConfigs.entrySet()) { 
      String header = entry.getKey(); 
      String value = entry.getValue(); 
      System.out.printf("Adding header: %s=%s\n",header,value); 
      response.setHeader(header, value); 
     } 

     return invocation.invoke(); 
    } 

    public Map<String, String> getInterceptorConfigs() { 
     System.out.println("calling method 'getInterceptorConfigs'"); 
     return interceptorConfigs; 
    } 

    public void addInterceptorConfig(final String configName, final String configValue) { 
     System.out.printf("Calling method 'addInterceptorConfig' with params configName = %s, configValue=%.\n",configName, configValue); 
     interceptorConfigs.put(configName, configValue); 
    } 

} 

Console Output когда theAction ударил.

Calling 'intercept' method. 
+0

Возможно с параметром списка внутри перехватчика. Что-то вроде этого вопроса: http://stackoverflow.com/q/14474492/1700321. –

+0

Непонятно, чего вы пытаетесь достичь: | –

+0

@ Аndrea Ligios, я отредактировал мой вопрос. Однако моя цель - получить карту параметров, определенную внутри тела тега '. –

ответ

2

В пользовательском перехватчика можно определить карту, как показано ниже

private final Map<String, String> interceptorConfigs = new HashMap<String, String>(); 

public Map<String, String> getInterceptorConfigs() { 
    return interceptorConfigs; 
} 


public void addInterceptorConfig(final String configName, final String configValue) { 
    interceptorConfigs.put(configName, configValue); 
} 

Тогда в ваших отображений действий вы можете передать параметры, как показано ниже .. они будут сохранены в карте перехватчика

<action name="yourAction" class="your.actionClass"> 
     <result name="success">some.jsp</result> 
     <interceptor-ref name="defaultStack"> 
      <param name="yourInterceptor.interceptorConfigs.key">value</param> 
      <param name="yourInterceptor.interceptorConfigs.aParamName">paramValue</param>   </interceptor-ref> 
    </action> 

«yourInterceptor» относится к имени перехватчика, который вы указали при добавлении вашего перехватчика в struts.xml. Когда сконфигурировано, как указано выше, карта «interceptorConfigs» внутри перехватчика будет иметь пары ключ/значение.

Если вы хотите сделать их доступными для своего действия, вы можете просто установить карту в качестве контекстной переменной в ActionContext. Затем это можно восстановить внутри действия.

+0

Я пробовал, но это не сработало. Методы 'addInterceptorConfig' и/или' getInterceptorConfigs' не вызываются при выполнении запроса. Нужно ли мне реализовать какой-то интерфейс? –

+0

@BilalMirza эти методы будут вызываться при запуске приложения и при чтении struts.xml. Они не будут вызываться для каждого запроса. Параметры, указанные вами в сопоставлениях действий, будут оставаться неизменными для каждого запроса для этого конкретного действия. Struts будет хранить отдельные экземпляры перехватчиков для каждого сопоставления действий. –

+0

Я испытал, что эти методы все равно не вызываются. Более того, если Struts хранит отдельные экземпляры перехватчиков для каждого запроса, каждый экземпляр должен быть инициализирован для каждого экземпляра, и один из этих методов должен вызываться для установки 'interceptorConfigs'. Но согласно [этой ссылке] (http://www.bullraider.com/java/struts2/tutorials/struts2-interceptor-life-cycle), перехватчики создаются один раз, а не для запроса eache. Не могли бы вы объяснить мне это? –

1

Чтобы быть кратким, я скажу нет, вы не можете получить параметры перехватчиков, если вы определили их в interceptor-ref элементе. Параметры устанавливаются и применяются к перехватчику во время сборки.Однако, если вы поставите параметры в interceptor элемент как

<interceptor name="theInterceptor" class="com.struts.interceptor.TheInterceptor"> 
    <param name="param1">one</param> 
    <param name="param2">two</param> 
</interceptor> 

вы можете получить их на лету

PackageConfig packageConfig = Dispatcher.getInstance().getConfigurationManager().getConfiguration().getPackageConfig("default"); 
Map<String, Object> interceptorConfigs = packageConfig.getInterceptorConfigs(); 
InterceptorConfig interceptorConfig = (InterceptorConfig)interceptorConfigs.get("theInterceptor"); 
Map<String, String> params = interceptorConfig.getParams(); 

Если вы не хотите, чтобы определить свойства на перехватчик для хранения значений, то OGNL не будет устанавливать значения, но будет пытаться, поэтому я не вижу причин не определять эти свойства, конфигурация xml помечена как недопустимая, если ваш компонент перехватчика не содержит этих свойств, а построитель может вызвать исключение в этом случае. Поэтому, не определяя свойства для параметров, я не рекомендую.

+0

Я пробовал, но я получаю 'interceprotConfigs' пустым. В результате «inteptorConfig» обнаружен нуль и NullPointerException выбрасывается при получении «params». Я поставил свой перехватчик на последнюю позицию в стеке по умолчанию. Я сопоставил имя перехватчика от кода и конфигурации перехватчика (struts.xml). Что я упустил? –

+0

У вас пусто, потому что вы не указали имя пакета, используемого для сопоставления вашего перехватчика. Итак, мне нужно было подставить фиктивное имя, то же самое с другим именем перехватчика, потому что вы не отправили код для настройки перехватчика, который мне нужен. Имя пакета '' по умолчанию ''вам нужно поместить его в' struts.xml'. –

+0

Я изменил имя пакета и имя перехватчика в соответствии с моим кодом. Я получаю 'packageConfig' с правильной конфигурацией, как я определил в' struts.xml'. Это означает, что имя пакета указано правильно. Интересно, почему я не получаю 'interceptorConfigs'. –

Смежные вопросы