2011-07-27 28 views
43

HttpServletRequest, getParameterMap, tüm sorgu dizesi parametreleri ve posta verisi parametreleriyle ilgili bir Harita döndürür.HttpServletRequest - Sorgu dizesi parametrelerini al, form verisi yok

SADECE sorgu dizesi parametrelerinin bir haritasını elde etmenin bir yolu var mı? GetQueryString kullanmaktan ve değerleri ayrıştırmaktan kaçınmaya çalışıyorum.

+1

Ne demek istiyorsun? Orada sadece "GET" veya "POST" parametreleri olabilir, hiçbir zaman ikisi de olamaz. – Jacob

+15

Her ikisine birden sahip olabilirsiniz ... POST isteğinde sorgu dizesi parametreleri olabilir. Ve bu durumda, hepsi "getParameterMap" ile geri döndü – JasonStoltz

+0

Oh, tamam. Neden ikisine de ihtiyaç var, sadece meraklı? – Jacob

cevap

18

Her ne kadar cularis, parametre haritasında her ikisinin birden olabileceğinin aksine.

görüyorum iyi yolu queryString "&? <parameterName> =" içeriyorsa vekil parameterMap ve her parametre alma kontrolü içindir.

Qerub'un belirttiği gibi, bu denetimin yapılabilmesi için önce parameterName'in kodlanmış URL olması gerektiğini unutmayın.

Bu, ayrıştırmadan tasarruf etmenizi sağlar ve size yalnızca URL parametrelerini verir.

+1

Harika öneri! Kesinlikle ayrıştırmadan kaçınmaya çalışıyorum – JasonStoltz

+2

Bu parametre yapmadan önce 'parameterName' kodlanmış URL olması gerektiğini unutmayın. – qerub

+0

@Qerub: İyi yakalama, thx. – DoubleMalt

2

Korkarım ki, sorgu parametrelerinden ayrı olarak ayrıştırılan sorgu dizesi parametrelerini almanın bir yolu yoktur. BTW böyle bir API yokluğu, muhtemelen tasarımınızı kontrol etmeniz gerektiği anlamına gelebilir. POST gönderirken neden sorgu dizesi kullanıyorsunuz? URL'ye daha fazla veri göndermek istiyorsanız REST benzeri bir kural kullanın, ör. yerine gönderme

http://mycompany.com/myapp/myservlet?first=11&second=22

ki: Birçok sorgu dizesi ve mesaj gövdesi olduğuna inanıyordu zaman bir sürede oluşturulduğu için

http://mycompany.com/myapp/myservlet/11/22

+0

POST'ta sorgulama dizesi parametresini kullanıyorum çünkü POST aracılığıyla orijinal forma iletilen tüm sorgu dizelerini korumak istiyorum. Bu öncelikle izleme amaçlıdır ... Bu durumda REST benzeri bir kuralın çalışacağından emin değilim, çünkü izleme kütüphanesinin sorgu dizesinde belirli parametreleri aradığından eminim. – JasonStoltz

+0

Bir sorgu dizesi parametresine REST benzeri bir kuralı kullanmanızı tavsiye etmenizin bir nedeni var mı? Avantajın ne olduğunu anladığımdan emin değilim? – JasonStoltz

+6

"BTW, böyle bir API yokluğu, muhtemelen tasarımınızı kontrol etmeniz gerektiği anlamına gelebilir." Bu durumda Oracle, tasarımlarını kontrol etmelidir :) –

15

servlet API bu özelliği bulunmuyor sadece iki Parametrelerin amaçlarının temelde farklı olduğunu fark etmeden, parametre göndermenin farklı yolları. ? Onlar "42 yaşından büyük tüm kişiler" gibi (birçok kaynak toplama olabilir) bir kaynak, tanımlamada katılmaktadırlar çünkü

sorgu dizesi parametreleri foo = bar URL'ye bir parçasıdır:

GET/people? age = 42

POST veya PUT içerisindeki mesaj gövdesi parametreleri, hedef kaynak (lar) için bir değişiklik ifade eder. ? Bu özellik, "saça" bir değeri ayarlayarak Fx:

PUT/kişilerin yaş = 42

saç = gri

Yani aynı anda sorgu parametrelerini ve vücut parametrelerini her ikisini de kullanmak kesinlikle RESTful olduğunu , onları farklı amaçlarla kullanabilmeniz için ayrılmıştır. Özellik, Java sunucu API'sinde kesinlikle eksik. Sorgu dizesi

username=james&password=pwd 

gibi ise diğer cevaplar servlet'dir kullanarak sorgu dizesi parametrelerini elde hiçbir şekilde belirttiği gibi

42

Sen bu

request.getParameter("username"); 
+0

Bu, Java Server sayfalarının kullanımı içindir. – Jorgesys

+1

ikincisi, istek akışını bozar, ben soru kullanıcı adı almak ve daha sonra işleme –

5

yapabilirsiniz adını elde etmek için request.getQueryString() kullanabilirsiniz api.

Yani, sorgu parametrelerini almanın en iyi yolunun sorgu dizesini kendiniz ayrıştırdığını düşünüyorum. (Parametreler üzerinde yineleme ve sorgu dizesi parametreyi içerip içermediğini kontrol etme daha karmaşıktır)

Sorgu dizesi parametrelerini almak için aşağıdaki kodu yazdım. Apache StringUtils ve ArrayUtils kullanma.

public static Map<String, String[]> getQueryParameters(HttpServletRequest request) { 
    Map<String, String[]> queryParameters = new HashMap<>(); 
    String queryString = request.getQueryString(); 

    if (StringUtils.isEmpty(queryString)) { 
     return queryParameters; 
    } 

    String[] parameters = queryString.split("&"); 

    for (String parameter : parameters) { 
     String[] keyValuePair = parameter.split("="); 
     String[] values = queryParameters.get(keyValuePair[0]); 
     values = ArrayUtils.add(values, keyValuePair.length == 1 ? "" : keyValuePair[1]); //length is one if no value is available. 
     queryParameters.put(keyValuePair[0], values); 
    } 
    return queryParameters; 
} 
+0

için giriş akışı tutmak nasıl olduğunu varsayalım kabul olduğunu kabul daha iyi kabul, proxy oluşturma daha iyi değil çünkü neden sorgu dizesi ayrıştırmaktan kaçınmak için bilmiyorum çözüm –