Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > метод сервлета из аплета


Автор: lihusha 2.6.2009, 01:51
Доброго времени суток , возможно повторюсь и подобная тема уже была. Не нашел...

Вопрос о чтении сервлетом данных из аплета. В аплете создается выходной поток , в методе сервлета - входной. Как теперь  вызвать метод doPost() ( или же doGet()) средствами  аплета ? И возможно ли это ?
Спасибо.

Автор: Alex089 2.6.2009, 10:22
может просто делать HTTP-запрос из апплета в сервлет

Автор: lihusha 2.6.2009, 17:38
А можно пример ?
Каким методом аплета можно сделать HTTP запрос ?

Автор: Alex089 2.6.2009, 18:44
Код

String host = "localhost";
int port = 80;
String path = "/servlet/";
String data = "передаваемые данные";
// подключаемся к серверу
Socket s = new Socket(host, port);
// создаем HTTP-заголовок
String requestBody = "data="+data;
String request = "POST "+path+" HTTP/1.1\r\n" +
     "Host: "+host+"\r\n" +
     "Content-Type: application/x-www-form-urlencoded\r\n" +
     "Content-Length: "+requestBody.length()+"\r\n\r\n" +
     requestBody;
// запрос к серверу
OutputStream os = s.getOutputStream();
os.write(request.getBytes());
// получаем поток данных от сервера
InputStream is = s.getInputStream();
// читаем ответ сервера
byte[] buf = new byte[64*1024];
int r = is.read(buf);
s.close();
String response = new String (buf,0,r);

В response будет заголовок HTTP-ответа и то, что верное сервлет через response.getWriter().println(someString)

Внутри сервлета параметры (они же передаваемые данные) получают так: 
Код

String data = request.getParameter("data");

Автор: Alex089 2.6.2009, 18:59
Да, чуть  не забыл. Этот запрос будет обрабатываться методом doPost. Для doGet надо изменить заголовок запроса:
Код

String host = "localhost";
int port = 80;
String path = "/servlet/";
String data = "передаваемые данные";
// подключаемся к серверу
Socket s = new Socket(host, port);
// создаем HTTP-заголовок
String request = "GET "+path+"?data="+data+" HTTP/1.1\r\n" +
     "Host: "+host+"\r\n" +
     "Content-Type: application/x-www-form-urlencoded\r\n\r\n";

И по умолчанию в настройках безопасности JVM для апплетов задано, что устанавливать соединение можно только с тем хостом, с которого апплет был загружен.

Автор: lihusha 2.6.2009, 20:22
метод аплета
Код

private void sendPostMessage(String message) throws UnknownHostException, IOException {
        String host = "localhost";
        int port = 80;
//веб-приложение "WebTest", сервлет "/Controller"
        String path = "WebTest/Controller";
        String data = "передаваемые данные";

        Socket s = new Socket(host, port);

        String requestBody = "data=" + data;
        String request = "POST " + path + " HTTP/1.1\r\n" +
                "Host: " + host + "\r\n" +
                "Content-Type: application/x-www-form-urlencoded\r\n" +
                "Content-Length: " + requestBody.length() + "\r\n\r\n" +
                requestBody;

        OutputStream os = s.getOutputStream();
        os.write(request.getBytes());

    }



метод doPost() сервлета
Код


protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException 
    {

        System.out.println("Controller : doPost();");
        String data = request.getParameter("data");
        System.out.println(data);

    }



метод doPost() не срабатывает...
 smile

метод sendPostMessage(String message) вызывается нажатием кнопки в окне аплета

Код

public void actionPerformed(ActionEvent e) {

        if (e.getSource() instanceof JButton) {
            JButton b = (JButton) e.getSource();
            if (b.getName().equals("send")) {

                try {


                    sendPostMessage(text.getText());


                } catch (MalformedURLException ex) {
                    Logger.getLogger(Viewer.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Viewer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }
    }

Автор: Alex089 2.6.2009, 23:15
Цитата(lihusha @  2.6.2009,  20:22 Найти цитируемый пост)
String path = "WebTest/Controller";

Попробуй так 
Код

String path = "/WebTest/Controller/";

Контейнер приложений 80-ый порт слушает? (у тебя похоже NetBeans. Там Tomcat слушает 8084, а GlassFish - 8080) 
При выполнениее код не бросает исключение? 
В методе "sendPostMessage" сокет не закрыт.

Автор: lihusha 3.6.2009, 21:58
Получилось , спасибо !
Метод сервлета срабатывает. Дело было в номере порта,- 8084(tomcat)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)