这是拦截器定义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会提示错误?我能解决这个错误吗?
如果不正确,部署后为什么会这样?
答案 0 :(得分:3)
所有类都存在于应用程序上下文中,Struts对象工厂创建类的实例,并在引用它们时返回它们。
指定时,默认堆栈被您覆盖。因此,默认堆栈不可用于该包中的操作。
当你在name属性中指定somestring时,它会解析该字符串,然后它从StrutsObjectFactory获取对象,然后在内存中创建它的列表。然后InterceptorBuilder类创建引用列表。该类返回映射列表。
为什么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 并结合登录拦截器,以使您的应用程序完全正常工作。