Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

РассылкиАрхив Java programmingВыпуск 6-й

Здравствуйте дорогие читатели!

В сегодняшнем шестом номере опять же происходят некоторые трансформации, и всё это происходит по вашим просьбам и предложениям. По проведённому, в прошлом номере, опросу было принято решение включить раздел JavaScript, но пока этот раздел будет содержать только ответы на ваши вопросы, и развиваться он будет только по вашим просьбам.

Содержание

1. Начинающим
2. Тема "на заказ"
3. Вопрос - ответ
4. Программный код…
5. JavaScript

Начинающим

Сегодняшняя тема будет посвящена инструментарию разработчика, толчком для этого послужило письмо присланное Сергеем Ивачёвым, содержание которого несёт следующий смысл:

Сергей ссылается на недостаточность информации для начинающих и изобилие специальных терминов, от которых несколько "сушит мозги". Так же Сергей попросил дать ссылку, где можно скачать Java и при этом снабдить её инструкцией по установке.

Я вполне согласен с Сергеем и попробую избавиться от излишка таких "сушащих мозги" терминов или, по крайней мере, дать им объяснение и расшифровку. Что касается установки Java, приступим.

Где взять SDK

Конечно же, прежде чем приступить к написанию Java-программ необходимо установить набор средств для разработки приложений Software Development Kit (SDK). Взять этот набор средств можно по адресу http://java.sun.com/j2se/1.3/ , он распространяется бесплатно и работает на большинстве стандартных платформ.

На странице вам будет предложено выбрать SDK для операционной системы, которая установлена на вашем компьютере:

Solaris SPARC/x86
Linux x86
Microsoft Windows

В разделе Microsoft Windows вам будет предложено загрузить Java 2 SDK, версии 1.3.1_01 для Windows 95/98/2000/NT 4.0 /ME (Intel Platform).
Далее нажимаете кнопочку Continue.
Ознакомитесь с лицензией и жмите Accept.
Вам будет предложено скачать SDK с разных точек планеты…
Жмите на FTP download from java.sun.com

Если вы выберите Linux x86 , проделайте те же самые действия.

А в разделе Solaris SPARC/x86 вам будет предложено выбрать платформу и версию операционной системы и далее следовать тем же путём что и для Microsoft Windows .

Программа установки представляет собой саморазворачивающийся архив. Следуйте интуитивно понятным инструкциям.

Интегрированные средства разработки

Что касается средств разработки, то их не малое количество. Для начала предлагаю вам ознакомится с JСreator, прост но позволит отточить навыки, набирая текст в ручную. Более опытным советую JBuilder, хотя у него есть масса недостатков, но они не видны за положительной стороной.

JCreator можно взять здесь http://www.jcreator.com

Тема "на заказ"

В сегодняшнем выпуске мы напишем небольшую программу, то есть две: программу сервер и программу клиент.

RMI поддерживает объекты Java, осуществляющие связь через их методы, независимо от того, где эти объекты размещены.

Первым шагом для создания класса, к которому можно будет обратиться дистанционно - это определение интерфейса, описывающего методы, которые являются дистанционно разделяемыми.


import java.rmi.*;
public interface YGInterface extends Remote
{
 public String getMoreInfo() throws RemoteException;
}

Вот этот интерфейс описывает метод getMoreInfo(), который будет возвращать строку содержащею информацию о сервере.

Далее мы должны разработать код сервера. Сервер осуществляет объектный интерфейс и создает образцы объекта, который будет дистанционно разделяем.


import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
public class YGServer extends UnicastRemoteObject implements YGInterface 
{
 public YGServer() throws RemoteException
 {
 }
 public String getMoreInfo()
 {
  return "This YGServer server version 0.00";
 }
 public static void main(String args[])
 {
  try 
  {
   RMISecurityManager security = new RMISecurityManager();
   System.setSecurityManager(security);
   YGServer server = new YGServer(); 
   Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
   registry.rebind("YGServer",server);
   System.err.println("YGServer ready...");
  }
  catch (Throwable e)
  {
   System.err.println("exception: " + e);
   System.exit(1);
  }
 }
}

YGServer является расширением стандартного класса Java.rmi.server.UnicastRemoteObject.

В процедуре main() устанавливаем защиту, так как RMI загружает удаленные .class файлы, а это всегда небезопасно. Делается это путём установки security manager.

Затем образец YGServer регистрируется с помощью службы Registry.rebind и становится доступным клиенту по имени.

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

Класс stub(заглушка), для нашего примера выглядит так:

public class YGServer_Stub extends java.rmi.server.RemoteStub
implements YGInterface, java.rmi.Remote { ... }

и скелетон - так:

public class YGServer_Skel implements
java.rmi.server.Skeleton { ... }

