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) - Action:
   /posts/category/cars/
   
 - INFO (com.silver.front.view.actions.SearchPostBeansAction) -   
   getSearch1( category )

 - INFO (com.silver.front.view.actions.SearchPostBeansAction) -   
   getParam1( cars )

如果我拦截该动作:

@InterceptorRef("seoFilter")
@Namespace("/anuncios")
public class SearchPostBeansAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
...
}

执行结果:

 - INFO (com.silver.front.view.actions.SearchPostBeansAction) - Action:
   /posts/category/cars/
   
 - INFO (com.silver.front.view.actions.SearchPostBeansAction) -   
   getSearch1( null )

 - INFO (com.silver.front.view.actions.SearchPostBeansAction) -   
   getParam1( null) 

为什么丢失通配符的参数?

这是拦截器:

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();
    }
}
4

3 回答 3

1

错误是您应用于@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 以使用通配符映射的,因此我将从文档页面为您提供高级通配符的参考,以便您自己完成。

于 2014-03-08T10:53:53.240 回答
1

这是因为您绕过了拦截器堆栈上的所有拦截器。

要使用 anInterceptor你需要调用invocation.invoke()来告诉 struts 继续通过Interceptor堆栈的其余部分处理请求。

您手动调用该操作,从而绕过拦截器堆栈。

public String intercept(ActionInvocation invocation) throws Exception {
    return invocation.invoke;
}
于 2014-03-08T09:11:04.800 回答
0

我得到了我想要的!!!:)

非常感谢鲍里斯和罗曼。

我只是定义了一个拦截器堆栈。

<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>
于 2014-03-08T18:54:40.027 回答