在struts中使用单个拦截器作为default-interceptor-ref是否正确?

时间:2014-08-16 20:14:46

标签: java struts2 interceptor struts2-interceptors

这是拦截器定义my struts.xml,但这可能不正确,因为IDE在默认情况下提示我错误无法解析拦截器堆栈login 拦截器REF

如果我忽略此错误以部署到服务器,此拦截器仍然可以正常工作。

<package name="default" extends="struts-default">

    <interceptors>
        <interceptor name="login" class="com.pos.interceptor.LoginInterceptor"></interceptor>
    </interceptors>

    <default-interceptor-ref name="login"/>
    <global-results>
        <result name="error">/error.jsp</result>
        <result name="login" type="redirect">/login.jsp</result>
    </global-results>


    <action name="profile" class="com.pos.UserProfile" method="index">
        <result name="success">/index.jsp</result>
    </action>
</package>

如果我定义了一个拦截器堆栈,那么IDE将没有错误

        <interceptor-stack name="loginStack">
            <interceptor-ref name="login"/>
        </interceptor-stack>
    <default-interceptor-ref name="loginStack"/>

以上两者都是部署后的工作。如果我使用单个拦截器作为默认拦截器,这是正确的吗?

如果正确,为什么IDE会提示错误?我能解决这个错误吗?

如果不正确,部署后为什么会这样?

1 个答案:

答案 0 :(得分:3)

所有类都存在于应用程序上下文中,Struts对象工厂创建类的实例,并在引用它们时返回它们。

指定时,

默认堆栈被您覆盖。因此,默认堆栈不可用于该包中的操作。

第1部分:指定interceptor-ref name = login

当你在name属性中指定somestring时,它会解析该字符串,然后它从StrutsObjectFactory获取对象,然后在内存中创建它的列表。然后InterceptorBuilder类创建引用列表。该类返回映射列表。

第2部分:编写default-interceptor-ref

为什么XML显示错误?

<default-interceptor-ref >用于定义拦截器的默认堆栈,xml显示错误,因为您指定的是拦截器而不是拦截器堆栈。根据DTD,它是无效的。根据DTD,它期待一种拦截器堆栈。

如何删除XML错误?

您可以禁用xml检查以删除该错误,也可以通过创建堆栈并指定堆栈来指定有效配置,如第二部分所示。

为什么它也适用于单个拦截器参考?

它正在工作,因为实现也接受单个拦截器引用。实际上,配置正在传递引用。因此,如果您传递堆栈,它将引用集合,如果您传递单个拦截器,它将仅传递单个拦截器的引用。

现在在struts2中,互联网上有源代码。

InterceptorStackConfig是构建列表并使用InterceptorlistHolder接口的类。 InterceptorStackConfig在构建器中实现此接口,并添加拦截器将拦截器映射中的引用逐个映射到列表。

  

这意味着它仅处理mapping并获得参考。

你可以看到它有InterceptorListHolder接口,它为你的堆栈创建了拦截器列表,它接受单拦截器映射拦截器映射列表来添加拦截器mappping列表。

 InterceptorListHolder  addInterceptor(InterceptorMapping interceptor);
 InterceptorListHolder  addInterceptors(List<InterceptorMapping> interceptors);

因此,当你只指定一个拦截器因为它处理引用时它正在工作。

但我仍然建议您使用 dafaultStack 并结合登录拦截器,以使您的应用程序完全正常工作。