如何为所有控制器和页面仅绑定一次共享片段的数据?



我想在所有页面中显示类别列表。我有以下代码用于在nav 中显示项目.jsp:

<c:forEach var="category" items="${categoryList}">
<p><a href="showCategory?id=${category.id}">${category.title}</a></p>
</c:forEach>

我在控制器请求映射方法中使用此代码将值绑定到页面:

model.addObject("categoryList", postCategoryList);

我已经将nav.jsp包含在主.jsp文件中,它可以正常工作,但我有很多控制器和页面。如何为所有控制器和请求方法仅绑定一次categoryList值?

使用HandlerInterceptor

public class CategoryListAddInterceptor extends HandlerInterceptorAdapter {
@Autowired
private CategoryDao categoryDao; //for example
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
modelAndView.getModel().put("categoryList", categoryDao.getPostCategoryList());
}        
}

在配置 xml 文件中,添加:

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/demo/**"/> <!-- can add exclude patterns if needed -->
<bean class="package.name.CategoryListAddInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

更新:

由于您在呼叫modelAndView.getModel()时一直NullPointerException,因此您可以这样做来实现相同的目标:

@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
request.setAttribute("categoryList", categoryDao.getPostCategoryList());
}

最新更新