1

这是拦截器定义 my struts.xml,但这可能不正确,因为 IDE 提示我错误Cannot resolve interceptor-stacklogin at default-interceptor-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会提示错误?我可以解决错误吗?

如果不正确,为什么部署后会起作用?

4

1 回答 1

3

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

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

第 1 部分:当您指定拦截器引用名称 = 登录时

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

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

为什么 XML 显示错误?

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

如何删除 XML 错误?

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

为什么它也与单个拦截器 ref 一起使用?

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

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

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

这意味着它只处理映射和获取引用。

您可以看到它具有InterceptorListHolder接口,该接口为您的堆栈创建拦截器列表,它接受单个拦截器映射和拦截器映射列表以将拦截器映射添加到列表。

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

因此,当您只指定一个拦截器时,它会起作用,因为它处理引用。

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

于 2014-08-17T02:55:33.703 回答