Соответствующие .class файлы генерируются из серверного .class файла через RMI транслятор. Стаб обеспечивает функции приема передачи на стороне клиента, а скелетон - на стороне сервера. При этом производится преобразование объектов в последовательную форму, а проще говоря, в поток байтов, передаваемых с помощью протокола TCP/IP.

Следующим шагом будет разработка клиентского кода.


import java.rmi.*;
import java.rmi.server.*;
public class YGClient 
{
 public static void main(String args[])
 {
  try 
  {
   String host = "localhost";
   String server = "YGServer";
   String name = "rmi: //" + host + "/" + server;
   YGInterface obj = (YGInterface)Naming.lookup(name);
   String results = obj.getMoreInfo();
   System.out.println(results);
  }
  catch (Throwable e)
  {
   System.err.println ("exception: " + e);
   System.exit (1);
  }
 }
}

Остаётся только произвести компиляцию кода. Три полученных файла YGInterface, YGServer, YGClient компилируются обычным образом в Java. А вот чтобы получить YGServer_Skel.class и YGServer_Stub.class файлы нужно выполнить rmic YGServer.

Для выполнения клиента вам понадобятся файлы YGInterface.class, YGClient.class, и YGServer_Stub.class
Для выполнения сервера - YGInterface.class, YGServer.class, YGServer_Skel.class, и YGServer_Stub.class

Вот тут( в разделе примеры) вы можете взять jar-архивы для клиента и для сервера.

В следующем номере мы рассмотрим более сложный пример и попробуем создать примитивный пример имитации работы ICQ.

Вопрос - ответ

Вопрос:
1.Как можно организовать Drag'n'drop в Java?
2. Когда создается stub-объект к удаленному (skeleton) объекту в RMI, как система реагирует на обрыв связи между клиентом и сервером? Создает ли она новый объект или пытается работать с уже созданным?
Андрей Похилько

Ответ:
1. Пример реализации Drag & Drop помещаю в раздел "Программный код…".
2. При обрыве связи генерируется исключение:
exception: 
  java.rmi.UnmarshalException: Error unmarshaling return header; nested
exception is:
  java.net.SocketException: Connection reset by peer: JVM_recv in socket input stream read

Как видно из предыдущего примера, что все действия заключены в блоке try {} catch (Throwable e) {} и при генерации любого исключения мы выходим за пределы блока. Это явно повлечёт за собой создание нового объекта, так как за приделами блока объект нам не доступен.

Вопрос:
Меня интересует вопрос, что такое и для чего нужно JSP и как в него включается код на JavaScript.
Sergey Grinkevich

Ответ:
По поводу данного вопроса предлагаю посмотреть статью JSP: Java Server Pages.

Программный код…

Вот простой пример реализации Drag & Drop. Я воздержусь от комментариев и предложу рассмотреть данный вопрос детальней в следующем номере.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
public class DragAndDrop extends Frame
{
 JButton button = new JButton("Hello");
 JPanel panel = new JPanel();
 public DragAndDrop()
 {
  addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    dispose();
    System.exit(0);
   }
  });
  this.add(panel);
  panel.add(button);
  setDrag();
 }
 public static void main(String args[])
 {
  System.out.println("Starting Drag And Drop Example ...");
  DragAndDrop mainFrame = new DragAndDrop();
  mainFrame.setSize(400, 400);
  mainFrame.setLocation(100,100);
  mainFrame.setTitle("Drag And Drop Example");
  mainFrame.setVisible(true);
 }
 void setDrag()
 {
 // Внутренние классы для поддержки Drag and Drop
 class ViewTransferable implements Transferable
 {
  DataFlavor[] flavors = new DataFlavor[]{DataFlavor.stringFlavor};
  public ViewTransferable()
  {
  }
  public DataFlavor[] getTransferDataFlavors()
  {
   return flavors;
  }
  public boolean isDataFlavorSupported(DataFlavor flavor)
  {
   if (flavor.equals(flavors[0]))
   {
    return true;
   }
   return false;
  }
  public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException
  {
   if (!isDataFlavorSupported(flavor))
   {
    System.out.println("unsuported flavor");
    return null;
   }
   if (flavor.equals(flavors[0]))
   {
    return(null);
   }
   return null;
  }
 }
 class CanvasDragSource implements DragGestureListener, DragSourceListener
 {
  CanvasDragSource()
  {
   DragSource dragSource = DragSource.getDefaultDragSource();
   dragSource.createDefaultDragGestureRecognizer(button,DnDConstants.ACTION_COPY_OR_MOVE,this);
  }
  public void dragGestureRecognized(DragGestureEvent dge)
  {
   Point p = dge.getDragOrigin();
   int x = (int)p.getX();
   int y = (int)p.getY();
   Transferable transferable = new ViewTransferable();
   dge.startDrag(null,transferable,this);
  }
  public void dropActionChanged(DragSourceDragEvent dsde){}
  public void dragEnter(DragSourceDragEvent dsde){}
  public void dragOver(DragSourceDragEvent dsde){}
  public void dragExit(DragSourceEvent dse){}
  public void dragDropEnd(DragSourceDropEvent dsde){}
 }
 class CanvasDropTarget implements DropTargetListener
 {
  DropTarget dropTarget;
  boolean acceptableType;
  CanvasDropTarget()
  {
   dropTarget = new DropTarget(panel, DnDConstants.ACTION_COPY_OR_MOVE,this,true,null);
  }
  public void dragOver(DropTargetDragEvent dtde)
  {
   acceptOrRejectDrag(dtde);
  }
  public void dropActionChanged(DropTargetDragEvent dtde)
  {
   acceptOrRejectDrag(dtde);
  }
  public void dragExit(DropTargetEvent dte){}
  public void drop(DropTargetDropEvent dtde)
  {
   if ((dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0)
   {
    dtde.acceptDrop(dtde.getDropAction());
    dtde.getDropTargetContext().dropComplete(true);
    double x = dtde.getLocation().getX();
    double y = dtde.getLocation().getY();
    button.setLocation((int)x,(int)y);
   }
   else
   {
    dtde.rejectDrop();
   }
  }
  public void dragEnter(DropTargetDragEvent dtde)
  {
   checkTransferType(dtde);
   acceptOrRejectDrag(dtde);
  }
  boolean acceptOrRejectDrag(DropTargetDragEvent dtde)
  {
   int dropAction = dtde.getDropAction();
   int sourceActions = dtde.getSourceActions();
   boolean acceptedDrag = false;
   if (!acceptableType || (sourceActions &DnDConstants.ACTION;_COPY_OR_MOVE) == 0)
   {
    dtde.acceptDrag(DnDConstants.ACTION_COPY);
    acceptedDrag = true;
   }
   else if ((dropAction & DnDConstants.ACTION_COPY_OR_MOVE ) == 0)
    {
     dtde.acceptDrag(DnDConstants.ACTION_COPY);
     acceptedDrag = true;
    }
   return acceptedDrag;
  }
  void checkTransferType(DropTargetDragEvent dtde)
  {
   acceptableType = dtde.isDataFlavorSupported(DataFlavor.stringFlavor);
  }
 }
 new CanvasDragSource();
 new CanvasDropTarget();
 }
}

