Java 在struts中使用单个拦截器作为默认拦截器引用是否正确?

Java 在struts中使用单个拦截器作为默认拦截器引用是否正确?,java,struts2,interceptor,struts2-interceptors,Java,Struts2,Interceptor,Struts2 Interceptors,这是拦截器定义mystruts.xml,但这可能不正确,因为IDE提示我错误无法在默认拦截器引用处解析拦截器堆栈登录 若我忽略这个错误来部署到服务器,这个拦截器仍然可以正常工作 <package name="default" extends="struts-default"> <interceptors> <interceptor name="login" class="com.pos.interceptor.LoginIntercepto

这是拦截器定义my
struts.xml
,但这可能不正确,因为IDE提示我错误无法在默认拦截器引用处解析拦截器堆栈
登录

若我忽略这个错误来部署到服务器,这个拦截器仍然可以正常工作

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

/error.jsp
/login.jsp
/index.jsp
如果我定义一个拦截器堆栈,IDE将不会出错

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

以上两项都是部署后的工作。如果使用单个拦截器作为默认拦截器,是否正确

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


如果不正确,为什么在部署后它会工作?

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

当您指定默认堆栈时,它将被您覆盖。因此,默认堆栈对于该包中的操作不可用

第1部分:指定拦截器ref name=login时 当您在name属性中指定somestring时,它解析该字符串,然后从中获取对象,然后在内存中创建其列表。然后类创建引用列表。此类返回映射列表

第2部分:编写默认拦截器ref时 为什么XML显示错误?

用于定义拦截器的默认堆栈,xml显示错误,因为您指定的是拦截器而不是拦截器堆栈。根据DTD,它是无效的。根据DTD,它需要一种类型的拦截器堆栈

如何删除XML错误?

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

为什么它也使用单拦截器ref?

它之所以能够工作,是因为实现也接受单个拦截器引用。实际上,该配置正在传递引用。所以,如果您传递堆栈,它将引用集合,如果您传递单个拦截器,它将只传递单个拦截器的引用

现在在struts2中,互联网上有可用的源代码

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

 InterceptorListHolder  addInterceptor(InterceptorMapping interceptor);
 InterceptorListHolder  addInterceptors(List<InterceptorMapping> interceptors);
这意味着它只处理和获取引用

您可以看到,它有一个为堆栈创建拦截器列表的接口,它同时接受单个拦截器映射拦截器映射列表,用于将拦截器映射添加到列表中

 InterceptorListHolder  addInterceptor(InterceptorMapping interceptor);
 InterceptorListHolder  addInterceptors(List<InterceptorMapping> interceptors);
InterceptorListHolder附加接收器(InterceptorMapping interceptor);
拦截器列表持有者添加拦截器(列出拦截器);
因此,当您只指定一个拦截器时,它就起作用了,因为它处理引用

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