My Spring MVC web app has a navigation menu at the top of the page with links to a list of items. The list of items is retrieved from the database. This menu is common to all pages in the application. Currently, in every controller, I retrieve and store the list of items in session (if not already in session), so that it is available on every page. It works fine, but I feel this there should be a better way to do this. To avoid this redundancy, I am now trying to use a HandlerInterceptorAdapter. I am able to get it work, but not perfectly. The first time I load the page, I do not see the object I set in session. But, if I refresh the page, I do see the object in session.
I created my interceptor this way:
I declared the interceptor:Code: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()); } } }
I am checking if the object is set in session by the time the jsp renders:Code:<mvc:interceptors> <bean class="com.gyanify.webapp.interceptors.MyHandlerInterceptor" autowire="constructor"/> </mvc:interceptors>
Code:... 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>"); } %> ...
With that, when I first load the page, I see the following print in the console:
My understanding is that the posthandle method is invoked before the page is rendered. However, according to the output on the console, I see that the jsp is being rendered before the interceptor's posthandle method.Code:... Returning view....(this is printed from the controller) Printing from the jsp... In posthandle... ...
Can anyone help me understand why it is behaving this way?


Reply With Quote
