2010-03-23 30 views
6

Tôi có một mẫu đơn giản Spring được liên kết với một đối tượng biểu mẫu trên bài đăng. Trình xử lý POST http thực hiện một số công việc và sau đó cần chuyển hướng đến một URL mới, chuyển dữ liệu biểu mẫu dưới dạng tham số chuỗi truy vấn.Spring 3 MVC - làm cách nào để biến biểu mẫu thành chuỗi truy vấn?

Vì vậy, giả sử tôi có một đối tượng ủng hộ mẫu với tính chất "param1" và "param2", tôi muốn xây dựng một chuỗi mà trông giống như sau:

redirect:/app/new/page?param1=value;param2=value

Bây giờ, mùa xuân sẽ tự động ràng buộc giá trị TỪ một chuỗi truy vấn hoặc một biểu mẫu đăng bài vào đối tượng biểu mẫu của tôi, nhưng tôi muốn tạo một chuỗi truy vấn với các giá trị được lấy từ đối tượng biểu mẫu. Rõ ràng nó là tầm thường để làm điều này bằng tay nhưng vì tôi sẽ có nhiều đối tượng sao lưu mẫu khác nhau, có một số cơ sở được xây dựng trong Spring để tạo chuỗi truy vấn từ một đối tượng biểu mẫu, phù hợp để xây dựng URL?

Cảm ơn.

Trả lời

2

OK, sau khi truy tìm mã nguồn Spring, tôi nghĩ rằng tôi có một số câu trả lời dứt khoát.

1) Thêm thông số truy vấn theo cách thủ công vào URL mà bạn chuyển lại trong chuỗi "chuyển hướng: ..." là IDEA RẤT NHIỀU. Spring lưu trữ các chế độ xem mà các url đó đề cập đến, vì vậy nếu bạn chỉ định nhiều tham số khác nhau, bạn sẽ tiết kiệm bộ nhớ một cách hiệu quả bằng cách làm cho bộ nhớ cache chứa nhiều giá trị mà nó không cần.

Lưu ý rằng PetClinic mã ví dụ trong việc phân phối mùa xuân không chính xác này, và dường như đã có một vấn đề Jira huy động để sửa chữa nó :-)

2) Các đối tượng mô hình vẫn còn nắm giữ bởi mùa xuân khi bộ điều khiển trả về và Spring WILL sẽ tự động thêm bất kỳ giá trị nào vào nó vào URL bạn chỉ định (như các tham số truy vấn) - CUNG CẤP rằng các giá trị mô hình là các đối tượng nguyên gốc hoặc String thuần túy. Bây giờ, vì đối tượng sao lưu biểu mẫu là một đối tượng được lưu trữ như một thuộc tính duy nhất, Spring không làm bất cứ điều gì với nó.

Vì vậy - từ một Bộ điều khiển được chú thích, cách tiếp cận tốt nhất có vẻ là thêm tham số ModelMap vào phương thức xử lý. ? Khi bạn đã sẵn sàng trở lại, làm một cái gì đó như thế này:

Assuming the form backing object "formObject" has been passed as a parameter to the controller handler method (via the ModelAttribute annotation) and has properties "param1" and "param2" that are Strings - 

modelMap.clear(); 
modelMap.addAttribute("param1", formObject.getParam1()); 
modelMap.addAttribute("param2", formObject.getParam2()); 
return "redirect:/my/url"; 

Và mùa xuân sẽ phát hành một chuyển hướng tới/my/url param1 = value; param2 = giá trị

Có không xuất hiện để được một cơ chế dựng sẵn (trong Spring) để biến một bean thành một danh sách các cặp khóa/giá trị để thêm vào bản đồ, nhưng nếu bạn thực sự cần nó, thư viện Apache BeanUtils sẽ làm tốt. Tất nhiên, bạn không muốn làm điều này cho các đối tượng lớn nếu không bạn có thể vượt quá độ dài cho phép của một URL.

Tìm tất cả những gì ra dường như khó khăn hơn nhiều so với nó cần thiết để được :-)

0

Tôi nghĩ, bạn nên sử dụng phương thức setExposeModelAttributes của lớp RedirectView, nhưng có thể khó truy cập vào phương thức này nếu bạn sử dụng chú thích Spring 3.0 trên bộ điều khiển của mình.

+0

Không có vẻ để làm việc ...Tôi đang sử dụng bộ điều khiển chú thích, vì vậy bộ điều khiển của tôi chỉ là một lớp java đơn giản, không kế thừa từ bất kỳ lớp Spring nào. Nếu tôi tạo một đối tượng RedirectView mới và trả về nó từ bộ điều khiển ... nó không nối thêm bất kỳ thứ gì vào URL. Tôi không thể thấy cách đối tượng RedirectView sẽ nhận được một tham chiếu đến đối tượng biểu mẫu - không có tùy chọn setter hoặc constructor nào để truyền vào biểu mẫu của tôi! – David

+0

Khi RedirectView được xử lý renderMergedOutputModel được gọi. Phương thức này nhận được mô hình của bạn và hiển thị url chính xác. – uthark

+0

Nếu tôi tạo một RedirectView mới, nó sẽ không có bất kỳ tham chiếu đến bất kỳ đối tượng mô hình nào. Và không có setter để cung cấp cho nó một đối tượng mô hình. Nếu tôi gọi phương thức "render()" trên RedirectView, chuyển một Map chứa đối tượng mô hình của tôi, thì nó chỉ ném ra một IllegalStateException khi chạy. Có vẻ như khuôn khổ đã quên bao gồm hỗ trợ để thực hiện việc này khi sử dụng chú thích ... – David

2
Map<String, Object> model = new HashMap<String, Object(); 
model.put("stuff", "here"); 
ModelAndView mv = new ModelAndView("redirect:/somewhere.htm", model); 
return mv; 

Tạo

http://.../somewhere.htm?stuff=here 
Các vấn đề liên quan