访问和显示所有页面中通用的数据库的最佳实践

时间:2015-03-16 18:04:52

标签: spring jsp spring-mvc

我有一个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)难以维护,因为业务逻辑的变化需要多个控制器的更改

此类情景中的最佳做法是什么?如何从多个控制器中避免此调用?有没有办法在中心位置进行此调用,以便这段代码不会跨越所有控制器?

1 个答案:

答案 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上的文档。