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) par postaci: (nazwa1 -> wartosc1), (nazwa2 -> wartosc2). Wyniki zapisane są do zbioru form. Jeśli chcemy teraz pobrać zmienną, np. imie=Jan&… wystarczy napisać

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