Skip to content

jsbeans/jsbeans

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
bin
 
 
src
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

JsBeans - Client-server JavaScript Fullstack Web Framework

jsBeans β€” ΠΈΠ·ΠΎΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ класса "full-stack" для создания комплСксных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ с Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹ΠΌ Π²Π΅Π±-интСрфСйсом, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрным взаимодСйствиСм Π½Π° языкС JavaScript.

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° Java 1.8 с Mozilla Rhino Π² качСствС сСрвСрного JavaScript Π΄Π²ΠΈΠΆΠΊΠ°, встроСнным Web сСрвСром Π½Π° Eclipse Jetty ΠΈ сСрвисной шиной Π½Π° Akka.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ особСнности jsBeans:

  • Π’Π΅Π±-интСрфСйс ΠΈ бизнСс Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… JavaScript-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… - Π±ΠΈΠ½Π°Ρ… (JavaScript Beans (JSB) ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с JavaBeans, Π½ΠΎ Π»Π΅Π³Ρ‡Π΅).
  • Π‘ΠΈΠ½Ρ‹ - логичСски Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ содСрТат ΠΊΠ°ΠΊ клиСнтский, Ρ‚Π°ΠΊ ΠΈ сСрвСрный ΠΊΠΎΠ΄ (Π² ΠΎΠ΄Π½ΠΎΠΌ классС/Ρ„Π°ΠΉΠ»Π΅ *.jsb).
  • ΠŸΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ΅ взаимодСйствиС клиСнтской ΠΈ сСрвСрной частСй Π±ΠΈΠ½Π° ΠΈ автоматичСская синхронизация Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ²Π΅Ρ€Ρ… Π±Π°Π·ΠΎΠ²ΠΎΠΉ RPC ΡˆΠΈΠ½Ρ‹.
  • ДинамичСскоС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ зависимостСй Π±ΠΈΠ½ΠΎΠ²
  • ОбмСн сообщСниями ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΠΈΠ½Π°ΠΌΠΈ Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрном пространствС (ΠΏΠΎΠ²Π΅Ρ€Ρ… Actor System).
  • ВстроСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° систСмных ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… срСдств Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (JSB, Kernel, Cluster, Debugger, ...)
  • ВстроСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (JSB.Widgets) ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΠ· рСпозитория.
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Java "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ"
  • jsBeans Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ jar ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, содСрТащим: java ΠΊΠΎΠ΄, систСмныС рСсурсы jsBeans, рСсурсы ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ jsBeans.

А Ρ‚Π°ΠΊΠΆΠ΅

  • динамичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ скрипт-Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ (Web Page Bootstrap)
  • динамичСская ΠΏΠΎΠ΄Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π±ΠΈΠ½ΠΎΠ² Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚
  • ВстроСнныС ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ *.jsb Ρ„Π°ΠΉΠ»ΠΎΠ², Π² частности `#dot ...`
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±ΠΈΠ½Π° Ρ‡Π΅Ρ€Π΅Π· HTTP (http://my.server.com/index.jsb)
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π±ΠΈΠ½ΠΎΠ² (traits), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π½Π°Π²Π΅ΡΠΈΡ‚ΡŒ Π½Π° Π±ΠΈΠ½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π».
  • ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‰ΠΈΠΊ с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ зависимостями
  • (Π² ΠΏΠ»Π°Π½Π°Ρ…) АннотированиС ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² /** @annotation {...} */
  • TODO

ИспользованиС

  1. Π’ Π²ΠΈΠ΄Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ "ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ".
  2. Π’ Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Java Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ‰ΠΈΠΉ classpath основного прилоТСния

НовоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ создаСтся Π² Π²ΠΈΠ΄Π΅ основного сборочного ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ дистрибутив с прСднастроСнной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ для автоматичСского развСртывания.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±ΠΈΠ½Ρ‹?

Π’ соотвСтствии с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ jsBeans вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ΠΊΠ°ΠΊ сСрвСрная, Ρ‚Π°ΠΊ ΠΈ клиСнтская) строится Π² Π²ΠΈΠ΄Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° языкС JavaScript, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… EJB-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² Java EE. Они ΠΈΠ·ΠΎΠΌΠΎΡ€Ρ„Π½Ρ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ основным ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ ООП, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ ΠΈ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСрвСра Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ»ΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€. Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ - Π±ΠΈΠ½Π°ΠΌΠΈ.

