2013-07-18 79 views
8

Tôi đang sử dụng Spring 3.2.0 MVC. Trong đó tôi phải lưu trữ một đối tượng để phiên. Hiện tại tôi đang sử dụng HttpSession được đặt và nhận thuộc tính để lưu trữ và truy xuất giá trị.Spring @SessionAttribute cách truy xuất đối tượng phiên trong cùng một bộ điều khiển

Nó chỉ trả về Chuỗi không đối tượng. Tôi muốn sử dụng @SessionAttribute khi tôi thử nó đặt đối tượng trong phiên nhưng tôi không thể truy xuất đối tượng phiên

@RequestMapping(value = "/sample-login", method = RequestMethod.POST) 
    public String getLoginClient(HttpServletRequest request,ModelMap modelMap) { 
     String userName = request.getParameter("userName"); 
     String password = request.getParameter("password"); 
     User user = sample.createClient(userName, password); 
     modelMap.addAttribute("userObject", user); 
     return "user"; 
    } 


    @RequestMapping(value = "/user-byName", method = RequestMethod.GET) 
    public 
    @ResponseBody 
    String getUserByName(HttpServletRequest request,@ModelAttribute User user) { 

     String fas= user.toString(); 
     return fas; 
    } 

Cả hai phương pháp đều có cùng bộ điều khiển. Làm thế nào tôi sẽ sử dụng điều này để lấy đối tượng?

+0

Bạn đã đặt câu hỏi như thể bạn có mã đang cố gắng sử dụng '@ SessionAttribute', nhưng đoạn mã của bạn không chứa nó. Vì vậy, làm thế nào bạn sử dụng nó? – sjngm

+0

Tôi đã thêm '@SessionAttributes (" userObject ")' tôi đã sử dụng mã này trong mã của tôi – jackyesind

Trả lời

29

@SessionAttributes chú thích được sử dụng trên mức lớp:

  1. Đánh dấu một thuộc tính mô hình cần được tiếp tục tồn để HttpSession sau khi các phương pháp xử lý được thực hiện
  2. dụng nhất mô hình của bạn với đối tượng đã lưu trước đó từ HttpSession trước phương thức xử lý được thực thi - nếu một phương thức tồn tại

Vì vậy, bạn có thể sử dụng nó cùng với @ModelAttribute chú thích như trong ví dụ này:

@Controller 
@RequestMapping("/counter") 
@SessionAttributes("mycounter") 
public class CounterController { 

    // Checks if there's a model attribute 'mycounter', if not create a new one. 
    // Since 'mycounter' is labelled as session attribute it will be persisted to 
    // HttpSession 
    @RequestMapping(method = GET) 
    public String get(Model model) { 
    if(!model.containsAttribute("mycounter")) { 
     model.addAttribute("mycounter", new MyCounter(0)); 
    } 
    return "counter"; 
    } 

    // Obtain 'mycounter' object for this user's session and increment it 
    @RequestMapping(method = POST) 
    public String post(@ModelAttribute("mycounter") MyCounter myCounter) { 
    myCounter.increment(); 
    return "redirect:/counter"; 
    } 
} 

Cũng đừng quên cái bẫy noobie chung: chắc chắn rằng bạn làm cho các đối tượng phiên của bạn Serializable.

+2

Gần đây tôi đã gặp phải tình huống tương tự - cần thiết để tìm nạp thuộc tính phiên trong phương thức xử lý của tôi. Sử dụng @ModelAttribute không phải là giải pháp tốt nhất ở đây vì tính năng ràng buộc dữ liệu lò xo. Trong ví dụ của bạn nếu bạn nhận được yêu cầu đăng chứa tham số có tên khớp với một trong các tên trường myCounter, mùa xuân sẽ tự động đặt trường này thành giá trị thu được từ tham số, có thể là một sự ngạc nhiên hoàn toàn. http://stackoverflow.com/questions/27744890/spring-mvc-how-to-forbid-data-binding-to-modelattribute – troy

Các vấn đề liên quan