Archive for the 'программинг' Category

Simple Java Network Transparency

Thursday, November 2nd, 2006

Warning: file_get_contents(http://jug.in.ntu-kpi.kiev.ua/glossary/get) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/www/htdocs/blog/wp-content/plugins/jug-glossary.php on line 40

Оригинал

A short example of how to provide, and use ordinary Java objects across the network, without modification. No XML, no annotations: simply powerful network distributed applications that everyone can immediately understand, and use

Сегодня мы будем обращатся к удаленному объекту физически расположенном на другой тачке, так как будто бы он находится в одной и той же JVM.

Этот пример показывает как использовать класс TransparentItemProxy из проекта cajo. Хм, хотя название у проекта cajo довольно странное название, сделать эту мутку с помощью класса TransparentItemProxy довольно легко, никаких тебе WSDL… :)

Сначала сделаем интерфейс общий для сервера и клиента. Вообще говоря, можем наклепать сколько угодно интерфейсов даже для одного и того же класса.

Duck.java

public interface Duck {
   boolean looks();
   boolean walks();
   boolean talks();
   Duck getDuck();
}

Теперь сделаем простой POJO сервер, реализующий интерфейс, который нужно будет удаленно вызывать.

DuckServer.java

import java.io.Serializable;
import gnu.cajo.invoke.Remote;
import gnu.cajo.utils.ItemServer;
import gnu.cajo.utils.CodebaseServer;

public class DuckServer implements Duck, Serializable {
  public boolean looks() {
     System.out.println(”hi there!”);
     return true;
  }

  public boolean walks() {
     System.out.println(”waddle waddle”);
     return true;
  }

  public boolean talks() {
     System.out.println(”quack quack!”);
     return true;
  }

  public Duck getDuck() {
     return new DuckServer();
  }

public static void main(String args[]) { // simple unit test
  try {
          Remote.config(null, 1198, null, 0); // use cajo port 1198
          new CodebaseServer(null, 0);
          ItemServer.bind(new DuckServer(), “Donald”);
          System.out.println(”duck server running”);
     } catch(Exception x) {
          x.printStackTrace();

   }
  }
}

Компилируем удаленный интерфейс Duck и сервер его реализующий, для этого нужна либа https://cajo.dev.java.net/cajo.jar

Компилируем

javac -classpath . Duck.java
javac -classpath cajo.jar;. DuckServer.java

Запускаем сервер

java -classpath cajo.jar;. DuckServer

Отлично. Теперь быстро напишем клиента, который будет общатся с сервером.

DuckClient.java

import gnu.cajo.invoke.NoSecurityManager;
import gnu.cajo.utils.extra.TransparentItemProxy;

public class DuckClient { // try out DuckServer
  public static void main(String args[]) {
    try {
         System.setSecurityManager(new NoSecurityManager());
          Duck duck = (Duck)TransparentItemProxy.getItem(
              “//serverHost:1198/Donald”,
              new Class[] { Duck.class }
          );

       duck = duck.getDuck(); // by value
       System.out.println(”looks like = ” + duck.looks());
       System.out.println(”walks like = ” + duck.walks());
       System.out.println(”talks like = ” + duck.talks());

    } catch(Exception x) {
        x.printStackTrace();
    }
  }
}

Примечание: замените localhost на имя хоста с запущенным сервером.

Компилируем и запускаем клиент

javac -classpath cajo.jar;. DuckClient.java
java -classpath cajo.jar;. DuckClient

У клиента в консоли будет

looks like = true
walks like = true
talks like = true

а в консоли сервера

hi there!
waddle waddle
quack quack!

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

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

AJAX без использования обьекта XmlHttpRequest

Thursday, November 2nd, 2006

Warning: file_get_contents(http://jug.in.ntu-kpi.kiev.ua/glossary/get) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/www/htdocs/blog/wp-content/plugins/jug-glossary.php on line 40

Оригинал

Введение

AJAX стал самым большим “открытие” последних лет, AJAX так же стал “умным” словом :) почти таким же как Web 2.0. Общепризнано, что аякс это прикольная штука и с её помощью можно делать интересные фичи для web апликух. Прямо сейчас, когда вы читаете эти строчки, аякс уже используется на многих популярнейших сайтах. Наиболее известными являются GMail и Google Maps, хотя Ta-da List или Flickr тоже используют его. Даже Microsoft заразилась аяксоманией, и наваяла либы поддержки AJAX для ASP.NET (привет Java либам DWR & Google Web Toolkit).

Всё было бы отлично, но в текущих реализациях AJAX есть одна существенная проблема - всё завязано на один единственный обьект XmlHttpRequest. Наиболее современные браузеры, вроде FireFox, имеют встроенную поддержку этого объекта. Но старички, вроде IE 6, не имеют встроенной поддержки AJAX и поэтому им приходится использовать левые ActiveX контролы. А это приводит к тому, что у посетителей AJAX-сайта будут выскакивать дурацкие предупреждения о возможной опасности при использовании ActiveX контролов, также пользователи могут вообще отключить в браузере поддержку ActiveX компонентов.

В этой статье я покажу, как использовать Ajax без создания объекта XmlHttpRequest.

Приступаем

Если мы не можем использовать XmlHttpReques, то нам нужно найти какой-то другой способ получения и добавления контента, при этом нужно обойтись без обращения к другим ActiveX обьектам или использования нестандартных методов. Похоже, что наилучшим кандидатом являются внешние JavaScript файлы. Наш подход будет заключатся в использовании динамически созданных на сервере JavaScript файлов. Так как JUG.org.ua посвящен яве, то мы будем использовать JSP :)

Создадим . и положим её на сервер JSP страничку ajax.jsp, в ней будет находится динамический контент, передаваемый клиенту.

<?
String html = “<b>This content came from JSP</b>”;
?>
div = document.getElementById(’contentdiv’);
div.innerHTML = ‘<?=html?>’;

Тут мы с помощью JavaScript кода получаем элемент DIV с айдишкой contentDiv и вставляем в него созданный на сервере контент.

Отлично, контент мы уже отдаем, нужно его как-то запросить и получить на стороне клиента используя браузер.

Это довольно легко сделать. Cоздадим с помощью DOM хтмл тег SCRIPT и установим в качестве значения атрибута SRС путь к JSP страничке ajax.jsp

function ajax_do (url) {
// url это полный путь к ajax.jsp
// Создаем HTML элемент SCRIPT

var jsel = document.createElement(’SCRIPT’);
jsel.type = ‘text/javascript’;

// установим значение атрибута SRC
jsel.src = url;

// Скармливаем созданный элемент браузеру
// собственно это и есть AJAX-вызов

document.body.appendChild (jsel);
}

Пробуем!

Слепим всё вместе, для этого напишем простенькую HTML страницу, разместим её на сервере,

<html>
<head>

<title>Demo - The Basic’s</title>

<script type=”text/javascript”>
function ajax_do (url) {
// url это полный путь к ajax.jsp
// Создаем HTML элемент SCRIPT

var jsel = document.createElement(’SCRIPT’);
jsel.type = ‘text/javascript’;

// установим значение атрибута SRC
jsel.src = url;

// Скармливаем созданный элемент браузеру
// собственно это и есть AJAX-вызов

document.body.appendChild (jsel);
}
</script>
</head>

<body>
<div id=”contentdiv”> </div>
<input onclick=”ajax_do(’http://localhost/ajax.jsp’);
type=”button” value=”Получить контент” />
</body>
</html>

  • По этой теме можно почитать на http://www.phpied.com/javascript-include/
  • Описанный в статье метод не является AJAX`ом в чистом виде, назовем это AJAX хаком :)