Вызов сервлета из приложения Java

Я хочу вызвать сервлет из приложения Java. Проблема в том, что вызов, похоже, не доходит до сервлета. Я не получаю никаких ошибок, но не дохожу до первого вывода «doPost» в сервлете. Если я открываю URL-адрес в веб-браузере, я получаю, конечно, ошибку, что GET не поддерживается и т. Д., Но, по крайней мере, я вижу, что что-то происходит.

Я использую следующий код (класс ActionPackage содержит только вектор параметров и является сериализуемым):

Приложение Java:

    ActionPackage p = new ActionPackage();
    p.addParameter("TEST", "VALUE");

    System.out.println(p);

    URL gwtServlet = null;
    try {
        gwtServlet = new URL("http://localhost:8888/app/PushServlet");
        HttpURLConnection servletConnection = (HttpURLConnection) gwtServlet.openConnection();
        servletConnection.setRequestMethod("POST");
        servletConnection.setDoOutput(true);

        ObjectOutputStream objOut = new ObjectOutputStream(servletConnection.getOutputStream());
        objOut.writeObject(p);
        objOut.flush();
        objOut.close();

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Сервлет:

public class PushServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doPost");
    ObjectInputStream objIn = new ObjectInputStream(request.getInputStream());

    ActionPackage p = null;
    try {
        p = (ActionPackage) objIn.readObject();

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    System.out.println("Servlet received p: "+p);       
}

}

Есть идеи, что пошло не так?

Спасибо.


person IceJava    schedule 03.12.2010    source источник
comment
Создайте фиктивную страницу формы, которая отправляется в PushServlet с помощью <FORM METHOD="POST" ACTION="http://localhost:8888/app/PushServlet">. Я считаю, что даже локальный HTML-файл будет работать до тех пор, пока он отправляется сервлету по правильному URL-адресу.   -  person Bert F    schedule 04.12.2010


Ответы (2)


URLConnection выполняется только лениво, когда вы вызываете какой-либо из get методов.

Добавьте в свой код следующее, чтобы фактически выполнить HTTP-запрос и получить тело ответа сервлета.

InputStream response = servletConnection.getInputStream();

Смотрите также:

person BalusC    schedule 03.12.2010
comment
О верно! Я забыл об этом. Также обратите внимание, что обычно считается хорошей идеей считывать все данные из ответа InputStream, даже если вас не волнует его содержимое. Это дает JVM больше шансов сохранить соединение для возможного повторного использования в дальнейшем. - person Mike Clark; 04.12.2010
comment
Большое спасибо. После добавления вызов проходит без проблем. - person IceJava; 04.12.2010

Попробуйте обернуть все тело doPost блоком try / catch:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        System.out.println("doPost");
        ObjectInputStream objIn = new ObjectInputStream(request.getInputStream());
        ActionPackage p = null;
        p = (ActionPackage) objIn.readObject();
        System.out.println("Servlet received p: "+p);       
    } catch (Throwable e) {
        e.printStackTrace(System.out);
    }
}

Затем снова посмотрите в файл журнала вывода сервлета или в окно для нового исключения, которое может помочь.

person Mike Clark    schedule 03.12.2010