Spring MVC'de gönderi verilerini açıkça nasıl elde edebilirim?


82

Gönderi verilerini almanın bir yolu var mı? Spring'in yazı verilerini java nesnelerine bağladığını biliyorum. Ancak işlemek istediğim iki alan göz önüne alındığında, bu verileri nasıl elde edebilirim?

Örneğin, formumun iki alanı olduğunu varsayalım:

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

Denetleyicimde bu değerleri almaya nasıl başlayabilirim?

Yanıtlar:


135

Yerleşik denetleyici örneklerinden birini kullanıyorsanız, denetleyici yönteminizin parametrelerinden biri İstek nesnesi olacaktır. request.getParameter("value1")POST (veya PUT) veri değerini almak için arayabilirsiniz .

Spring MVC ek açıklamalarını kullanıyorsanız, yönteminizin parametrelerine ek açıklamalı bir parametre ekleyebilirsiniz:

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

1
bu çoklu istek parametreleriyle çalışır, doğru mu? Tek bir nesneyi sarmanıza gerek yok mu? stackoverflow.com/q/12862320/106261
NimChimpsky

1
<3 Model destekli bir form istemediğiniz / ihtiyaç duymadığınız zamanlar için (arama formu veya iletişim formu vb. İçin)
Don Cheadle

38

OP'nin kesin sorusuna bir başka cevap, consumesiçerik türünü olarak ayarlamak "text/plain"ve ardından bir @RequestBody Stringgiriş parametresi bildirmektir . Bu, POST verilerinin metnini bildirilen Stringdeğişken olarak ( postPayloadaşağıdaki örnekte) iletecektir.

Elbette bu, POST yükünüzün metin verisi olduğunu varsayar (OP'nin belirttiği gibi).

Misal:

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

3
Bu aradığım cevap. 'Yazı verilerinin kendisi' ile de aynı şeyi anlıyorum. Teşekkürler!
mauromartini

Birden çok gönderi parametresi için ( value1ve gibi value2, bu her iki değer için bir Dize oluşturur mu? O zaman ayrı değerleri ayrıştırmanız gerekir? Kabul edilen yanıtta olduğu gibi her bir değeri ayrı ayrı belirleyebildiğiniz / elde edebileceğiniz zaman bunu neden yapmalısınız?
Don Cheadle

1
@mmcrae - sorunu çözmenin başka bir yolu ve belki birden fazla POST parametresi olmayan ancak bunun yerine bir metin bloğu veya ikili veri bloğu olan diğer kullanıcılar için yararlıdır. Benim durumum buydu ve bu soruya tıkladığımda öğrenmeyi umduğum şey buydu.
simon

1
Tam olarak aradığım şey. Json gönderiliyorsa tüketimler = "application / json" ile de çalışır.
Manish

Merhaba. API'mi test etmek için Postman kullanıyorum . Postacı, POST için gövdeyi verilerle doldurmama yardımcı oluyor. Sorun şu ki, kullandığım zaman 403 alıyorum RequestMethod.POST. Hatta eklendi @CrossOrigin(origins = "*")ama hala aynı şeyi olsun ... ne olup bittiğini bilmiyor Do ... Ben (dışında cevabınız olarak aynı imza kullanmış someMethodbir getiri String... benim durumumda)
Kurt Miller

27

Spring MVC, Servlet API'sinin üzerinde çalışır. Yani HttpServletRequest#getParameter()bunun için kullanabilirsiniz :

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

, HttpServletRequestSpring MVC içinde, yöntemin yöntem bağımsız değişkenlerinden biri olarak sizin için zaten mevcut olmalıdır handleRequest().


1
Hai @BalusC, benim durumumda talepte 20'den fazla değişken var. Ancak tüm istek parametresi değişkenlerine sahip bir bean var. Şimdi tek tek almak yerine tüm değerleri çekirdekten almak istiyorum. Bu özelliğe "ModelDrivenBean" kullanarak struts2'de sahibiz. Bahar çerçevesinde böyle bir özelliğimiz var mı?
vissu

2
Evet, @ModelAttribute ek açıklaması ve bir form destek çekirdeği kullanılıyor. Bu bağlantı bunun nasıl yapılacağını güzel bir şekilde açıklıyor: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html

@vissu 20'den fazla değişkeniniz varsa sadeleştirmeye gerçekten bakmalısınız
CodeMonkey

1
Merhaba BalusC. Aşağıdaki simmon cevabına göre, API'mi test etmek için Postman kullanıyorum . Postacı, POST için gövdeyi verilerle doldurmama yardımcı oluyor. Sorun şu ki, kullandığım zaman 403 alıyorum RequestMethod.POST. Hatta eklendi @CrossOrigin(origins = "*")ama hala aynı şeyi olsun ... ne olup bittiğini bilmiyor Do ... Ben (dışında cevabınız olarak aynı imza kullanmış someMethodbir getiri String... benim durumumda)
Kurt Miller

0

Denetleyicinizde herhangi bir ek açıklama olmadan istediğiniz özelliği kolayca iletebilirsiniz:

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

GET ve POST ile çalışır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.