jar-архив для данного примера можно взять тут.

JavaScript

Вопрос:
Как мне создать документ в новом окне?

Ответ:
Я думаю, подразумевается динамическое создание документов?

<html;>
<head;>
<script; language="JavaScript">
<!-- hide
function newWindow()
{
 window1= open("", "displayWindow","width=500,height=400,status=yes,toolbar=yes,menubar=yes");
 // открваем объект document для последующей печати
  window1.document.open();
  // генерируем новый документ
  window1.document.write("<html;><head;><title;>Новое окно!!!");
  window1.document.write("</title></head><body;>");
  window1.document.write("<center;><font; size=3>");
  window1.document.write("Данный документ был создан с помощью JavaScript!");
  window1.document.write("</font></center>");
  window1.document.write("</body></html>");
  // закрываем документ
  window1.document.close();  
}
// -->
</script>
</head>
<body;>
<form;>
<input; type=button value="Новое окно..." onClick="newWindow()">
</form>
</body>
</html>

Вопрос:
Как мне узнать координаты курсора мышки после нажатия кнопочки?
Serj

Ответ:

<script; language="JavaScript">
<!--
  window.captureEvents(Event.CLICK);
  window.onclick= displayCoords;
  function displayCoords(e) {
  alert("x: " + e.pageX + " y: " + e.pageY);  }
// -->
</script>

Вопросы присылайте на E-mail [email protected] с пометкой "вопрос по Java".

Жду вопросов и предложений.
Юрий Ладик.
Подписаться на эту рассылку можно тут /subs/subs.html


Дэвид Флэнаган
"Java в примерах. Справочник"
Подробнее>>
Заказать>>


Питер Вейнер
"Java и JavaScript"
Подробнее>>
Заказать>>

Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Apache Struts 2.0.11
Apache MyFaces Trinidad Core 1.2.3.
Sun переводит мобильные устройства с Java ME на Java SE
Хакерская атака!



Выпуск 29-й
Выпуск 28-й
Выпуск 27-й
Выпуск 26-й
Выпуск 25-й
Выпуск 24-й
Выпуск 23-й
Выпуск 22-й
Выпуск 21-й
Выпуск 20-й
Выпуск 19-й
Выпуск 18-й
Выпуск 17-й
Выпуск 16-й
Выпуск 15-й
Выпуск 14-й
Выпуск 13-й
Выпуск 12-й
Выпуск 11-й
Выпуск 10-й
Выпуск 9-й
Выпуск 8-й
Выпуск 7-й
Выпуск 6-й
Выпуск 5-й
Выпуск 4-й
Выпуск 3-й
Выпуск 2-й
Выпуск 1-й