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


Автор: Swatch 28.1.2008, 11:03
Добрый день

столкнулась со следующей проблемой: надо передать данные с клиента сервлету, чтобы он сохранил данные в БД. 
Вот моя реализация. 
клиент:
Код

public static Boolean setCategory(IEntity obj) {
             String data = URLEncoder.encode("SaveCategories", "UTF-8") + "=" + URLEncoder.encode("Category", "UTF-8");
            // Send data
            URL url = new URL("http://localhost:8080/RS_Blog__server_/CategoryServlet?" + data);
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            XMLEncoder e = new XMLEncoder(
                    new BufferedOutputStream(conn.getOutputStream()));
            e.writeObject(obj); //obj - класс таблицы категорий с геттерами и сеттерами
            e.close();
...
}


сервлет:
Код

protected void categoriesSave(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
response.setContentType("text/xml;charset=UTF-8");

        String e = (String) request.getParameter("SaveCategories");
        if (e != null) {
            if (e.equals("Category")) {
                XMLDecoder d = new XMLDecoder(new BufferedInputStream(request.getInputStream()));
                HibernateUtil.Save((IEntity) d.readObject());
                d.close();
            }
        }
}


на клиенте вызываю метод setCategory:
Код

ConnectToServer.setCategory(obj);


сервлету вообще ничего не передается... пыталась через system.out.println() посмотреть, что приходит... но ничего не получаю, видимо, ничего не приходит... smile  где может быть ошибка??? кто-нибудь знает, как данные с клиента сервлету передать???  smile 

Автор: LSD 28.1.2008, 14:10
Скорее всего ты просто шлёшь на сервер свой объект сериализованный в XML и все. Без всяких HTTP заголовков, и сервер его просто игнорирует т.к. не понимает подобного запроса.

Используй http://hc.apache.org/httpclient-3.x/.

Автор: Swatch 28.1.2008, 14:43
А можно пример использования HttpClient-а для передачи данных сервлету?

и что, хмл-ками вообще сервлету ничего передать нельзя?

Автор: LSD 28.1.2008, 15:36
Цитата(Swatch @  28.1.2008,  14:43 Найти цитируемый пост)
А можно пример использования HttpClient-а для передачи данных сервлету?

На оффсайте полно http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/ (есть даже PostXML) smile 


Цитата(Swatch @  28.1.2008,  14:43 Найти цитируемый пост)
и что, хмл-ками вообще сервлету ничего передать нельзя? 

Да можно конечно. Я говорил не о том, ты должна передать корректный HTTP запрос, чтобы сервер мог его обработать. А не просто записать XML в поток. Поэтому или формировать HTTP заголовок самостоятельно или использовать утилиты.

Автор: COVD 28.1.2008, 16:57
Swatch, в ваш пример надо добавить conn.getInputStream(); после записи обьекта. Таким образом вы дадите понять клиенту, что закончили писать данные и переходите к чтение ответа сервера. И тогда данные, записанные в буфер операцией writeObject, будут отправлены на сервер. А так они не отправляются. Сделано так потому, что метод post требует указания в хедере размера пересылаемых данных. Пока вы не закончили писать в буфер, размер определить нельзя.  

Автор: Swatch 29.1.2008, 10:12
хммм... поставила conn.getInputStream() после e.writeObject(obj) в клиенте. получила следующую ошибку
лог томКэт-а:
Код

29.01.2008 11:07:51 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet CategoryServlet threw exception
java.util.NoSuchElementException
        at java.util.Vector.lastElement(Vector.java:456)
        at com.sun.beans.ObjectHandler.lastExp(ObjectHandler.java:134)
        at com.sun.beans.ObjectHandler.dequeueResult(ObjectHandler.java:138)
        at java.beans.XMLDecoder.readObject(XMLDecoder.java:201)
        at com.solovatsoft.rs_blog.servlets.CategoryServlet.categoriesSave(CategoryServlet.java:49)
        at com.solovatsoft.rs_blog.servlets.CategoryServlet.doPost(CategoryServlet.java:66)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:619)


лог-клиента:
Код

