W drugim programie CGI odczytamy zmienne z formularza HTML, który wywołał nasz skrypt. Wykorzystamy do tego celu nową strukturę danych Map
funkcja _GET() rozbraja dane wejściowe zapisane w zmiennej systemowej QUERY_STRING w postaci nazwa1=wartosc1&nazwa2=wartosc2
na zbiór (Map
1 | String imie = form.get("imie"); |
Do zmiennej imie zostanie przypisana wartość „Jan”.
Nazwa _GET nie jest żadną nazwą specjalną, znak _ nie oznacza niczego specjalnego. Nazwa ta pochodzi z PHP i jest odpowiednikiem analogicznej tablicy, w której zapisane są te same parametry np. $_GET[ 'imie’ ]
UWAGA! Plik formularza MUSI znajdować się w INNYM katalogu, niż cgi-bin, gdyż nie jest to program wykonywalny CGI, tylko plik HTML
form.html (zmieniamy tylko user na swojego użytkownika):
1 2 3 4 5 6 7 8 9 10 11 12 13 | <HTML lang="pl"> <head> <title>Formularz uruchamiający program CGI</title> <meta charset="utf-8"> </head> <body> <form action="/~user/cgi-bin/form.cgi" method="GET"> Imię: <input name="imie"><br> Nazwisko: <input name="nazwisko"><br> <input type="submit" value="Uruchom CGI"> </form> </body> </html> |
form.java (skompilowany form.class musi być w katalogu cgi-bin):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import java.util.Map; import java.util.LinkedHashMap; import java.net.URLDecoder; class form { public static Map<String, String> _GET() { //funkcja _GET będzie pobierać wszystkie znalezione zmienne String parametry; try //dbamy o polskie znaki w stringu { parametry = URLDecoder.decode( System.getenv("QUERY_STRING"), "UTF-8" ); } catch (Exception e) //w przypadku braku obsługi UTF, co się nie zdarzy w Javie { parametry = System.getenv("QUERY_STRING"); } if (parametry!=null && parametry.length()>1) { Map<String, String> form = new LinkedHashMap<String, String>(); for(String keyValue : parametry.split(" *& *")) { String[] pairs = keyValue.split(" *= *", 2); form.put(pairs[0], pairs.length == 1 ? "" : pairs[1]); } return form; } else return null; } public static void main(String args[]) { System.out.println( "Content-type: text/html; charset=UTF-8\n\n" + //musi być jako 1sza linia "<HTML lang="pl">\n" + "<HEAD>\n" + "<meta charset="utf-8" />"+ "<TITLE>Test skryptu CGI w Javie</TITLE>\n" + "</HEAD>\n" + "<BODY>\n" + "<H1>Program JAVA czytający dane z formularza</H1>\n" + "Wszystkie parametry z formularza:\n" + "<ul> " ); Map <String, String> form = _GET(); //pobranie wszystkich zmiennych formularza for (String parametr : form.keySet()) //wypisanie WSZYSTKICH znalezionych zmiennych System.out.println( "<li>" + parametr + " = " + form.get(parametr) + "</li>\n" ); //String imie = form.get("imie"); //a tak pobieramy konkretną zmienną, System.out.println ("</ul> </body> </html>"); } } |
katalog: cgi-bin
form.cgi
1 2 3 | #!/bin/bash java -Dfile.encoding=UTF-8 form exit 0 |
Procedura:
Kompilacja:
1 | javac form.java |
Uprawnienia:
1 | chmod a+x form.cgi |
Uruchomienie:
1 | http://server.com/~user/formularz.html |
Działający przykład:
Test formularza przekazującego dane do aplikacji JAVA