gpt4 book ai didi

java - 为什么在呈现页面后调用 HandlerInterceptorAdapter postHandle 方法

转载 作者:行者123 更新时间:2023-11-30 09:28:21 25 4
gpt4 key购买 nike

我的 Spring MVC Web 应用程序在页面顶部有一个导航菜单,其中包含指向项目列表的链接。从数据库中检索项目列表。此菜单对应用程序中的所有页面都是通用的。目前,在每个 Controller 中,我检索并存储 session 中的项目列表(如果尚未在 session 中),以便它在每个页面上都可用。它工作正常,但我觉得应该有更好的方法来做到这一点。为了避免这种冗余,我现在尝试使用 HandlerInterceptorAdapter。我能够让它工作,但并不完美。第一次加载页面时,我没有看到我在 session 中设置的对象。但是,如果我刷新页面,我会在 session 中看到该对象。

我是这样创建拦截器的:

public class MyHandlerInterceptor extends HandlerInterceptorAdapter {
private MyService myService;

//Constructor
public MyHandlerInterceptor(MyService myService) {
this.myService = myService;
}

//Overridden method
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("In posthandle...");

if (request.getSession().getAttribute("items") == null) {
request.getSession().setAttribute("items", myService.getCategories());
}
}
}

我声明拦截器:

<mvc:interceptors>
<bean class="com.gyanify.webapp.interceptors.MyHandlerInterceptor"
autowire="constructor"/>
</mvc:interceptors>

我正在检查在 jsp 呈现时是否在 session 中设置了对象:

...
Session Attributes <br/>
<%
System.out.println("Printing from the jsp...");
Enumeration keys = session.getAttributeNames();
while (keys.hasMoreElements())
{
String key = (String)keys.nextElement();
out.println(key + ": " + session.getValue(key) + "<br>");
}
%>
...

这样,当我第一次加载页面时,我会在控制台中看到以下打印内容:

...
Returning view....(this is printed from the controller)
Printing from the jsp...
In posthandle...
...

我的理解是posthandle方法是在页面渲染之前调用的。但是,根据控制台上的输出,我看到 jsp 在拦截器的 posthandle 方法之前被渲染。

谁能帮我理解为什么会这样?

最佳答案

经过进一步调查,我发现问题出在我配置 spring 上下文 xml 文件的方式上。我有两个文件 - 一个用于应用程序上下文,另一个用于 Web 上下文。最初我在应用程序上下文 xml 中定义了 component-scan 和 mv:annotation-driven 标签:

<context:component-scan base-package="com.webapp" />
<mvc:annotation-driven validator="validator"/>

并在 web 上下文 xml 中定义了我的拦截器。

在 Debug模式下,我看到拦截器在处理请求后被映射到上下文。

为了让它工作,我将应用程序上下文中的配置更改为以下内容:

<context:component-scan base-package="com.webapp">
<context:exclude-filter type="regex" expression="com\.webapp\.controllers\.*"/>
</context:component-scan>

并将以下内容添加到网络上下文 xml 中:

<context:component-scan base-package="com.webapp.controllers" />
<mvc:annotation-driven validator="validator"/>

我仍在努力理解为什么这行得通而早期的配置却行不通。

关于java - 为什么在呈现页面后调用 HandlerInterceptorAdapter postHandle 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com