2014-07-25 113 views
1

我試圖找出實現使用Spring MVC的3.2.x.下拉列表中選擇正確的/最佳方式我有4個下拉,2個級聯和1個靜態的JSP頁面。這裏是工作的典型的實現:正確方法

@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,包括那些處理下拉選擇的請求。因此,對於每一個電話,我打數據庫7×4 = 28次,我認爲這是不可接受的。

爲了解決我刪除@ModelAttribute上的所有4種方法,並手動將它們添加到當頁面被首次訪問的模型(RequestMapping設定爲GET)的問題。 JSP加載正常,但只要我選擇員工組織列表,員工子組織1列表就會填充,但員工組織列表和員工狀態列表爲空。下面是具體的方法:

//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

你可能想看看Ajax的,所以你不必重裝每次下拉一次後,整個頁面都會變化。 – developerwjk

+0

謝謝@developerwjk,Ajax是一種可能的解決方案,但由於網站需要「無障礙」我不能用它(508兼容) – user1294057

回答

0

爲了減輕您可以數據庫車次:

a)如果信息是關係,你可以使用連接來獲得您需要,嘗試帶回更多的信息,用更少的查詢什麼。

b)你可以緩存服務調用的結果。我一般用的Ehcache瓦特/ Spring註解本:那你只是在一個地方,而不是每個人的會話緩存

@Cacheable(cacheName = "employeeDataCache") 
public List<EmployeeOrgList> getEmployeeSubOrg1List() { 
    // do whatever 
} 

https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable

+0

我害怕它會緩存,我將不得不依靠。我猜測Spring MVC沒有推薦處理這個問題的方法。由於我沒有聲譽,我無法投票。除非別人有其他想法,否則我會接受你的解決方案。 – user1294057

+0

你可以有一個bean,比如說「EmployeeData」。其中包含getSubOrgList(),getStatusList()等,只是使用@ModelAttribute。您顯然仍然需要進行數據庫調用才能獲取該數據。如果沒有每次獲取數據或緩存數據,都無法解決這個問題。如果數據在用戶之間是相同的,那麼在會話中進行緩存是一個不可否認的事情,所以我推薦使用ehcache方法。 – int21h

+0

感謝您的評論,我同意你的建議。 – user1294057