Связь апплет-сервер, как я могу это сделать?

#java #jsp #applet

#java #веб-сервисы #апплет #клиент-сервер #rmi

Вопрос:

У меня есть апплет, и я должен отправить запрос в веб-приложение, чтобы получить данные с сервера, который находится в базе данных. Я работаю с объектами, и очень полезно, чтобы сервер отвечал мне объектами!!

Как апплет может взаимодействовать с сервером?

Я думаю, что метод веб-сервисов, RMI и … делают меня счастливым, но какой из них лучший и надежный?

Ответ №1:

Пока только ваш апплет взаимодействует с сервером, вы можете использовать сериализованный объект. Вам просто нужно поддерживать одну и ту же версию класса object как в jar апплета, так и на сервере. Это не самый открытый или расширяемый способ, но он быстр с точки зрения времени разработки и довольно надежен.

Вот пример.

Создайте экземпляр соединения с сервлетом

 URL servletURL = new URL("<URL To your Servlet>");
URLConnection servletConnect = servletURL.openConnection();
servletConnect.setDoOutput(true); // to allow us to write to the URL
servletConnect.setUseCaches(false); // Write the message to the servlet and not from the browser's cache
servletConnect.setRequestProperty("Content-Type","application/x-java-serialized-object");
  

Получите выходной поток и напишите свой объект

 MyCustomObject myObject = new MyCustomObject()
ObjectOutputStream outputToServlet;
outputToServlet = new ObjectOutputStream(servletConnection.getOutputStream());
outputToServlet.writeObject(myObject);
outputToServlet.flush(); //Cleanup
outputToServlet.close();
  

Теперь прочитайте в ответе

 ObjectInputStream in = new ObjectInputStream(servletConnection.getInputStream());
MyRespObject myrespObj;
try
{
    myrespObj= (MyRespObject) in.readObject();
} catch (ClassNotFoundException e1)
{
    e1.printStackTrace();
}

in.close();
  

В вашем сервлете

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
  MyRespObject myrespObj= processSomething(request);
  response.reset();
  response.setHeader("Content-Type", "application/x-java-serialized-object");
  ObjectOutputStream outputToApplet;
  outputToApplet = new ObjectOutputStream(response.getOutputStream());
  outputToApplet.writeObject(myrespObj);
  outputToApplet.flush();
  outputToApplet.close();
}

private MyRespObject processSomething(HttpServletRequest request)
{
  ObjectInputStream inputFromApplet = new ObjectInputStream(request.getInputStream());
  MyCustomObject myObject = (MyCustomObject) inputFromApplet.readObject();
  //Do Something with the object you just passed
  MyRespObject myrespObj= new MyRespObject();
  return myrespObj;
}
  

Просто помните, что оба объекта, которые вы передаете, должны реализовывать serializable

  public Class MyCustomObject implements java.io.Serializable
 {
  

Комментарии:

1. спасибо миллион, но могу я спросить, что лучше? веб-сервис для подключения к серверу или сериализованным объектам? я пытаюсь с помощью веб-службы, но у ws-клиента возникла проблема с подключением к серверу (веб-службе)!!!

2. В идеале я бы подумал, что вам нужен веб-сервис, чтобы любые приложения могли получить к нему доступ, не беспокоясь о сохранении текущей копии сериализованного объекта. Если он будет использоваться только вашей группой, я не понимаю, почему вы не могли просто использовать сериализованный объект. Сериализованный объект — проще реализовать, нет синтаксического анализа xml, нет хостинга веб-сервисов. Веб-сервис — более гибкий, возможно, больше времени на разработку. Это действительно вопрос о том, что вам нужно, простой или гибкий.

3. привет, действительно спасибо …, я исправляю проблему подключения к веб-сервису, но у меня проблема, которая приводит меня в уныние, как я могу вернуть arraylist пользовательского объекта -vehicle — из метода веб-службы !!!?? я сделал это, но проблема в том, что на стороне клиента я получаю arraylist объекта!!! если вы знаете, как это решить, пожалуйста, помогите мне…

4. Я не совсем уверен, о чем вы спрашиваете, вы спрашиваете, как использовать arraylist в качестве объекта типа vehicle? На самом деле у вас есть 2 варианта, просто используя общее (транспортное средство) приведение или используя общие функциональные возможности. Чтобы использовать дженерики, вы можете ознакомиться с руководством 1.5 здесь. java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf Если вы используете более старую версию JRE до 1.5, вы не сможете использовать дженерики и вам придется выполнять явные приведения. Если вы можете опубликовать какой-либо код, который поможет понять вашу проблему, пожалуйста, сделайте это.

5. привет, нет, проблема не в этом, проблема не в кастинге, у меня есть веб-сервис, который должен выполнить запрос к БД, чтобы получить информацию о местоположении транспортного средства и создать объект Vehicles и поместить их (объекты Vehicle) в ArrayList… @WebMethod public ArrayList<VehileReport> getVehicles(){ //образец VehileReport v = новый VehileReport(«123″,,»20 км»); ArrayList<VehileReport> список = новый… list.add(v); return list; } на стороне клиента я запускаю это…