Problem navic je, ze obcas byva v URL nekolik parametru stejneho jmena s ruznymi hodnotami (parkrat jsem se s tim uz setkal). Takze pouziti HashMap<String name, String value> nemusi byt vzdy vhodne.

Petr


Martin Kuba wrote:
Lukáš Zapletal napsal(a):
Zdravim,

potreboval bych najit v Java Core API kod, ktery mi z URI.getQuery
(resp. getRawQuery) vrati nejakou mapu nebo neco, abych si mohl cist
jednotlive parametry. Nechce se mi to (parser) psat, nebo pouzit cizi
kod. Vim, ze je to trivialni, ale musely by se napsat testy a zcela
jiste by to nejaky cas trvalo. Urcite to nekde uz je hotove (minimalne
v Servlet API), jen bych potreboval nasmerovat, kde :-)

K tomuto jednu poznámku - není definováno, jak jsou parametry odděleny,
takže taková metoda nemůže být univerzální.

RFC 3986 definující URI parametry nedefinuje.

Ve specifikaci HTML je uvedeno, že prohlížeče mají data z HTML formulářů
posílat ve tvaru parametr=hodnota oddělené znakem &
(viz http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4)
ale ve stejné specifikaci je na jiném místě napsáno,
že parametry předávané v URI by měly používat něco jiného
než &, nejlépe středníky ;, viz
http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.2

Z tohoto zmatku vyplynulo, že server-side frameworky používají
jako oddělovač &, protože to posílají prohlížeče z formulářů
předávaných GET. Ale jsou vývojáři (třeba u nás vývojáři IS MU),
kteří používají v URL jako oddělovač zásadně středníky
(parsují parametry totiž ručně v Perlu).

Čili nelze se obecně spolehnout na to, že parametry v URI
budou mít určitý oddělovač. Pokud se rozhodnete, že chcete
povolit jenom ampersandy, pak by mělo stačit


    public static HashMap<String, String> parseURIQuery(URI uri) throws 
UnsupportedEncodingException {
        HashMap<String,String> map = new HashMap<String, String>();
        String ss = uri.getQuery();
        for(String s: ss.split("&")) {
            String[] par = URLDecoder.decode(s,"utf-8").split("=");
            map.put(par[0],par.length>1?par[1]:"");
        }
        return map;
    }

    public static void main(String[] args) throws URISyntaxException, 
UnsupportedEncodingException {

        URI uri = new URI("http://www.neco.cz/hu?a=1&b=c+2%20d&d";);

        HashMap<String, String> map = parseURIQuery(uri);

        System.out.println("map = " + map);
    }

Jo, ještě taky URI nemají definováno kódování, ale utf-8 je doporučeno.


Makub

Odpovedet emailem