2012-05-29 34 views
4

我有一些管理員可以更新產品的UI。在我的開發/測試過程中,我只打開過一個窗口,一切都按照應有的方式工作。Spring MVC +會話屬性和多個選項卡

然後,客戶端正在編輯,並且他們打開了多個不同產品的選項卡,保存時會導致重複的字段問題。我想這是@SessionAttributes@ModelAttribute的組合。上次打開的產品是放入會話中的產品,因此如果您嘗試編輯第一個選項卡,則實際上會產生不正確的產品。

我的方法如下,使用SessionAttributeModelAttribute不正確?

我的控制器:

@Controller 
@SessionAttributes({ "product" }) 
public class ProductController { 

@RequestMapping(value = "/product/update/{productId}", method = RequestMethod.GET) 
public String update(@PathVariable Long productId, Model model) { 
    Product product; 
    if (productId == null) { 
     product = new Product(); 
    } else { 
     product = Product.find(productId); 
    } 
    model.addAttribute("product", product); 
    return "product/update"; 
} 

@RequestMapping(value = "/product/update", method = RequestMethod.POST) 
public String update(@ModelAttribute Product product, BindingResult result, 
     Model model) { 
    if (result.hasErrors()) { 
     return "product/update"; 
    } 
    product = product.merge(); 
    return "redirect:/product/update/" + product.getId(); 
} 

}

+0

你應該使用'request'範圍,而不是'session'範圍,允許用戶內完成多個任務的會話。 –

+0

嗨,我找到了這個解決方案,我認爲這對我有所幫助。 http://mandeep312.blogspot.com/2014/05/when-you-are-using-sessionattributes.html#more –

回答

1

在情況下,你只會顯示存儲在會話對象,也不會允許它被編輯或替換,這種做法是好的。但對於這種情況,建議使用請求範圍而不是會話範圍。

+0

然後,這將需要我的表單具有我不想編輯的所有字段的隱藏字段?例如ID – kabal

+0

這可能是一種情況,我需要製作一個命令特定的對象,「包裝」我的域對象,因爲有很多字段/組合不會被用戶編輯,我不想要現在創建隱藏字段 – kabal

+0

不需要將不可編輯的字段設置爲隱藏。您可以在UI上(如果需要)以不可編輯的形式顯示它們,例如通過使用EL而不是將它們放入任何可編輯組件中。 – Logan