我有一个Webstore,为每个JSP页面定义了一堆Spring MVC控制器,如HomePageController,CategoryPageController,ProductPageController,CartPageController等。所有这些控制器都调用DB来获取并显示JSP之上的菜单页面。上面提到的每个控制器都调用DB来获取菜单。
我正在使用Spring 3.0框架。
HomePageController.java
@Controller
@RequestMapping(HOME_PAGE_CONTROLLER)
public class HomePageController extends BasePageController {
@RequestMapping(method = RequestMethod.GET)
protected ModelAndView processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ModelAndView mav = new ModelAndView();
mav.addObject("menuCategories", masterDataService.getAllMenuCategories());
return showPage(mav, HOME_PAGE_URL);
}
}
我觉得这个电话是多余的,因为 1)所有控制器都在进行此调用以构建菜单 2)难以维护,因为业务逻辑的变化需要多个控制器的更改
此类情景中的最佳做法是什么?如何从多个控制器中避免此调用?有没有办法在中心位置进行此调用,以便这段代码不会跨越所有控制器?
答案 0 :(得分:1)
避免跨控制器类复制代码 - 如果所有控制器类都扩展BasePageController
:
public abstract class BasePageController {
...
@ModelAttribute
public void initMenuCategories(Model model) {
model.addAttribute("menuCategories", masterDataService.getAllMenuCategories());
}
...
}
每页减少数据库调用 - 如果菜单类别不经常更改,请考虑缓存它们:
@Service
public class MasterDataService {
...
@Cacheable(key = "menu", value = "menu")
public List<MenuCategory> getAllMenuCategories() { ... }
...
}
您必须在服务层配置中添加名为menu
的缓存才能生效。有关详细信息,请参阅Caching with Spring上的文档。