दिलचस्प पोस्ट
जावास्क्रिप्ट में बहुभाषी स्ट्रिंग बनाना बाश में एक कमांड के साथ शैल चर के लिए डिफ़ॉल्ट मान असाइन करना कैसे डिस्क पर छवि के रूप में एक साजिश को बचाने के लिए? जावा का उपयोग करके आईपी स्थान अगले सोमवार की तारीख, मंगलवार, आदि प्राप्त करें JavaFX: "टूलकिट" मीडियाप्लेयर क्लास के माध्यम से एक एमपी 3 फाइल चलाने की कोशिश करते समय प्रारंभ नहीं किया गया गिट उपनाम – एकाधिक आदेश और पैरामीटर फायरबेज मैसेजिंग NoSuchMethodError.zzUr अपवाद जावा: स्टेटिक क्लास? क्रमबद्ध क्रम में एक सरणी के सभी क्रमपरिवर्तन कैसे उत्पन्न करें? गिट का उपयोग करना, सभी शाखाओं में हैं, लेकिन अन्य (अन्य) एनजी-क्लास का उपयोग कर अंगुल्यजेएस टॉगल क्लास ssl_error_rx_record_too_long और अपाचे SSL कौन सी पात्रों को सी # वर्ग के नाम में अनुमति है? क्या सी ++ के लिए एक LINQ पुस्तकालय है?

डिजाइन पैटर्न वेब आधारित अनुप्रयोग

मैं एक साधारण वेब आधारित अनुप्रयोग तैयार कर रहा हूँ मैं इस वेब-आधारित डोमेन के लिए नया हूँ। आपको डिज़ाइन पैटर्न के बारे में आपकी सलाह की आवश्यकता है जैसे Servlets, नए सर्विसलेट आदि बनाने के लिए मापदंडों के बीच जिम्मेदारी कैसे बांटना चाहिए।

दरअसल, मेरे पास मेरे होम पेज पर कुछ संस्थाएं हैं और उनमें से प्रत्येक के साथ हमारे पास कुछ विकल्प हैं जैसे जोड़ें, संपादित करें और हटाएं इससे पहले मैं प्रति विकल्प जैसे एक सर्लेट का उपयोग कर रहा था जैसे Servlet1 के लिए add entity1, Servlet2 को संपादित करें इकाई 1 और इसी तरह से और इसी तरह हम बहुत सारी सर्विसलेट्स को समाप्त कर चुके हैं।

अब हम अपना डिजाइन बदल रहे हैं मेरा प्रश्न यह है कि आप कैसे ठीक से चुनते हैं कि आप सर्वलेट की जिम्मेदारी कैसे चुनते हैं क्या हमारे पास एक इकाई सर्विसलेट है जो उसके सभी विकल्पों पर कार्रवाई करेगी और सर्विस लेयर के लिए अग्रेषित अनुरोध करेगी। या क्या हमारे पास पूरे पृष्ठ के लिए एक सर्वलेट होना चाहिए जो पूरे पृष्ठ अनुरोध को संसाधित करेगा और उसके बाद संबंधित सर्विस लेयर को अग्रेषित करेगा? साथ ही, अनुरोध ऑब्जेक्ट को सेवा स्तर पर अग्रेषित किया जाना चाहिए या नहीं

Solutions Collecting From Web of "डिजाइन पैटर्न वेब आधारित अनुप्रयोग"

थोड़ा अच्छा वेब अनुप्रयोग में डिजाइन पैटर्न का मिश्रण होता है मैं केवल सबसे महत्वपूर्ण लोगों का उल्लेख करता हूँ


मॉडल दृश्य नियंत्रक पैटर्न

आप उपयोग करना चाहते हैं कोर (वास्तुशिल्प) डिजाइन पैटर्न मॉडल-दृश्य-नियंत्रक पैटर्न है नियंत्रक को एक सर्विस के द्वारा प्रतिनिधित्व किया जाता है जो अनुरोध पर आधारित प्रत्यक्ष मॉडल / दृश्य का उपयोग करता है / करता है। मॉडल का प्रतिनिधित्व जबाबी वर्गों द्वारा किया जाता है। यह व्यापार मॉडल में अक्सर आगे बढ़ता है जिसमें क्रिया (व्यवहार) और डेटा मॉडल शामिल होता है जिसमें डेटा (सूचना) होता है। देखें जेएसपी फ़ाइलों द्वारा प्रस्तुत किया जाना है, जिनके पास ईएल (अभिव्यक्ति भाषा) द्वारा ( डेटा ) मॉडल तक सीधी पहुंच है।

इसके बाद, क्रियाओं और घटनाओं का प्रबंधन कैसे किया जाता है इसके आधार पर भिन्नताएं हैं। लोकप्रिय हैं:

  • अनुरोध (कार्रवाई) आधारित एमवीसी : यह लागू करने के लिए सबसे सरल है ( बिजनेस ) मॉडल सीधे HttpServletRequest और HttpServletResponse ऑब्जेक्ट्स के साथ काम करता है। आपको अनुरोध मापदंडों को इकट्ठा, कनवर्ट करना और मान्य करना होगा (अधिकतर) स्वयं। व्यू को सादे वैनिला एचटीएमएल / सीएसएस / जेएस द्वारा प्रस्तुत किया जा सकता है और यह सभी अनुरोधों में राज्य को बनाए नहीं रखता है। यह है कि स्प्रिंग एमवीसी , स्ट्रट्स और स्ट्रीप्स दूसरों के बीच काम करते हैं।

  • घटक आधारित एमवीसी : यह कार्यान्वयन करना कठिन है लेकिन आप एक सरल मॉडल के साथ समाप्त हो जाते हैं और देखें कि "सभी" कच्चे "सर्वलेट एपीआई पूरी तरह से पूरी तरह से abstracted है। आपको खुद को अनुरोध पैरामीटर इकट्ठा, कनवर्ट और मान्य करने की आवश्यकता नहीं होनी चाहिए। नियंत्रक इस कार्य को करता है और मॉडल में एकत्रित, रूपांतरित और मान्य अनुरोध मापदंडों को सेट करता है। आपको केवल उन सभी कार्य विधियों को परिभाषित करना है जो मॉडल गुणों के साथ सीधे काम करते हैं। देखें जेएसपी टैगलिब्स या एक्सएमएल तत्वों के स्वाद में "घटकों" द्वारा दर्शाया जाता है जो बदले में HTML / CSS / JS उत्पन्न करता है। बाद के अनुरोधों के लिए दृश्य की स्थिति सत्र में बनाए रखा है। यह सर्वर साइड रूपांतरण, वैधीकरण और मूल्य परिवर्तन की घटनाओं के लिए विशेष रूप से उपयोगी है। यह अन्य जेएसएफ , विकेट और प्ले के बीच में है! काम करता है।

एक तरफ नोट के रूप में, एक घर के एमवीसी फ्रेमवर्क के साथ आसपास की निगरानी एक बहुत अच्छा सीखने का अभ्यास है, और जब तक आप इसे निजी / निजी प्रयोजनों के लिए रख देते हैं, तब तक मैं इसे सुझाता हूं लेकिन एक बार जब आप व्यावसायिक हो जाते हैं, तो इसे अपने खुद के पुनर्मूल्यांकन के बजाय एक मौजूदा ढांचे को चुनने की सलाह दी जाती है एक मौजूदा तथा सुव्यवस्थित ढांचे को सीखना एक मजबूत ढांचे को विकसित करने और बनाए रखने से दीर्घकालिक कम समय लगता है।

नीचे विस्तृत विवरण में मैं स्वयं को सीमित MVC अनुरोध करने के लिए प्रतिबंधित कर सकता हूं क्योंकि यह कार्यान्वयन करना आसान है


फ्रंट नियंत्रक पैटर्न ( मध्यस्थ पैटर्न )

सबसे पहले, नियंत्रक का हिस्सा फ्रंट नियंत्रक पैटर्न को लागू करना चाहिए (जो एक विशिष्ट प्रकार का मध्यस्थ पैटर्न है )। इसमें केवल एक एकल सर्विसलेट शामिल होना चाहिए जो सभी अनुरोधों के एक केंद्रीकृत प्रविष्टि बिंदु प्रदान करता है। यह अनुरोध द्वारा उपलब्ध सूचना के आधार पर मॉडल बनाना चाहिए, जैसे कि पथनफ़ो या सबलेटपाथ, विधि और / या विशिष्ट पैरामीटर बिजनेस मॉडल को HttpServlet उदाहरण के नीचे कहा जाता है।

 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); } } 

