2014-12-07 54 views
1

我正在創建一個購物車應用程序來學習Spring MVC。我想在多個頁面中顯示所有類別和子類別的列表。即;主頁,產品頁面,分類頁面。如何在Spring MVC中存儲共享對象以用於多個JSP?

在主頁控制器中,我檢索類別,子類別和特色產品的列表並將它們傳遞到主頁。

@Controller 
public class CatalogController { 

    @Autowired 
    private CategoryConfigService categoryConfigurationService; 
    @Autowired 
    private ProductConfigService productConfigurationService; 
    private static final Logger logger = LoggerFactory 
      .getLogger(CatalogController.class); 

    /** 
    * Catalog Controller method which retrieves the information required in the 
    * application home page(Categories,SubCategories) 
    * 
    * @return Home Page View 
    */ 
    @RequestMapping(value = "/home", method = RequestMethod.GET) 
    public String returnHomePage(Model model) { 
     logger.info("Processing information for home page"); 
     List<Category> categoriesList = categoryConfigurationService 
       .getAllCategories(); 
     Map<Category, List<SubCategory>> categoryMap = new HashMap<Category, List<SubCategory>>(); 
     for (Category category : categoriesList) { 
      List<SubCategory> subCategoryList = categoryConfigurationService 
        .getAllSubCategoriesByCategoryId(category.getId()); 
      categoryMap.put(category, subCategoryList); 
     } 
     model.addAttribute("categoryMap", categoryMap); 
     model.addAttribute("featProd", 
       productConfigurationService.getFeaturedProducts()); 

     return "home"; 
    } 


} 

我有2個問題:

  1. 我如何可以存儲在Spring對象categoryMap訪問它在多頁?

  2. 我已經使用JSP和Servlets完成了相同的項目,並且我已將categoryMap存儲在應用程序範圍中,以便我可以在多個頁面中使用它。這是一個正確的方法嗎?如果不是,我怎麼能以更好的方式做到這一點?

請幫忙!!由於

編輯:我想在我的應用程序的標題,顯示該類別和子類別列表,這樣我可以在所有頁面使用這些(類似下圖)

enter image description here

編輯:是除了編寫代碼以從每個控制器中的數據庫中獲取類別列表之外,還有其他方法可以遵循嗎?

回答

1

如果此列表對於每個用戶都不相同,則保留在會話範圍內。否則,如果它在應用程序中很常見,則可以使用單例作用域。

最佳amoung所有solutioins速效,您可以使用下面的步驟: -

1.對於acessing列表整個應用程序,將它保存在單獨服務類,類變量和接取在控制器通過自動裝配您服務。

  1. 要在頭文件中顯示它,您需要將它添加到模型中,或者您必須一次又一次地從每個控制器方法中將其添加到模型中。或者,您可以使用annotatoin @sessionattribute將其添加爲模型中的會話屬性。

是的,對於完美的設計,應該有某種方式來添加屬性作爲應用程序級別。然而,春天卻沒有這樣的支持。

+0

是的,這個列表對於所有用戶都是一樣的,但是我們真的可以將數據存儲在單例作用域中嗎?你能用一個代碼示例來詳細說明你的答案嗎? – 2014-12-07 17:06:56

+1

您會從您注入的類別中提供服務。現在該服務應該是一個在應用程序中共享的單例。這是你能做的最簡單的事情。 '@Autowired private CategoryService categoryService; '並且在你的映射中,你將從服務獲得映射:'model.addAttribute(「categoryMap」,categoryService.getYourMap());'不要把你的其他邏輯放到控制器中, – Vaelyr 2014-12-07 17:18:37

+0

是的,你可以在你的服務中保留地圖並使用它,但是因爲多個線程將從每個控制器更新它,所以你需要使用同步來更新它的tread-safe – Panther 2014-12-07 17:21:50

相關問題