Почему перехватчик прерывает подстановочный знак в Struts 2?
У меня есть это действие с подстановочными знаками:
@Namespace("/posts")
public class SearchPostBeansAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(SearchPostBeansAction.class);
@Override
@Actions({
@Action(value="/{search1}/{param1}/",results={
@Result(name=ACTION_SUCCESS,location="classic.main.general", type="tiles")})
})
public String execute() throws Exception {
logger.info("Action: " + getInvocatedURL() );
String forward = SUCCESS;
logger.info("getSearch1( " + getSearch1() + " )");
logger.info("getParam1( " + getParam1() + " )");
return forward;
}
}
Результат выполнен:
INFO (com.silver.front.view.actions.SearchPostBeansAction) - Действие:/ posts / category / cars /
ИНФО (com.silver.front.view.actions.SearchPostBeansAction) -
getSearch1(категория)ИНФО (com.silver.front.view.actions.SearchPostBeansAction) -
getParam1(автомобили)
Если я перехватываю это действие:
@InterceptorRef("seoFilter")
@Namespace("/anuncios")
public class SearchPostBeansAction extends ActionSupport{
private static final long serialVersionUID = 1L;
...
}
Результат выполнен:
INFO (com.silver.front.view.actions.SearchPostBeansAction) - Действие:/ posts / category / cars /
ИНФО (com.silver.front.view.actions.SearchPostBeansAction) -
getSearch1(null)ИНФО (com.silver.front.view.actions.SearchPostBeansAction) -
getParam1(null)
Lost Почему потеряли параметры подстановочных знаков?
Вот это перехватчик:
public class SEOFilter implements Interceptor{
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(SEOFilter.class);
ActionSupport actionSupport = null;
public String intercept(ActionInvocation invocation) throws Exception {
actionSupport = (ActionSupport) invocation.getAction();
actionSupport.execute();
}
}
3 ответа
Это потому, что вы обходите все перехватчики в стеке перехватчиков.
Использовать Interceptor
тебе нужно позвонить invocation.invoke()
поручить распоряжениям продолжить обработку запроса до конца Interceptor
стек.
Вы вручную вызываете действие, тем самым обходя стек перехватчиков.
public String intercept(ActionInvocation invocation) throws Exception {
return invocation.invoke;
}
Ошибка вы применили @InterceptorRef("seoFilter")
к классу действий и, как вы должны знать по соглашению, он применяется ко всем действиям в классе. Удалите это, и если вы хотите добавить пользовательский перехватчик к действию, используйте @Action
аннотаций.
@Action(value="/{search1}/{param1}/", results={
@Result(name=ACTION_SUCCESS,location="classic.main.general", type="tiles")},
interceptorRefs={@InterceptorRef("seoFilter"),@InterceptorRef("defaultStack")
})
Предполагается, что seoFilter
допустимый перехватчик, который не сломает стек
Это код действительного перехватчика
public String intercept(ActionInvocation invocation) throws Exception {
// here you can place the code that used to intercept the action
...
//finally
return invocation.invoke();
}
Как вы не опубликовали struts.xml
и я не могу понять, как вы настроили Struts для использования с сопоставлениями с подстановочными знаками. Я предоставлю вам ссылку на дополнительные подстановочные знаки со страницы документации, чтобы сделать это самостоятельно.
Я получил то, что хотел!!!:)
Большое спасибо Борису и Роману.
Я просто определяю стек-перехватчик.
<interceptors>
<interceptor name="seoFilter" class="com.silver.usaditos.admin.SEOFilter"></interceptor>
<interceptor-stack name="defaultInterceptorStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="seoFilter"/>
</interceptor-stack>
</interceptors>