Serwlet. HttpServletRequest w metodzie init().

0

Witam. :)

To moja pierwsza przygoda z językiem Java... Serwlet (metoda GET) ma wykonywać proste obliczenia matematyczne i zapisywać je do bazy danych. Załadowanie sterownika bazy danych i nawiązanie połączenia z nią ma wykonać się tylko raz, podczas uruchamiania serwletu.

Nawiązanie połączenia z bazą danych JDBC nie stanowi problemu. Na stronie www (właściwie index.jsp środowiska netbeans) umieściłem kilka chceckbox-ów. Jeśli podczas uruchamiania serwletu baza danych nie istnieje, to:
a. jest tworzona, gdy jeden z chceckbox-ów jest zaznaczony,
b. nie jest tworzona, jeśli wspomniany chceckbox nie jest zaznaczony (dane wypisywane są tylko na ekran).

Sama realizacja tworzenia, lub nie, bazy danych nie stanowi problemu. Problemem dla mnie jest przekazanie statusu chceckbox-u przy ładowaniu serwletu - poprzez metodę init(). Nie za bardzo wiem jak przekazać do niej HttpServletRequest req, jeśli w ogóle jest to w takim układzie możliwe. Jakkolwiek próbowałem to zapisać otrzymywałem wyjątek NullPointerException przy próbie pobierania wartości chceckbox-u (dbOpts). Co jak sądzę jest powodowane tym, że HttpServletRequest req jest niejako niezdefiniowane w metodzie init(). W dalszej części kodu (metoda doPost0) taki sposób pobierania wartości checkbox-u - jak w kilku pierwszych linijkach metody init() - działa bezproblemowo.

Poniżej okrojony fragment kodu programu. Zdaję sobie sprawę z tego, że to nie jest poprawny kod, ale bardziej chodziło mi o pokazanie w którym miejscu, i co chciałbym mieć = req.getParameterValues("dbOpts") "widzialne" w metodzie init(). Byłbym wdzięczny za pomoc w naprowadzeniu na właściwy trop. Pozdrawiam. :)


public class MyServlet extends HttpServlet {
ServletConfig cfg;
Connection con;

@Override
public void init() {
boolean dbOptFlag = true; //Flaga on/off.
//Opcje bazy danych... **Tutaj chciałbym odczytać status chceckbox-u**
if (req.getParameterValues("dbOpts") != null) {
String[] dbOpts = req.getParameterValues("dbOpts");
/*for (int i = 0; i < dbOpts.length; i++) {
    System.out.println(" : " + dbOpts[i]);
}*/
} else {
dbOptFlag = false; //Żadna opcja bazy danych nie zaznaczona.
}

//[...] Pobieranie opcji konfiguracyjnych serwletu.		
}

@Override
public void destroy() {
    try {
        con.close();
    } catch (SQLException e) {
        System.err.println("Unexpected error at closing database connection.");
   }
}

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException {
    resp.setContentType("text/html; charset=UTF-8");
    PrintWriter out = resp.getWriter();

    if (resp.getStatus() == resp.SC_OK) {//200
        //[...] Tutaj są pobierane i przetwarzane opcje ze strony www
    } else {//Obsługiwane kody błędów HTTP
    //[...]
    }
    out.close();
}

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException, NullPointerException {
    try {
        doPost(req, resp);
    } catch (NullPointerException e) {//Gdybyśmy usunęli lub zmienili nazwę w pasku adresu...
        resp.sendError(resp.SC_BAD_REQUEST, "Please, use /? for help.");
    }
}

}


0

Jak sam zauważyłeś w metodzie init nie masz dostępu do parametrów przekazanych w zapytaniu. Proponuję ci w init utworzyć połączenie (zawsze), a w metodzie doPost użyć tego połączenia lub nie, w zależności od tego, czy w polu stoi ptaszek czy też nie.

0

Dziękuję za odpowiedź.

Tyle tylko, że jakkolwiek próbowałem przekazywać ten parametr do metody init to efekt był ten sam - NullPointerException. To o czym wspominasz raczej nie rozwiązuje problemu, bo jeśli baza danych nie będzie istniała połączenie nie zostanie zrealizowane. A mi chodzi o to, żeby był wybór - bez pytania w trakcie działania serwletu - jak ma się on (serwlet) zachowywać tj. tworzyć bazę danych czy nie. Chyba, że czegoś nie rozumiem w Twojej propozycji?
To co chciałem osiągnąć nie jest jednym z warunków zaliczenia ćwiczenia, ale... Raz... ponieważ zdarza się, że piszę program na kilku kompach to muszę pamiętać o tym, żeby bazę danych utworzyć w środowisku netbeans. Dwa... Mam trochę inną organizację podawanie danych, więc potrzebuję bazy danych z inną organizacją pól w tabeli. A w całej zabawie chodzi mi o przyswojenie sobie przekazywania parmetrów ze strony www przy inicjacji serwletu. :)
Na razie ustawiłem chceckbox jako disabled (& checked) i ustawiłem opcję na sztywno (pominę ją w metodzie init). Inne opcje odnoszą się do obliczeń matematycznych, więc ich nie potrzebuję przy inicjacji serwletu.

Pozdrawiam. :)

BTW

Poniższa definicja metody init nie wykona się przy wywołaniu serwletu.
public void init(HttpServletRequest req) throws NullPointerException {}
Z kolei zdefiniowanie zmiennej globalnej np.
HttpServletRequest request = null; //Pamiętam, że w metodzie init trzeba podmienić nazwe zmiennej
a następnie umieszczenie gdzieś w metodzie doGet lub doPost:
reqest = req; //Bądź utworzenie metody zwracającej req
także niczego nie rozwiązuje.
Są jakieś inne sposoby? :)

0

Poczytaj sobie do czego służy init i jak ona działa, np tu http://www.digilife.be/quickreferences/PT/Building%20Java%20HTTP%20servlets.pdf Podpowiem że nie służy ona do przetwarzania requestów. Musisz inaczej zaprojektować działanie twojego serwletu.

0

Dzięki za link, przydał się. Przepraszam, że dopiero teraz odpisuję ale wysłałem program na zaliczenie i chciałem poczekać na ocenę. Zaliczone... Nic nie zmieniałem bo, pozbawiłbym się szansy na min. 4. Można zamknąć, nie wiem czy do tematu jeszcze wrócę.

Jeszcze raz dziękuję za przydatne sugestie. Pozdrawianm. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1