java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/RS_Blog__server_/CategoryServlet?SaveCategories=Category
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1245)
        at com.company.proj.businessLogic.ConnectToServer.setCategory(ConnectToServer.java:81)
        at com.company.proj.MainForm.fillDatabaseActionPerformed(MainForm.java:447)
        at com.company.proj.MainForm.access$600(MainForm.java:59)
        at com.company.proj.MainForm$6.actionPerformed(MainForm.java:241)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
BUILD SUCCESSFUL (total time: 19 seconds)


что это такое, не подскажете? почему возникает ошибка???

Автор: Ulysses4j 29.1.2008, 10:48
Swatch, вам же сказали, нельзя с Томкатом так общаться, с ним надо по http://ru.wikipedia.org/wiki/HTTP разговаривать. Вы что-нибудь слышали о http://ru.wikipedia.org/wiki/Сетевой_протокол вообще? Использование определенного протокола налагает набор требований на формат пересылаемых сообщений, нельзя просто одни данные (ваш XML-кодированный объект) слать, нужно еще разной метаинформации (информации о пересылаемой информации и ее отправителе)... Если вам хочется просто пересылать информацию, нужно написать свой маленький сервер и использовать его вместо Tomcat: повесить на другой порт и слушать его, если позволяют привилегии на серверной машине. Для Tomcat наиболее распространены http://ru.wikipedia.org/wiki/Тонкий_клиент — на основе браузера. Писать толстый клиент для Tomcat с вашей подготовкой, судя по вему, дело на данный момент малоперспективное — вы уж не обижайтесь: это самый сложный из трех вариантов (тонкий клиент, свой маленький сервер, толстый клиент).

Автор: Swatch 29.1.2008, 11:20
Вообще, о сетевых протоколах я много чего слышала... просто раз сказали, что надо вставить conn.getInputStream(), я и попробовала... и ничего страшного нет, если человек пытается начать со сложного...

Автор: Ulysses4j 29.1.2008, 11:30
Цитата(Swatch @  29.1.2008,  12:20 Найти цитируемый пост)
ничего страшного нет, если человек пытается начать со сложного...

Страшного нет ничего — это верно. Просто вряд ли у него что-то получится: учатся обычно от простого к сложному — тут впору не про сетевые протоколы говорить, а про «Рассуждение о методе» Декарта и т. п. Хотя, если не охота с Декартом связываться, надо просто читать книжки: про те же сетевые протоколы и написание сетевых приложений в Java, скажем — ведь есть литература соответсвующая. Форумы все-таки не могут заменить определенный базовый бэкграунд.
Цитата(Swatch @  29.1.2008,  12:20 Найти цитируемый пост)
 сказали, что надо вставить conn.getInputStream(), я и попробовала... 

Вспоминается совет из книжки «Программист-прагматик», кажется: не программируйте в расчете на случай.

Автор: Swatch 29.1.2008, 14:18
может быть кому-то решение моей проблемы покажется кривым, накопала пару примеров и к своей реализации кое-что добавила. в итоге получилось следующее.
клиент:
Код

public static void setCategory(IEntity obj) {
        try {
            URL url = new URL("http://localhost:8080/RS_Blog__server_/SaveServlet");
            URLConnection conn = url.openConnection();
            conn.setRequestProperty("Content-Type", "application/x-java-serialized-object");
            conn.setDoOutput(true);
            XMLEncoder e = new XMLEncoder(
                        new BufferedOutputStream(conn.getOutputStream()));
            e.writeObject(obj);            
            e.close();
            conn.getInputStream();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

сервлет:
Код

protected void categoriesSave(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        XMLDecoder d = new XMLDecoder(new BufferedInputStream(request.getInputStream()));
        IEntity entity = (IEntity) d.readObject();
        System.out.println(entity);
        HibernateUtil.Save(entity);
        d.close();
    }


в итоге, все отлично сохраняется в базу... COVD спасибо за помощь... Ваша строчка стала решающей!!! smile

Добавлено через 2 минуты и 29 секунд
ах, да... еще для классика БД я добавила 
Код

implements java.io.Serializable 

Автор: LSD 30.1.2008, 13:54
Цитата(Swatch @  29.1.2008,  14:18 Найти цитируемый пост)
в итоге, все отлично сохраняется в базу... COVD спасибо за помощь... Ваша строчка стала решающей!!!

http://forum.vingrad.ru/forum/topic-24037.html smile 

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