Π‘ΠΈΠ½Ρ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ JS ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Они содСрТат систСмныС поля, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ спСцифику функционирования Π±ΠΈΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ряд ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для описания бизнСс Π»ΠΎΠ³ΠΈΠΊΠΈ. ВсС систСмныС поля Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π½Π° $, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: $name , $parent , $require ΠΈ Ρ‚.ΠΏ.

ДСкларация Π±ΠΈΠ½Π° осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JSB(beanDescriptor); ΠΈ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

JSB({
    $name: 'Foo',
    
    myField: 123,

    myMethod: function(){
        return this.myField;
    }
};

Ѐункция JSB(beanDescriptor) нСпосрСдствСнно Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ сам Π±ΠΈΠ½ ΠΏΠΎ описанию Π² beanDescriptor ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΠΈΠ½ΠΎΠ² (JSB-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€) с Ρ†Π΅Π»ΡŒΡŽ дальнСйшСго управлСния Π΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ. JSB-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈΠ·ΠΎΠΌΠΎΡ€Ρ„Π΅Π½ ΠΈ присутствуСт ΠΊΠ°ΠΊ Π½Π° сторонС сСрвСра Ρ‚Π°ΠΊ ΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ использован ΠΊΠ°ΠΊ сторонС сСрвСра, Ρ‚Π°ΠΊ ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ (Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅).

JSB.lookup('Foo', function(FooClass){
	var foo = new FooClass();
	foo.myMethod();
    foo.myField = ', World!';
	foo.hello('Hello');
});

ВсС Π±ΠΈΠ½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Π°Ρ… *.jsb Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС сСрвСра. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвСр рСкурсивно сканируСт ΠΏΠ°ΠΏΠΊΡƒ с Π±ΠΈΠ½Π°ΠΌΠΈ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΡ… Π² свой Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Ρ‚Π°ΠΊ ΠΆΠ΅ поддСрТиваСтся динамичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π±ΠΈΠ½ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» *.jsb содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ Π±ΠΈΠ½Π° Π±Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JSB(...), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π€Π°ΠΉΠ» test.jsb:

{
    $name: 'MyBean',
    
    myField: 123,
    
    myMethod: function(){
        return this.myField;
    }    
}

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΠΈΠ½ΠΎΠ²

ΠšΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² jsBeans ΠΈΠ³Ρ€Π°Π΅Ρ‚ JSB-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΠΈΠ½ΠΎΠ², Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ зависимостСй ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, обСспСчСниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного взаимодСйствия ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ»Π΅ΠΉ Ρƒ экзСмпляров Π±ΠΈΠ½ΠΎΠ² Π½Π° клиСнтской ΠΈ сСрвСрной сторонах.

ΠšΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрноС взаимодСйствиС

ΠšΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрныС Π±ΠΈΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, содСрТат нСсколько сСкций (Π² частности – $server ΠΈ $client).

  • Π’ сСкции $client, Π² основном, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для взаимодСйствия с DOM модСлью Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.
  • Π’ сСкции $server – сСрвСрныС поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° бизнСс Π»ΠΎΠ³ΠΈΠΊΡƒ, Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π‘Π£Π‘Π”, Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ рСсурсами ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΏΡ€ΠΈ создании экзСмпляра Π±ΠΈΠ½Π° Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° создаСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ сСрвСрный экзСмпляр ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ устанавливаСтся взаимодСйствиС, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ (ΠΎΠ΄ΠΈΠ½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ / ΠΌΠ½ΠΎΠ³ΠΎ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ) задаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π°.

ВзаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… сСкций осущСствляСтся ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… асинхронных proxy-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Π€Π°ΠΉΠ» foo.jsb:

{
    /** ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ имя Π±ΠΈΠ½Π° */
    $name: 'my.examples.Foo',
    
    /** Π±ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ */
    $parent: 'my.examples.FooParent',
     
    /** Π±ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ½Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для создания экзСмпляров), 
    ссылки Π½Π° классы ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±ΠΈΠ½ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· встроСнноС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅*/
    $require: {MyWorld: 'my.examples.MyWorld'},

    /** ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ· ΠΎΠ±Ρ‰Π΅ΠΉ сСкции ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ (ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ) Π² $client ΠΈ $server*/
    formatMessageText: function(data){
        var text = '';
        for (let p in data) if (data.hasOwnProperty(p)) {
            text += p + ' = ' + data[p] + '\n';
        }
        return text;
    },

    /** сСкция клиСнтского ΠΊΠΎΠ΄Π° (исполняСтся Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, Π² контСкстС Web страницы)*/
    $client: {
        $constructor: function(){
            this.scheduleTimestampMessage();
        },

		scheduleTimestampMessage: function(){
			window.setInterval(function(){
                /** асинхронный Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ· "ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ сСкции" осущСствляСтся
                Ρ‡Π΅Ρ€Π΅Π· Π°Π΄Π°ΠΏΡ‚Π΅Ρ€, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° remote() Ρƒ Π±ΠΈΠ½Π°.
                */
                $this.remote().getTimestamp(function(result, error){                    					/** Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ Π² коллбэк */
                    
                    /** для удобства Π² scope всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² автоматичСски добавляСтся
                    	локальная пСрСмСнная $this равная this ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΠΈΠ½Π°
                    	(избавляСт ΠΎΡ‚  `var self = this`) */
                    if (!error) {
                        var data = {timestamp: result};
                        alert($this.formatMessageText(data));
                    }
                });                
            }, 1000);
		}
    },

    /** сСкция сСрвСрного ΠΊΠΎΠ΄Π° (исполняСтся Π½Π° сСрвСрС)*/
    $server: {
        /** Π’ сСрвСрной сСкции поддСрТиваСтся ΠΈΠΌΠΏΠΎΡ€Ρ‚ классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Java*/
        $require: {System: 'java:java.lang.System'},
            
        /** Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ конструктор вызываСтся ΠΏΡ€ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ сСрвСрной части экзСмпляра Π±ΠΈΠ½Π° */
        $constructor: function(){
            /** созданиС экзСмпляра ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°, см `$require` */
            this.myWorld = new MyWorld();                        
        },
        
        /** ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² сСрвСрной сСкции ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ */
        getTimestamp: function (){
            return 0 + this.getSystemTimestamp(); // '0 + ' - Java Int -> JS integer
        },
        
        getSystemTimestamp: function() {
            /** Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса Java ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° java.lang.System для получСния
             	Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ */
            return System.currentTimeMillis();
        }
    }    
}

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ web ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Web ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚

Π€Π°ΠΉΠ» myWebControl.jsb:

{
	$name: 'my.examples.MyWebControl',

	/** УнаслСдуСм наш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΡ‚ Π±ΠΈΠ½Π° Control ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JSB.Widgets */
	$parent: 'JSB.Widgets.Control', 

	/** Наш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ComboBox ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JSB.Widgets */	
	$require: ['JSB.Widgets.ComboBox'],

	/** ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ сСкция (ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅) */
	$client: {
		$constructor: function(opts){
			$base(opts); // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ конструктор
			
			/** Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ стили (ΠΏΡƒΡ‚ΡŒ задаСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСста располоТСния 
			Ρ„Π°ΠΉΠ»Π° с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π±ΠΈΠ½ΠΎΠΌ) */
			$jsb.loadCss('myWebControl.css');

			/** Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ экзСмпляр Π±ΠΈΠ½Π° ComboBox ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JSB.Widgets */
			var cb = new ComboBox({
				cssClass: 'myCombo',
				dropDown: true,
				items: [{
					key: 'first',
					element: 'ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ'
				},{
					key: 'second',
					element: 'Π’Ρ‚ΠΎΡ€ΠΎΠΉ'
				},{ 
					key: 'third',
					element: '<div class="cool">Π’Ρ€Π΅Ρ‚ΠΈΠΉ</div>'
				}],

				/* ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 
				конструктора */
				value: opts.initialValue,
				
				onChange: function(key, obj){
					$this.updateMyData();
				}
			});
			
			/** Π”ΠΎΠ±Π°Π²ΠΈΠΌ ComboBox Π² DOM элСмСнт нашСго ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° */
			this.append(cb); 

			/** Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ DOM элСмСнт для помСщСния Ρ‚ΡƒΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра */
			this.append($('<div class="myContainer"></div>'));
			
			/** Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ/ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΈΡ… */
			this.updateMyData();
		},

		updateMyData: function(){
			/** ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠΌΠ±ΠΎ-бокса */
			var cbVal = this.find('.myCombo').jsb().getData();
			
			/** Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для получСния Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра.
			ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠΌΠ±ΠΎ, Π° Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ - колбэк 
			Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° сразу ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСрвСрный ΠΌΠ΅Ρ‚ΠΎΠ΄ 
			Π²Π΅Ρ€Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ */
			this.server().loadMyData(cbVal, function(res){
				$this.drawData(res); // отрисуСм Π΄Π°Π½Π½Ρ‹Π΅
			});
            /** Для ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° сСрвСрного ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
            	Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ remote(), которая осущСствляСт ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π½Π° 
            	ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ сторонС. Но Ссли ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄
                находится Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ
                Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ явно сразу ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ server().
                Аналогична ΠΈ обратная ситуация - Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π² Ρ‚Π΅Π»Π΅ сСрвСрного ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
                ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ клиСнтский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΡƒΡ‚Π΅ΠΌ использования
                Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ client()*/
		},
		
		drawData: function(data){
			/** ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ очистим ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹ΠΉ элСмСнт */
			$('.myContainer').empty(); // Π²Ρ‹Π·ΠΎΠ² jQuery

			/** Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹ΠΉ элСмСнт ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ встроСнного
			ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° doT */
			$('.myContainer').append(`#dot
				<ul class="myTags">
				{{ for(var i in data) { }}
					<li class="myTag">{{=data[i]}}</li>
				{{ } }}
				</ul>
			`);
		}
	},

	/** БСрвСрная сСкция (ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° сторонС сСрвСра) */
	$server: {
		myDictionary: {
			first: ['Анна', 'ΠœΠ°Ρ€ΠΈΡ'],
			second: ['Π’Π΅Ρ€Π°', 'Лариса'],
			third: ['Π’Π΅Ρ€ΠΎΠ½ΠΈΠΊΠ°','ΠŸΠ΅Ρ‚Ρ€']
		},
		
		loadMyData: function(key){
			return this.myDictionary[key];
		}
	}
}

ВстраиваниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² HTML ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JavaScript

<html>
	<head>
		<script type="text/javascript" src="jsbeans.jsb"></script>
	</head>
	<body>
		<div id="myGlobalContainer"></div>
		
		<script type="text/javascript">
			JSB.create('my.examples.MyWebControl', {
				container: '#myGlobalContainer',
				initialValue: 'second'
			}, function(myCtrl){
				/** place code here if you want to do anything after control
				has been created */
			});
		</script>
	</body>
</html>

АвтоматичСскоС встраиваниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² HTML

<html>
	<head>
		<script type="text/javascript" src="jsbeans.jsb"></script>
	</head>
	<body>
		<div id="myGlobalContainer" 
			jsb="my.examples.MyWebControl"
			initialvalue="second"
		></div>
	</body>
</html>

Бинхронизация ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ

Поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΎΠ±Ρ‰Π΅ΠΉ сСкции Π±ΠΈΠ½Π° (Π²Π½Π΅ $server ΠΈ $client) ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΈ для сСрвСра ΠΈ для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄Π΅ ΠΎΠ±Π΅ΠΈΡ… сСкций. JsBeans позволяСт ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ поля Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ сторонС автоматичСски обновится ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° синхронизации ΠΏΠΎΠ»Π΅ΠΉ Π³ΠΈΠ±ΠΊΠΎ настраиваСтся ΠΎΠΏΡ†ΠΈΠ΅ΠΉ $sync, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… сСкциях Π±ΠΈΠ½Π°. Бинхронизация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ ΠΈ Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ автоматичСски, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ.

АвтоматичСская однонаправлСнная синхронизация

Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ автоматичСской ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ синхронизации Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΉ сСкции Π±ΠΈΠ½Π° ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ $sync: true. Π’ этом случаС всС ΠΎΠ±Ρ‰ΠΈΠ΅ поля, измСняСмыС ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° сторонС сСрвСра, Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π½ΠΎ Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

{
	$name: 'my.examples.MySyncBean',
	$sync: true,

	/** ΠžΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ»Π΅, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ синхронизации */
	myCommonField: 'starting...',

	$client: {
		$constructor: function(){
			console.log(this.myCommonField);
		},
		
		/** ΠœΠ΅Ρ‚ΠΎΠ΄ $onSyncAfter Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ сразу ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько
		синхронизируСмых ΠΏΠΎΠ»Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ‹ */
		$onSyncAfter: function(syncInfo){
			console.log(this.myCommonField);
		}
	},

	$server: {
		$constructor: function(){
			/** Π‘ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Π½Π° сторонС сСрвСра ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ */
			JSB.interval(function(){
				$this.myCommonField = new Date().toString();
			}, 60000);
		}
	}
}

ПослС создания экзСмпляра Π±ΠΈΠ½Π° Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π½Π° сСрвСрной сторонС Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски создана Π΅Π³ΠΎ сСрвСрная Ρ‡Π°ΡΡ‚ΡŒ ΠΈ вызовСтся конструктор. Π”Π°Π»Π΅Π΅ сСрвСрный конструктор Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ JSB.interval, которая установит ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» обновлСния поля Π½Π° сторонС сСрвСра Π² ΠΎΠ΄Π½Ρƒ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π² консоли ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя.

Настройка ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ синхронизации

ΠžΠΏΡ†ΠΈΡ $sync:true устанавливаСт ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ синхронизации ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, которая эквивалСнтна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ настройкС:

$sync: {
	updateClient: true,
	updateServer: false,
	updateCheckInterval: 1000,
	include: [],
	exclude: []
}

Установка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для updateClient ΠΈ updateServer позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ синхронизации, ΠΏΡ€ΠΈ этом синхронизация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ (ΠΎΠ±Π° значСния установлСны Π² true). ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΡ†ΠΈΠΉ include ΠΈ exclude ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… синхронизации. ΠžΠΏΡ†ΠΈΡ updateCheckInterval позволяСт ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΡ… синхронизации. Надо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² случаС большого количСства синхронизируСмых ΠΏΠΎΠ»Π΅ΠΉ, автоматичСская ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях рСкомСндуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости ΠΈ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² Ρ‚Π΅Ρ… мСстах, Π³Π΄Π΅ эти измСнСния происходят. Для этого Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, установив ΠΎΠΏΡ†ΠΈΡŽ updateCheckInterval: 0 ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° doSync, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ имССтся Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°.

{
	$name: 'my.examples.MySyncBean2',
	$sync: {
		updateCheckInterval: 0 // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ
	},

	/** ΠžΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ»Π΅, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ синхронизации */
	myCommonField: 'starting...',

	$client: {
		$constructor: function(){
			console.log(this.myCommonField);
		},
		
		/** ΠœΠ΅Ρ‚ΠΎΠ΄ onAfterSync Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ сразу ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько
		синхронизируСмых ΠΏΠΎΠ»Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ‹ */
		onAfterSync: function(syncInfo){
			console.log(this.myCommonField);
		}
	},

	$server: {
		$constructor: function(){
			/** Π‘ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Π½Π° сторонС сСрвСра ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ */
			JSB.interval(function(){
				$this.myCommonField = new Date().toString();

				/** Π’Ρ‹Π·ΠΎΠ²Π΅ΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ синхронизации ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ*/
				$this.doSync();
			}, 60000);
		}
	}
}

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ синхронизации

ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ сторонС, jsBeans ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ эти измСнСния ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ синхропакСт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии пСрСдаСтся Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ сторону ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обновлСния ΠΏΠΎΠ»Π΅ΠΉ. ΠŸΠ΅Ρ€Π΅Π΄ нСпосрСдствСнным ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ, синхропакСт ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ onBeforeSync, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π² синхропакСт.

{
	$name: 'my.examples.SyncBeforeAfterTest'

	myField1: 'test',
	myField2: {},

	$client: {
		// ...
		/** onBeforeSync вызываСтся послС получСния синхропакСта, 
		Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ»Π΅ΠΉ. 
		Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - стоит	Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ синхропакСт ΠΈΠ»ΠΈ Π½Π΅Ρ‚ */
		onBeforeSync: function(syncInfo){
			if(syncInfo.isChanged('myField1')) {
				return false; // Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ измСнСния
			}
			return true; // ΠΏΡ€ΠΈΠΌΠ΅ΠΌ измСнСния
		}
		// ...
	}
}

ПослС обновлСния ΠΏΠΎΠ»Π΅ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ onAfterSync Π² цСлях увСдомлСния ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ синхронизации.

{
	$name: 'my.examples.SyncBeforeAfterTest2'

	myField1: 'test',
	myField2: {},

	$client: {
		// ...
		/** onAfterSync вызываСтся послС синхронизации.
		Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ дСйствия ΡƒΠ·Π½Π°Π², Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ обновилось*/
		onAfterSync: function(syncInfo){
			if(syncInfo.isChanged('myField1')) {
				console.log('Π£Ρ€Π°, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ myField1 = ' + $this.myField1);
			}
		}
		// ...
	}
}

ОбмСн сообщСниями

  • TODO

Π ΡƒΡ‚ΠΎΠ²Ρ‹ΠΉ контСкст Π² сСссионных Π±ΠΈΠ½Π°Ρ… - $root

Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для $singleton ΠΈ $fixedId

  • TODO

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ контСксту ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠ· Ρ‡ΡƒΠΆΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² - JSB.wrap()

  • TODO

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ

Π‘ΠΈΠ½ являСтся составным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Ρ€Π°Π·Π½Ρ‹Π΅ Π΅Π³ΠΎ части (клиСнтская ΠΈ сСрвСрная) ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ JavaScript ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ свой ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΠΈΠ½Π° ΠΊ сСсии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ экзСмпляров ΠΈΠ»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ нСсколько часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… случаСв.

Π‘ΠΈΠ½Π³Π»Ρ‚ΠΎΠ½

  • TODO

Π‘ΠΈΠ½Π³Π»Ρ‚ΠΎΠ½ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… сСссии

  • TODO

АвтопороТдСниС сСрвСрной части с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

  • TODO

Один Π±ΠΈΠ½: ΠΎΠ΄ΠΈΠ½ клиСнтский - ΠΎΠ΄ΠΈΠ½ сСрвСрный

  • TODO

Один Π±ΠΈΠ½: ΠΌΠ½ΠΎΠ³ΠΎ клиСнтских - ΠΎΠ΄ΠΈΠ½ сСрвСрный

  • TODO

Один Π±ΠΈΠ½: ΠΌΠ½ΠΎΠ³ΠΎ клиСнтских - ΠΌΠ½ΠΎΠ³ΠΎ сСрвСрных

  • TODO

.

About

JavaScript Full-stack Web Framework on JVM

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published