Trace:
Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
jvx:features [2018/11/29 11:14] admin |
jvx:features [2018/11/29 14:09] admin |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ~~Title: Features~~ | ||
~~NOTRANS~~ | ~~NOTRANS~~ | ||
Line 6: | Line 7: | ||
<WRAP group> | <WRAP group> | ||
- | <WRAP column column> | + | <WRAP column 30%> |
* **Swing** \\ Applet, Webstart or Desktop | * **Swing** \\ Applet, Webstart or Desktop | ||
* **Vaadin** \\ HTML5/Ajax | * **Vaadin** \\ HTML5/Ajax | ||
* **iOS and Android** \\ Native App for Smartphone, Tablet | * **iOS and Android** \\ Native App for Smartphone, Tablet | ||
- | <WRAP column column> | + | </WRAP> |
- | <carousel infinite=true&dots=true&speed=500&fade=true> | + | <WRAP column third> |
- | * {{:jvx:gal_charts.png|Charts}} | + | <carousel infinite=true&dots=true&speed=500&fade=true&adaptiveHeight=true> |
- | * {{:jvx:gal_android_vaadin_projekte.png|Vaadin}} | + | * {{:jvx:gal_android_vaadin_status.png?nolink|Vaadin}} |
- | * {{:jvx:gal_android_vaadin_status.png|Vaadin}} | + | * {{:jvx:gal_charts.png?nolink|Charts}} |
- | * {{:jvx:gal_charts_swing.png|Swing}} | + | * {{:jvx:gal_android_vaadin_projekte.png?nolink|Vaadin}} |
- | * {{:jvx:gal_charts_vaadin.png|Vaadin}} | + | * {{:jvx:gal_charts_swing.png?nolink|Swing}} |
+ | * {{:jvx:gal_charts.png?nolink|Charts}} | ||
+ | * {{:jvx:gal_chrome_vaadin_projekte.png?nolink|Vaadin}} | ||
+ | * {{:jvx:gal_erp_customers.png?nolink|ERP}} | ||
+ | * {{:jvx:gal_erp_statistic_full.png?nolink|Statistics}} | ||
+ | * {{:jvx:gal_charts_vaadin.png?nolink|Charts}} | ||
+ | * {{:jvx:gal_erp_statistic.png?nolink|ERP}} | ||
+ | * {{:jvx:gal_exchange_contacts.png?nolink|Exchange}} | ||
+ | * {{:jvx:gal_iOS_app_menu.png?nolink|iOS}} | ||
+ | * {{:jvx:gal_iOS_app_projects.png?nolink|iOS}} | ||
+ | * {{:jvx:gal_iOS_app_status.png?nolink|iOS}} | ||
+ | * {{:jvx:gal_iPad_vaadin_projects.png?nolink|Vaadin}} | ||
+ | * {{:jvx:gal_iPad_vaadin_status.png?nolink|Vaadin}} | ||
+ | * {{:jvx:gal_jvxswing_browser.png?nolink|Browser}} | ||
+ | * {{:jvx:gal_master_detail_detail.png?nolink|Master-Detail}} | ||
+ | * {{:jvx:gal_tree_swing.png?nolink|Tree}} | ||
+ | * {{:jvx:gal_tree_vaadin.png?nolink|Tree}} | ||
</carousel> | </carousel> | ||
</WRAP> | </WRAP> | ||
+ | </WRAP> | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
== Quick & Easy development == | == Quick & Easy development == | ||
+ | |||
+ | <WRAP group> | ||
+ | <WRAP column column> | ||
+ | Client Code: | ||
+ | <file java> | ||
+ | private void initializeUI() throws Exception { | ||
+ | UITable table = new UITable(); | ||
+ | table.setDataBook(rdbContacts);//bind to UI model | ||
+ | add(table, UIBorderLayout.CENTER); | ||
+ | setTitle("Contacts"); | ||
+ | setSize(new UIDimension(600, 500)); | ||
+ | } | ||
+ | private void initializeModel() throws Throwable { | ||
+ | RemoteDataBook rdbContacts = new RemoteDataBook(); | ||
+ | rdbContacts.setDataSource(getDatasource()); // bind to DAO „contacts“ | ||
+ | rdbContacts.setName("contacts"); | ||
+ | rdbContacts.open(); | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ | Server Code: | ||
+ | |||
+ | <file java> | ||
+ | public IStorage getContacts() throws Exception { | ||
+ | DBStorage dbsContacts = (DBStorage)get("contacts"); | ||
+ | if (dbsContacts == null) { | ||
+ | dbsContacts = new DBStorage(); // Automatic DAO | ||
+ | dbsContacts.setDBAccess(getDBAccess()); | ||
+ | dbsContacts.setWritebackTable("CONTACTS"); | ||
+ | dbsContacts.open(); | ||
+ | put("contacts", dbsContacts); | ||
+ | } | ||
+ | return dbsContacts; | ||
+ | } | ||
+ | </file> | ||
+ | </WRAP> | ||
+ | <WRAP column third> | ||
+ | \\ | ||
+ | \\ | ||
+ | **You don't need more code!** | ||
+ | |||
+ | You write just a few lines of code for an application that manages your contacts. | ||
+ | |||
+ | * **initializeUI()** \\ Initialize an UITable, bind it to the model and add it to the screen. | ||
+ | * **initializeModel()** \\ Instantiate model for contacts, bind it to the server and the DAO "contacts". | ||
+ | * **getContacts()** \\ Instantiate DAO "contacts", initialize it with database and table "CONTACTS". | ||
+ | </WRAP> | ||
+ | </WRAP> | ||
== How does it work? == | == How does it work? == | ||
+ | |||
+ | <WRAP group> | ||
+ | <WRAP column column> | ||
+ | Screenshots | ||
+ | </WRAP> | ||
+ | <WRAP column third> | ||
+ | //JVx' DAO class DBStorage analyzes the data model of table "CONTACTS". This detects all data types for all columns and all foreign keys to master data tables. This metadata information are sent to the client model. | ||
+ | \\ | ||
+ | \\ | ||
+ | The dynamic client model, for all Daten data-bound GUI controls, uses this metadata. | ||
+ | Because of this mechanism, all input fields get a specific data type, and size directly from the database. Dropdown lists are created because of foreign key references to master data tables, etc. | ||
+ | \\ | ||
+ | \\ | ||
+ | As a result, no further source code is necessary.\\ **Covention over Configuration** | ||
+ | \\ | ||
+ | Any deviation from the standard behavior can be coded accordingly. | ||
+ | //</WRAP> | ||
+ | </WRAP> | ||
== All Features == | == All Features == | ||