2013-03-04 115 views
3

在我使用Spring MVC的Web應用程序中,我有一個豐富的領域模型。 我想使這個域模型可用於客戶端的Web瀏覽器。例如,因爲我的域模型包含類Person與方法Set<Person> getFriends()DateTime getBirthday(),我想在客戶端使用這些方法。使用場景包括如何使服務器端域模型可用於客戶端Web瀏覽器?

  • 動態地更新訪問瀏覽器的HTML時,請因此,終端,或在他們的生日HTML
  • 排序persons列出所有的朋友。

請注意我沒有在這裏尋找在「視圖渲染階段」(例如JSP)中訪問我的域模型。我正在尋找訪問我的Web應用程序的用戶瀏覽器上的域模型。例如,我不想在「視圖渲染階段」對Person實例進行排序。我希望在用戶的瀏覽器中進行排序。

我的挑戰有哪些解決方案?

+1

您可以使用JavaScript MVC框架在js – 2013-03-12 14:06:04

+1

** 1中重新創建您的模型**確保您需要對您的API進行身份驗證。 ** 2。**看看'HATEOAS'和'REST'。我聽說[暴露你的域模型](http://java.dzone.com/articles/domain-model-rest-anti-pattern)可能是危險的。 – Jess 2013-03-19 03:52:02

回答

3

Javascript - 有框架可以幫助減輕負擔。您描述的場景是對某個服務的Ajax調用。您可以將數據表示爲json,這些數據將輕量且易於使用javascript添加到頁面中。

+0

據我所知,用這個解決方案,我需要在JavaScript中重新創建我現有的Java域模型。我還需要確保兩個表示保持同步。最後,我需要確保兩個世界都有一個「JSON-JVM橋」進行交互。是否有工具可以自動爲我的Java域類生成JavaScript等價物,併爲我自動生成「JSON-JVM橋」? – Abdull 2013-03-04 00:35:53

+0

@Abdull要真正在瀏覽器中按照原樣使用你的域模型,你需要有一個applet並通過網絡發送它 - 這不是你所描述的。我的想法是,你會有一個返回json數據的web服務。然後,您可以將這些數據轉換爲適合您頁面的任何結構。我不確定你需要完全複製你的域模型,但我想這取決於你的要求。我不知道有任何工具可以爲你做這件事,但由於語言結構不同,我預計它會很困難 – Romski 2013-03-04 01:21:59

+0

Grails的JSON-JVM橋需要內置到它的Domain模型中。 Ember.js會自動保持瀏覽器和後端之間的數據同步。 沒有工具可以自動把你的Java領域類和生成Javascript等價物,但使用Ember使它愚蠢瑣碎(見下面的答案)。 – 2013-03-12 20:56:33

2

Abdull你看過GWT(Google Web ToolKit)http://bit.ly/YYz2Yx

下面是一些示例代碼,說明客戶端組件的創建。

例如裝載接觸

  VerticalPanel contactsPanel = new VerticalPanel(); 
      contactsPanel.setSpacing(4); 
      String[] contactNames = constants.cwStackPanelContacts(); 
      String[] contactEmails = constants.cwStackPanelContactsEmails(); 
      for (int i = 0; i < contactNames.length; i++) { 
       final String contactName = contactNames[i]; 
       final String contactEmail = contactEmails[i]; 
       final Anchor contactLink = new Anchor(contactName); 
       contactsPanel.add(contactLink) 

http://bit.ly/12MOhZQ(實際的代碼示例)

0

如果你不侷限於瀏覽器 - 因此JavaScript的,我會尖叫RMI約現在。幸運的是,似乎有一個解決方案,使其工作。我還沒有嘗試過,但它可能是值得的:

jabsorb是交流的Javascript之間 運行在瀏覽器和服務器 上的Java運行一個簡單的,輕量級的JSON-RPC庫。它允許你調用服務器上的Java方法,從 的Javascript,就好像它們是本地的,完成自動參數 和結果序列化。

https://code.google.com/p/jabsorb/

3

Ember.js(特別是其Models)和Grails正是你想要的東西一起使用時。我相信你可以使用任何Java框架來做到這一點,但是Grails使得它很容易地被愚蠢地。以下是一些讓你開始使用的模式,但是here's a complete example app

域類:

class Person { 
    String name 
} 

控制器:

class PersonsController { 
    def index() { render (["person": Person.list()] as JSON) } 
} 

Ember.js應用:

App.Store = DS.Store.extend({ 
    revision: 11, 
    adapter: DS.RESTAdapter.create({ 
    namespace: 'app' 
    }) 
)}; 
App.Person = DS.Model.extend({ 
    name: DS.attr('string') 
)}; 

在瀏覽器中,這種單一的命令將填充在瀏覽器中的數據存儲通過從後端獲取/app/persons。修改瀏覽器內實例會自動將更新的實例HTTP POST發送到您的Controller。

App.Person.list() 

你想爲更復雜的應用退房my answer on getting the two to play together in perfect harmony

相關問題