Архив 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/x86Linux 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



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


