我正在尝试找出使用Spring MVC 3.2.x实现下拉列表的正确/最佳方式。我有JSP页面,有4个下拉列表,2个级联和1个静态。以下是典型的实施方法:
@Controller
@RequestMapping("/employeeSearch")
public class EmployeeSearchController {
.......
@ModelAttribute("employeeOrgList")
public List<EmployeeOrgList> populateOrgList(HttpServletRequest request) {
return employeeService.getEmployeeOrgList();
}
@ModelAttribute("employeeSubOrg1List")
public List<EmployeeSubOrg1List> populateSubOrg1List(HttpServletRequest request) {
return employeeService.getEmployeeSubOrg1List();
}
@ModelAttribute("employeeSubOrg2List")
public List<EmployeeSubOrg2List> populateSubOrg2List(HttpServletRequest request) {
return employeeService.getEmployeeSubOrg2List();
}
@ModelAttribute("employeeStatusList")
public List<EmployeeStatusList> populateStatusList(HttpServletRequest request) {
return employeeService.getEmployeeStatusList();
}
...............
问题: 在上述实施中,用户首先选择员工组织列表,页面刷新以填充员工子组织1列表,当员工选择子组织1时,则填充子组织2并且仍然填充员工状态下拉列表。这段代码工作得很好。但问题是我在EmployeeSearchController中有7个RequestMappings,包括那些处理下拉选择的RequestMappings。所以,对于每次通话,我都要点击数据库 7 x 4 = 28 次,我认为这是不可接受的。
为解决这个问题,我删除了所有4种方法的@ModelAttribute,并在第一次访问页面时手动将它们添加到模型中(RequestMapping设置为GET)。 JSP加载正常,但只要我选择员工组织列表,就会填充员工子组织列表,但员工组织列表和员工状态列表为空。以下是具体方法:
//This is to initialize
@RequestMapping(method = { RequestMethod.GET })
public ModelAndView handlePageEntry(HttpServletRequest request, ModelMap modelMap) {
EmployeeSearchForm form = new EmployeeSearchForm();
ModelAndView modelView = new ModelAndView("employeeSearchTile");
modelView.addAttribute("form", form);
modelView.addAttribute("employeeOrgList", getEmployeeOrgList());
modelView.addAttribute("employeeSubOrg1ist", new ArrayList<EmployeeSubOrg1ist>());
modelView.addAttribute("employeeSubOrg2ist", new ArrayList<EmployeeSubOrg1ist>());
modelView.addAttribute("employeeStatusList", getEmployeeStatusList());
return modelView;
}
//This one is called when we select employee org list
@RequestMapping(method = { RequestMethod.POST }, params = { "submitAction=employeeOrgSelected" })
public ModelAndView populateEmployeeSubOrg1(@ModelAttribute(value = "form") EmployeeSearchForm form, ModelMap modelMap) {
ModelAndView modelView = new ModelAndView("employeeSearchTile");
modelView.addAttribute("form", form);
modelView.addAttribute("employeeSubOrg1ist", getEmployeeSubOrg1ist(form.getSelectedEmployeeOrg));
return modelView;
}
显然,我既没有将员工组织和员工状态列表添加回模型,也没有在会话中设置它们(我不想这样做)。如果我想在模型上设置它们,那么我将再次为这两个列表命中数据库。它比击中28次要好,但我还是希望专家能够称重。
那么,如果没有这么多的数据库访问,完成这项任务的最佳方法是什么?
答案 0 :(得分:0)
为减轻数据库旅行,您可以:
a)如果信息是关系信息,您可以使用联接来获得所需信息,请尝试以较少的查询重新获取更多信息。
b)您可以缓存服务呼叫结果。我通常使用带有Spring注释的ehcache:然后你只是在一个地方缓存而不是每个人的会话
@Cacheable(cacheName = "employeeDataCache")
public List<EmployeeOrgList> getEmployeeSubOrg1List() {
// do whatever
}
https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable