SORU
22 AĞUSTOS 2010, Pazar


Tasarım Desenleri tabanlı uygulamalar, web

Basit bir web tabanlı bir uygulama tasarlıyorum. Web tabanlı bu etki alanı için yeni duyuyorum.Sorumluluk sunucu uygulamalarına, Sunucu, vb yeni kriterler arasında nasıl dağıtılacak gibi tasarım desenleri konusunda tavsiyene ihtiyacım var.

Aslında eklemek, düzenlemek ve silmek gibi benim ana sayfa ve ilgili birkaç seçenek var, her biri için birkaç varlıkları var. Önceki entity1 düzenlemek için, bu şekilde sunucu uygulamalarına kadar çok sayıda sonuçlandırdık entity1, Servlet2 eklemek için Servlet1 gibi seçenekler başına bir Sunucu uygulaması kullanıyordum.

Şimdi bizim tasarım değiştiriyoruz. Soruma tam olarak bir sunucu uygulaması sorumluluğu seçiminde ne kadar dikkatli seçin. Tüm bu seçenekleri ve ileri isteği katmanı hizmeti için işleyecek olan varlık başına bir Sunucu uygulaması olması gerekir.Ya da tam sayfa isteği işleyecek olan tüm sayfa için bir sunucu uygulaması ve ileri o zaman ilgili hizmet katman gerekir.İstek servis katmanı iletilen nesne ya da değil.

En iyi tasarım seçimi bize rehberlik lütfen.Ayrıca malzeme hoş olacak iyi bir tasarım deseni için herhangi bir işaretçi.

CEVAP
22 AĞUSTOS 2010, Pazar


Biraz saygın web uygulama tasarım desenleri karışımından oluşur. Sadece en önemli olanlardan bahsedeceğim.


Model View Controller pattern

Kullanmak istediğiniz (mimari) temel tasarım desen Model-View-Controller pattern.Denetleyicisibir Sunucu uygulaması () tarafından temsil edilmesi/özel kullanımlar doğrudan oluştururModelveGörünümbu isteğe bağlı.Modelolur Javabean sınıflar tarafından temsil edilecek. Bu genellikle daha dividableİş Modelieylemler (davranışlar) içeren veVeri Modelibu veri (bilgi) içeren.Görünümdoğrudan erişime sahip JSP dosyaları tarafından temsil edilmek üzere (Veri)ModelEL (Expression Language).

Eylemler ve olaylar nasıl işlendiğini temel farklılıklar vardır. Popüler olanlar:

  • İstek (eylem) MVC tabanlıbu uygulamak için en basit olanıdır. (İş)ModelHttpServletRequest HttpServletResponse ile çalışır doğrudan nesneleri. Toplamak için, ve istek dönüştürmek doğrulama parametreleri (çoğunlukla) Kendin yapmalısın.Görünümdüz vanilya HTML/CSS/JS tarafından temsil edilebilir ve devlet istekleri karşısında tutmaz. Bu diğerleri arasında Spring MVC, Struts ve Stripes nasıl işliyor.

  • Bileşen MVC tabanlıbu zor uygulamaktır. Ama daha basit bir model ile sonuna kadar ve neyin tüm bu "ham" Sunucu uygulaması API tamamen uzak soyutlanmış. görünüm Toplamak ve istek parametreleri kendini dönüştürmek doğrulamak için ihtiyaç vermemeliydin.Denetleyicisibu görev ve toplanan dönüştürülmüş ve onaylanmış istek parametrelerini ayarlarModel. Tüm yapmanız gereken doğrudan model özellikleri ile çalışır, eylem yöntemleri tanımlamaktır.Görünüm""sırayla HTML/CSS/JS. oluşturur JSP taglibs veya XML öğeleri lezzet bileşenleri tarafından temsil edilir Bu durumuGörünümsonraki istekleri oturumda yapılmaktadır. Bu sunucu tarafı dönüşüm, doğrulama ve değer olayları değiştirmek için özellikle çok yararlıdır. Bu diğerleri arasında JSF, Wicket Play! nasıl işliyor.

Bir yan not olarak, etrafında homegrown bir MVC çerçeve ile hobbying çok güzel bir öğrenme egzersiz ve kişisel/özel amaçlar için devam ettiğin sürece öneririm. Ama profesyonel geçtikten sonra, o hala kendi yaratmak yerine varolan bir çerçeve almak için tavsiye. Mevcut ve iyi gelişmiş bir öğrenim çerçevesi ve sağlam bir çerçeve geliştirme ve sürdürme kendinizi daha uzun vadede daha az zaman alır.

Aşağıda ayrıntılı açıklama daha kolay uygulamak beri kendimi tabanlı MVC istemek için kısıtlamak gerekir.


Front Controller pattern (Mediator pattern)

İlk olarak,Denetleyicisibölüm Front Controller pattern Mediator pattern özel bir tür olan) uygulamak gerekir. Tüm istekleri için merkezi bir giriş noktası sağlayan sadece tek bir sunucu oluşmalıdır. Bu yaratmalıdırModelbilgi istek tarafından kullanılabilir, pathınfo veya servletpath, yöntemi ve/veya belirli parametreleri gibi dayalı.İş ModeliAction denir HttpServlet örnek aşağıda.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        Action action = ActionFactory.getAction(request);
        String view = action.execute(request, response);

        if (view.equals(request.getPathInfo().substring(1)) {
            request.getRequestDispatcher("/WEB-INF/"   view   ".jsp").forward(request, response);
        }
        else {
            response.sendRedirect(view); // We'd like to fire redirect in case of a view change as result of the action (PRG pattern).
        }
    }
    catch (Exception e) {
        throw new ServletException("Executing action failed.", e);
    }
}

Eylem yürütülürken bazı tanımlayıcı görünüm bulmak için dönmelidir. En basit bu JSP dosya adı olarak kullanmak olacaktır. Bu 13* örneğin /pages/*, *.do *hatta *.html url-pattern belirli bir sunucu uygulaması üzerinde göster.

Durumunda önek-desenleri için örnek /pages/* olabilir çağırmak URL gibi http://example.com/pages/register, http://example.com/pages/login, vb ve sağlamak /WEB-INF/register.jsp, /WEB-INF/login.jsp ile uygun ve SONRASI eylemler. *, login, *20 parça vb örnek olarak yukarıdaki request.getPathInfo() tarafından kullanılabilir.

Ne zaman kullanıyorsun sonek-desenleri gibi *.do, *.html, vb, daha sonra daha sonra çağırmak URL gibi http://example.com/register.do, http://example.com/login.do, vb ve gerekir değişikliği kod örnekleri bu cevap (de ActionFactory) ayıklamak için register login parçalar request.getServletPath() yerine.


Strategy pattern

Action Strategy pattern takip etmelidir. Esas işi olan soyut/arabirim türü olarak tanımlanmış olması gerekiyorgeçtisoyut yöntem (bu soyut/arabirim türü iletilen-in sırasında . hangi değişkenler üzerinde temel çalışmaları yapmalıdır ** 76, neyin fark olduğunu görürüz ^em>yaratılışuygulama).

public interface Action {
    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

Exception ActionException gibi özel bir istisna ile daha özel yapmak isteyebilirsiniz. Sadece temel başlangıç bir örnek, gerisi size kalmış.

Burada kullanıcı hangi günlükleri LoginAction bir örneği. User kendisi dönüşündeVeri Modeli.GörünümUser varlığının farkında.

public class LoginAction implements Action {

    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userDAO.find(username, password);

        if (user != null) {
            request.getSession().setAttribute("user", user); // Login user.
            return "home"; // Redirect to home page.
        }
        else {
            request.setAttribute("error", "Unknown username/password. Please retry."); // Store error message in request scope.
            return "login"; // Go back to redisplay login form with error.
        }
    }

}

Factory method pattern

ActionFactory Factory method pattern takip etmelidir. Temel olarak, soyut/arayüz bir tür somut bir uygulama döndüren bölümünde prestij etmesi bir yöntem sağlar. Bu durumda, Action arabirim bilgi isteği dayanarak verdiği bir uygulama dönmelidir. Örneğin, method pathinfo (pathınfo sorgu dizesi hariç isteği URL içeriği ve sunucu uygulaması yolu, sonraki bölümüdür).

public static Action getAction(HttpServletRequest request) {
    return actions.get(request.getMethod()   request.getPathInfo());
}

Sırayla actions bazı statik/applicationwide olmalıdır bilinen tüm eylemler tutan Map<String, Action>. Bu harita doldurmak için nasıl size kalmış. Hardcoding:

actions.put("POST/register", new RegisterAction());
actions.put("POST/login", new LoginAction());
actions.put("GET/logout", new LogoutAction());
// ...

Ya da sınıf özellikleri/XML yapılandırma dosyası: yapılandırılabilir (sözde)

for (Entry entry : configuration) {
    actions.put(entry.getKey(), Class.forName(entry.getValue()).newInstance());
}

Ya da dinamik olarak belirli bir arabirim ve/veya ek açıklama uygulama: sınıflar için sınıf tarama dayalı (sözde)

for (ClassFile classFile : classpath) {
    if (classFile.isInstanceOf(Action.class)) {
       actions.put(classFile.getAnnotation("mapping"), classFile.newInstance());
    }
}

Aklında sadece "hiçbir şey" eşleştirme var hiçbir durumda Action. bir oluşturmak için devam Örneğin request.getPathInfo().substring(1) doğrudan geri dönün bakalım.


Diğer desenler

Bu önemli desenleri şimdiye kadar.

Bir adım ileri, geçer Facade pattern oluşturmak için Context sınıf içinde dönüş kaç lira, istek ve yanıt nesneleri ve teklifler birkaç uygun yöntem için temsilci seçme için istek ve yanıt nesneleri ve geçiş olarak tartışma Action#execute() yöntem yerine. Bu ekstra soyut bir katman ham Sunucu API uzakta gizlemek için ekler. O zaman temelde gelişecektirsıfırAction her uygulama import javax.servlet.* bildirimleri. AKSARAY açısından, bu FacesContext ExternalContext sınıflar yapıyor. this answer somut bir örnek bulabilirsiniz.

Sonra State pattern bu durumda eklemek istediğin bir ekstra soyutlama katmanı böl görevleri toplama isteği parametreleri, onları dönüştürme, doğrulama onlara, güncellenmesi model değerleri ve yürütme eylemleri. AKSARAY açısından, bu LifeCycle yaptığı şey de budur.

Sonra bir bileşen modeli ile takılabilir ve istek durumuna göre değişen görünüm ömrü tabanlı oluşturmak istediğiniz bu durum için Composite pattern var. AKSARAY açısından, bu UIComponent temsil nedir.

Bu şekilde bir bileşen çerçeve tabanlı doğru yavaş yavaş gelişebilir.


Ayrıca Bkz:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bmarian22

    bmarian22

    22 Aralık 2007
  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007
  • spederson7

    spederson7

    17 Temmuz 2006