कार्य निष्पादन को देखने के लिए कुछ पहचानकर्ता को वापस करना चाहिए। सरलतम इसे जेएसपी के फ़ाइल नाम के रूप में प्रयोग करना होगा। Web.xml में विशिष्ट url-pattern पर इस सर्वलेट को मानचित्रित करें, जैसे /pages/* , *.do या यहां तक ​​कि *.html

उदाहरण के लिए /pages/* रूप में उपसर्ग-पैटर्न के मामले में आप यूआरएल की तरह http://example.com/pages/register , http://example.com/pages/login आदि का आह्वान कर सकते हैं और /WEB-INF/register.jsp प्रदान कर सकते हैं /WEB-INF/register.jsp , /WEB-INF/login.jsp उचित GET और POST कार्यों के साथ। पार्ट्स register , login इत्यादि उपरोक्त उदाहरण के रूप में request.getPathInfo() द्वारा उपलब्ध हैं।

जब आप प्रत्यय-पैटर्न जैसे *.do , *.html , आदि का उपयोग कर रहे हैं, तब आप URL को http://example.com/register.do जैसे http://example.com/login.do , आदि और आपको इसके जवाब में कोड उदाहरणों को बदलना चाहिए (यह भी ActionFactory ) register और login भागों को request.getServletPath() बजाय निकालने के लिए।


रणनीति पैटर्न

Action को रणनीति पैटर्न का पालन करना चाहिए। इसे सार / इंटरफ़ेस प्रकार के रूप में परिभाषित करने की आवश्यकता होती है जो सार पद्धति के पास-इन तर्कों के आधार पर काम करना चाहिए (यह कमांड पैटर्न के साथ अंतर है, जिसमें सार / इंटरफ़ेस प्रकार को काम के आधार पर करना चाहिए कार्यान्वयन के निर्माण के दौरान पारित किया गया है जो तर्क)

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

आप Exception को एक विशिष्ट अपवाद जैसे ActionException साथ अधिक विशिष्ट बनाना चाहते हैं। यह सिर्फ एक मूल किकऑफ़ उदाहरण है, बाकी सब आपके ऊपर है

यहां एक LoginAction का उदाहरण दिया गया है (जो कि उसका नाम है) उपयोगकर्ता में लॉग करता है। User खुद एक डेटा मॉडल को चालू करता है। देखें User की उपस्थिति से अवगत है।

 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. } } } 

फैक्टरी विधि पैटर्न

ActionFactory को फैक्टरी विधि पैटर्न का पालन करना चाहिए। मूल रूप से, यह एक क्रिएशनल पद्धति प्रदान करनी चाहिए जो एक सार / इंटरफ़ेस प्रकार का एक ठोस क्रियान्वयन देता है। इस मामले में, अनुरोध द्वारा प्रदान की गई जानकारी के आधार पर Action इंटरफ़ेस के कार्यान्वयन को वापस करना चाहिए। उदाहरण के लिए, विधि और पथिनो (पथलाइन क्वेरी स्ट्रिंग को छोड़कर अनुरोध URL में संदर्भ और सर्वलेट पथ के बाद का हिस्सा है)।

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

बदले में actions कुछ स्थैतिक / एप्लिकेशन वाला Map<String, Action> होना चाहिए Map<String, Action> जो सभी ज्ञात कार्रवाइयां रखता है। यह आपके ऊपर निर्भर है कि इस नक्शे को कैसे भरें। कठिन कोडिंग:

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

क्लासपाथ में गुण / एक्सएमएल कॉन्फ़िगरेशन फ़ाइल के आधार पर या कॉन्फ़िगर करने योग्य है: (छद्म)

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

या गतिशील रूप से विशिष्ट अंतरफलक और / या एनोटेशन को लागू करने वाले कक्षाओं के लिए क्लासपाथ में स्कैन के आधार पर: (छद्म)

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

एक "कुछ नहीं करें" बनाने के लिए ध्यान रखें इस मामले के लिए कोई मैपिंग नहीं है इसे उदाहरण के लिए सीधे request.getPathInfo().substring(1) तब।


अन्य पैटर्न

ये अब तक महत्वपूर्ण पैटर्न थे।

एक कदम आगे बढ़ाने के लिए, आप एक Context वर्ग बनाने के लिए मुखौटा पैटर्न का इस्तेमाल कर सकते हैं जो बदले में अनुरोध और प्रतिक्रिया ऑब्जेक्ट्स को लपेटता है और अनुरोध और प्रतिक्रिया ऑब्जेक्ट्स को नियुक्त करने वाले कई सुविधा विधियों की पेशकश करता है और Action#execute() इसके बजाय विधि यह कच्चे Servlet एपीआई को दूर करने के लिए अतिरिक्त सार परत जोड़ता है आपको तब मूल रूप से शून्य import javax.servlet.* हर Action कार्यान्वयन में घोषणाओं के साथ खत्म करना चाहिए। जेएसएफ के नियमों में, FacesContext और ExternalContext क्लासेस क्या कर रहे हैं। आप इस जवाब में एक ठोस उदाहरण पा सकते हैं।

फिर इस मामले के लिए राज्य पैटर्न है कि आप अनुरोध मापदंडों को इकट्ठा करने, उन्हें परिवर्तित करने, उन्हें मान्य करने, मॉडल मान अपडेट करने और कार्यों को क्रियान्वित करने के कार्यों को विभाजित करने के लिए अतिरिक्त अमूर्त परत जोड़ना चाहते हैं। जेएसएफ के नियमों में, LifeCycle क्या कर रहा है।

फिर इस मामले के लिए समग्र पैटर्न है कि आप एक घटक आधारित दृश्य बनाना चाहते हैं जो मॉडल से जुड़ा हो सकता है और जिसका व्यवहार अनुरोध आधारित जीवनचक्र की स्थिति पर निर्भर करता है। जेएसएफ के नियमों में, UIComponent प्रतिनिधित्व करते हैं।

इस तरह आप एक घटक आधारित ढांचे के मुकाबले बिट के द्वारा थोड़ा सा विकसित कर सकते हैं।


यह भी देखें:

  • जावा के मुख्य पुस्तकालयों में GoF डिजाइन पैटर्न के उदाहरण
  • अनुरोध एमवीसी और घटक एमवीसी के बीच अंतर
  • जेएसडीपी में जेडीपी पेज में एमडीसी और डीएओ पैटर्न का उपयोग करते हुए JDBC ResultSet सेट करें
  • जेएसएफ एमवीसी ढांचे में एमवीसी क्या घटक हैं?
  • जेएसएफ नियंत्रक, सेवा और डीएओ

पीट-अप एमवीसी पैटर्न में, सर्लेट "सी" – नियंत्रक है।

इसका मुख्य काम प्रारंभिक अनुरोध मूल्यांकन करना है और फिर विशिष्ट कार्यकर्ता को आरंभिक मूल्यांकन के आधार पर प्रसंस्करण प्रेषित करना है। कार्यकर्ता की ज़िम्मेदारियों में से एक कुछ प्रस्तुति स्तर सेम को सेटअप करने और एचटीएमएल प्रस्तुत करने के लिए जेएसपी पेज के अनुरोध को अग्रेषित करने के लिए हो सकता है। इसलिए, अकेले इस कारण के लिए, आपको सेवा के लिए अनुरोध ऑब्जेक्ट पास करना होगा।

हालांकि, मैं कच्चे Servlet वर्ग लिखना शुरू नहीं करूंगा। वे जो कार्य करते हैं वह बहुत उम्मीदवार और बॉयलरप्लेट है, जो कि ढांचा बहुत अच्छी तरह से करता है सौभाग्य से, कई उपलब्ध, समय-परीक्षण वाले उम्मीदवारों (वर्णानुक्रमिक क्रम में): अपाचे विकेट , जावा सर्वर चेहरे , कुछ नामों के लिए वसंत ।

आईएमएचओ, यदि आप इसे जिम्मेदारी के कोण के कोण से देखते हैं तो वेब अनुप्रयोग के मामले में कोई अंतर नहीं है। हालांकि, परत में स्पष्टता रखें प्रस्तुतिकरण के लिए प्रस्तुति उद्देश्य के लिए विशुद्ध रूप से कुछ भी रखें, जैसे नियंत्रण और वेब नियंत्रण के लिए विशिष्ट कोड। व्यापार परत में बस अपनी संस्थाओं को रखने और सभी सुविधाओं (जैसे कि जोड़ना, संपादित करना, हटाना आदि) हालांकि उन्हें प्रस्तुति परत में संभाला जाने वाला ब्राउज़र पर प्रतिपादित करना .NET के लिए, एएसपी.नेट एमवीसी पैटर्न परतों को अलग रखने के मामले में बहुत अच्छा है। MVC पैटर्न में देखें

मैंने स्ट्रट फ्रेमवर्क का इस्तेमाल किया है और यह सीखना काफी आसान है। स्ट्रट फ्रेमवर्क का उपयोग करते समय आपकी साइट के प्रत्येक पृष्ठ में निम्न आइटम होंगे

1) एचटीएमएल पेज ताज़ा होने पर हर बार एक्शन का प्रयोग किया जाता है। इस क्रिया को फॉर्म में डेटा को पॉप्युलेट करना चाहिए जब पृष्ठ पहली बार लोड हो जाता है और वेब यूआई और बिजनेस लेयर के बीच के इंटरैक्शन का प्रबंधन करता है। अगर आप मसौदा जाव ऑब्जेक्ट को संशोधित करने के लिए jsp पृष्ठ का उपयोग कर रहे हैं, तो जवा ऑब्जेक्ट की एक प्रति मूल के बजाय प्रपत्र में संग्रहीत किया जाना चाहिए ताकि मूल डेटा को संशोधित न किया जाए, जब तक उपयोगकर्ता पृष्ठ सहेज न करे।

2) फॉर्म और जेएसपी पृष्ठ के बीच डेटा स्थानांतरित करने के लिए उपयोग किया जाता है। इस ऑब्जेक्ट में एट्रिब्यूट्स के लिए गेस्टेटर और सेटर्स का एक सेट होना चाहिए, जिसे जेएसपी फ़ाइल तक पहुंचने की आवश्यकता है। इस फॉर्म में डेटा जारी करने से पहले इसे कायम रखने के लिए एक विधि भी होती है।

3) एक जेस्प पेज जो पेज के अंतिम एचटीएमएल को प्रस्तुत करने के लिए उपयोग किया जाता है। जेएसपी पेज एचटीएमएल के एक संकर और फॉर्म में डेटा का उपयोग करने और हेरफेर करने के लिए उपयोग किए जाने वाले विशेष स्ट्रट्स टैग हैं। यद्यपि स्ट्रैट्स ने जावा कोड को जावा कोड में सम्मिलित करने की अनुमति दी है, लेकिन आपको यह करने में बहुत सावधान रहना चाहिए क्योंकि यह आपके कोड को पढ़ने में अधिक कठिन बना देता है। जेएसपी फ़ाइलों के भीतर जावा कोड डिबग करना मुश्किल है और इकाई परीक्षण नहीं किया जा सकता। यदि आप खुद को jsp फ़ाइल के अंदर 4-5 से अधिक जावा कोड लिखते हैं तो कोड को कार्रवाई में ले जाना चाहिए।

BalusC उत्कृष्ट जवाब वेब अनुप्रयोगों के लिए सबसे अधिक पैटर्न शामिल हैं

कुछ एप्लिकेशन को चेन ऑफ दायित्व_पाटन की आवश्यकता हो सकती है

ऑब्जेक्ट-ओरिएंटेड डिज़ाइन में, चेन ऑफ़ डिज़िबिलिटी पैटर्न एक डिज़ाइन पैटर्न है जिसमें कमांड ऑब्जेक्ट्स और प्रोसेसिंग ऑब्जेक्ट्स की एक श्रृंखला शामिल होती है। प्रत्येक प्रसंस्करण ऑब्जेक्ट में तर्क होता है जो कमांड ऑब्जेक्ट के प्रकार को परिभाषित करता है जो इसे संभाल सकता है; शेष श्रृंखला में अगली प्रसंस्करण ऑब्जेक्ट को पारित कर दिया जाता है।

इस पैटर्न का उपयोग करने के लिए केस का उपयोग करें:

जब हेन्डलर एक अनुरोध (कमांड) संसाधित करने के लिए अज्ञात है और यह अनुरोध एकाधिक ऑब्जेक्ट्स पर भेजा जा सकता है। आम तौर पर आप ऑब्जेक्ट के उत्तराधिकारी सेट करते हैं। यदि वर्तमान ऑब्जेक्ट अनुरोध को संभाल नहीं सकता है या आंशिक रूप से अनुरोध को संसाधित कर सकता है और उत्तराधिकारी को उसी अनुरोध को अग्रेषित कर सकता है।

उपयोगी एसई प्रश्न / लेख:

मैं डेकोरेटर पर कभी दायित्व की चेन का उपयोग क्यों करूं?

जिम्मेदारियों की श्रृंखला के लिए आम उपयोग हैं?

ओऑससाइन से चेन-ऑफ- डेबिलिटी -पैटर्न

स्रोत निर्माण से चेन_ओफ़_अभियानशीलता