Làm thế nào để lấy dữ liệu bài đăng một cách rõ ràng trong Spring MVC?


81

Có cách nào để lấy dữ liệu bài đăng không? Tôi biết mùa xuân xử lý dữ liệu bài đăng liên kết với các đối tượng java. Tuy nhiên, với hai trường mà tôi muốn xử lý, làm cách nào tôi có thể lấy được dữ liệu đó?

Ví dụ: giả sử biểu mẫu của tôi có hai trường:

 <input type="text" name="value1" id="value1"/>
 <input type="text" name="value2" id="value2"/>

Làm cách nào để truy xuất các giá trị đó trong bộ điều khiển của tôi?

Câu trả lời:


135

Nếu bạn đang sử dụng một trong các trường hợp bộ điều khiển được tích hợp sẵn, thì một trong các tham số cho phương thức bộ điều khiển của bạn sẽ là đối tượng Yêu cầu. Bạn có thể gọi request.getParameter("value1")để lấy giá trị dữ liệu POST (hoặc PUT).

Nếu bạn đang sử dụng các chú thích Spring MVC, bạn có thể thêm một tham số chú thích vào các tham số của phương thức:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}

1
điều này có hoạt động với các tham số yêu cầu multple không, đúng không? Bạn không cần phải bọc trong một đối tượng? stackoverflow.com/q/12862320/106261
NimChimpsky

1
<3 này cho những lần bạn không muốn / cần một hình thức mẫu hậu thuẫn (đối với hình thức tìm kiếm, hoặc một hình thức liên lạc, vv)
Don Cheadle

37

Một câu trả lời khác cho câu hỏi chính xác của OP là đặt consumeskiểu nội dung "text/plain"và sau đó khai báo một @RequestBody Stringtham số đầu vào. Điều này sẽ chuyển văn bản của dữ liệu POST vào dưới dạng Stringbiến được khai báo ( postPayloadtrong ví dụ sau).

Tất nhiên, điều này giả định tải trọng POST của bạn là dữ liệu văn bản (như OP đã nêu là trường hợp).

Thí dụ:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }

2
Đây là câu trả lời mà tôi đang tìm kiếm. Bởi 'dữ liệu bài đăng' tôi cũng hiểu như vậy. Cảm ơn!
mauromartini

Đối với nhiều tham số bài đăng (chẳng hạn như value1value2, điều này sẽ tạo một Chuỗi cho cả hai giá trị? Sau đó, bạn sẽ cần phải phân tích cú pháp các giá trị riêng lẻ? Tại sao lại làm như vậy khi bạn có thể chỉ định / lấy từng giá trị riêng lẻ như trong câu trả lời được chấp nhận?
Don Cheadle

1
@mmcrae - đó chỉ đơn giản là một cách khác để giải quyết vấn đề và có lẽ hữu ích cho những người dùng khác không có nhiều tham số POST mà thay vào đó chỉ có một khối văn bản hoặc dữ liệu nhị phân. Đó là hoàn cảnh của tôi, và đó là điều tôi hy vọng sẽ học được khi nhấp vào câu hỏi này.
simon

1
Chính xác những gì tôi đang tìm kiếm. Nó cũng hoạt động với ate = "application / json" nếu đăng json.
Manish

Xin chào. Tôi đang sử dụng Postman để kiểm tra API của mình. Người đưa thư giúp tôi điền dữ liệu vào cơ thể cho POST. Vấn đề là tôi nhận được 403 khi tôi sử dụng RequestMethod.POST. Tôi thậm chí đã thêm vào @CrossOrigin(origins = "*")nhưng tôi vẫn nhận được điều tương tự ... Không biết chuyện gì đang xảy ra ... Tôi đã sử dụng chữ ký giống như câu trả lời của bạn (ngoại trừ nó someMethodtrả về a Stringtrong trường hợp của tôi) ...
Kurt Miller

27

Spring MVC chạy trên API Servlet. Vì vậy, bạn có thể sử dụng HttpServletRequest#getParameter()cho việc này:

String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

Các HttpServletRequestnên đã có sẵn cho bạn trong Spring MVC là một trong những lý lẽ phương pháp của handleRequest()phương pháp.


1
Hai @BalusC, trong trường hợp của tôi, tôi có hơn 20 biến được yêu cầu. Tuy nhiên, tôi có một bean với tất cả các biến tham số yêu cầu. Bây giờ tôi muốn nhận tất cả các giá trị vào bean từ yêu cầu thay vì nhận từng giá trị một. Chúng tôi có tính năng này trong struts2 bằng cách sử dụng "ModelDrivenBean". Chúng tôi có bất kỳ tính năng nào như thế này trong khuôn khổ mùa xuân.
vissu

2
Có, bằng cách sử dụng chú thích @ModelAttribute và một biểu mẫu sao lưu. Liên kết này mô tả độc đáo cách thực hiện điều đó: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html

@vissu nếu bạn có nhiều hơn 20 biến bạn thực sự nên xem xét đơn giản hóa
CodeMonkey

1
Xin chào BalusC. Theo câu trả lời của simmon dưới đây, tôi đang sử dụng Postman để kiểm tra API của mình. Người đưa thư giúp tôi điền dữ liệu vào cơ thể cho POST. Vấn đề là tôi nhận được 403 khi tôi sử dụng RequestMethod.POST. Tôi thậm chí đã thêm vào @CrossOrigin(origins = "*")nhưng tôi vẫn nhận được điều tương tự ... Không biết chuyện gì đang xảy ra ... Tôi đã sử dụng chữ ký giống như câu trả lời của bạn (ngoại trừ nó someMethodtrả về a Stringtrong trường hợp của tôi) ...
Kurt Miller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.