2011-03-18 23 views
9

Aynı sınıfın istemciye sunucu üzerinde farklı şekilde uygulanmasının bir yolu var mı?Aynı sınıfın GWT istemci ve sunucu uygulamaları

"Neden bunu yapmak istiyorsunuz?" soru .. Ben çok büyük bir Java istemcisi/sunucu uygulamasını dönüştürüyorum

Şu anda Swing GUI istemcisi kullanıyor ve Spring remoting (RPC) ile sunucuya konuşuyor. GWT RPC'nin Spring servisleri ile kullanılması bir sorun teşkil etmiyor, birçok mükemmel örnek var ve hepsi iyi çalışıyor gibi görünüyor.

Hem istemci hem de sunucu için ortak olan bazı sınıflar, ileri ve geri iletilen verileri içerir. Bu sınıflar, standart JRE sınıflarını kullanarak uygulanan bazı davranışları da içerir. Örneğin, bir sınıf, yerel olarak belirli bir şekilde saat dilimi, DST vb. Dahil olmak üzere tarih ve saati içerir, ayrıştırır ve biçimlendirir. Yeniden yazabilirim/yeniden yazabilirim ancak uygulama 10 milyon SLOC’den fazladır ve bu da yalnızca bu sınıfa milyonlarca referansla sonuçlanır, dolayısıyla büyük bir yeniden yazma maliyet etkin değildir.

Bunu bir örnek olarak kullanmak için GWT, ayrıştırma ve biçimlendirme tarihleri ​​için mükemmel i18n desteği sağlar. Ancak uygulama, JRE'nin yaptığı gibi farklıdır.

Bu nedenle, istemcide (GWT ve yerel JS kullanarak) veya sunucuda (sunucuda) kullanılmasına bağlı olarak, DateTime sınıfımın kabuğuna bir uygulama enjekte edeceğim bir cleaver yolu arıyorum. JRE). Bunu yapmanın kurnaz bir yolu var mı? Belki de XXXXX.gwt.xml modül dosyasını kullanıyor olabilirsiniz. Genel bir çözüm arıyorum.

cevap

0

Aradığınızı düşünüyorum, bu: <source path="client" /> projenizdeki gwt.xml dosyasında. GWT jeneratörü, JS'ye dönüştürmek için istemci tarafı kodunun nereye bakılacağını söyler.

Temelde
<source path="client" /> 
<source path="shared" /> 

istemci kod istemci dizininde olduğunu ve biz fasulye ve istemci ve sunucu tarafı için bazı veri sarmalayıcılarını tutmak paylaştı: Projemde bu şekilde kurmak var.

Yapabilecekleriniz, istemciye dönüştürmek istediğiniz paketleri yukarıdaki gibi bir kaynak yolu ile eklemektir. Ama hatırlamanız gerekir ki, dönüştüreceğiniz sınıflar, yalnızca GWT üretecinin istemci tarafındaki java betiğine dönüşebileceği nesnelerden ve özelliklerden oluşabilir. Daha doğru yolu gibi, kaynak yolu konabilir eğer ben de emin değilim:

<source path="shared/beans/whatever" /> 

başka dezavantajı GWT i18n desteğini kullanırsanız, kendi tarafından derleme zamanında Farklı bir yerel ayar kolları yani, - hangisi iyi. Kendi mekanizmanızı kullanmaya karar verirseniz, sınıflarınızın şu anda kullanılan yerel ayarın farkında olması için GWT ile uyumlu olması gereken bir mantık içermesi gerekir.

+1

Bu sorulmamış. İstemci ve sunucuda kullanılan birden fazla sınıf var (evet, normalde paylaşılacak), ancak bu sınıflar GWT olmayan JRE kodu içeriyorlar, yani yalnızca sunucu üzerinde çalışıyorlardı. – John

+1

Aynı sınıfı yapmak ancak farklı uygulamalarla gözlerim acıyor. Bir tasarım sözleşmesini frenleyecek ve bir programcı benim için hangi uygulamanın altında olduğunu bilmeli.Bu arayüzü takip eden iki farklı sınıfla bir arayüz uygulaması yapmanın bir yolu yok mu? Sorunuzun çözüleceği yol budur (bana sorarsanız). – Sven

+0

@John - GWT kodu içermeyen sınıflar için çatal işe yaramayacağını söylemiştim. Belki de bu konuda çok net değildim. – jjczopek

5

ile bir paket uygulamasını geçersiz kılmak için için <super-source> kullanmak isteyebilirsiniz. GWT, Java Runtime sınıflarını taklit etmek için kullandığı ve (diğerleri arasında) com.google.gwt.regexp.shared.* sınıflarının istemci ve sunucusu için farklı uygulamalar sağlamasıdır.

+0

Süper kaynak gerçekten * diğer uygulamayı geçersiz kılıyor mu yoksa sadece ekliyor mu? Dokümanlarda hiçbir yerde * geçersiz kılma özelliğini buldum (ama harika olurdu). – xamde

+1

Dosya tabanlı olarak, geçersiz kılar. Sınıf yolunda daha önce göründüğü gibi (ve aslında nasıl uygulandığı (çeşit); bkz. Http://code.google.com/p/google-web-toolkit/wiki/ResourceOracle) –

İlgili konular