Skip to content

jsbeans/jsbeans

master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

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

README.md

jsBeans - Client-server JavaScript Fullstack Web Framework

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

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

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

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

А Ρ‚Π°ΠΊΠΆΠ΅

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

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

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

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

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

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

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

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

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

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

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

JSB.lookup('MyBean', function(MyBeanClass){
	var myBeanInst = new MyBeanClass();
	myBeanInst.myMethod();
});

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

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

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

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

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

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

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

{
    /** ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ имя Π±ΠΈΠ½Π° */
    $name: 'my.examples.MyBean',
    
    /** Π±ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ */
    $parent: 'my.examples.ParentBean',
     
    /** Π±ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ½Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для создания экзСмпляров), 
    Ρ‚ΠΈΠΏΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±ΠΈΠ½ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² scope ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² */
    $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;
    },

    /** сСкция клиСнтского ΠΊΠΎΠ΄Π° (исполняСтся Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅)*/
    $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: 0 + result};
                        alert($this.formatMessageText(data));
                    }
                });                
            }, 1000);
		}
    },

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

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

Π‘ΠΈΠ½ являСтся составным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Ρ€Π°Π·Π½Ρ‹Π΅ Π΅Π³ΠΎ части (клиСнтская ΠΈ сСрвСрная) ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ 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