ডিজাইন প্যাটার্নস ওয়েব ভিত্তিক অ্যাপ্লিকেশন [বন্ধ]


359

আমি একটি সাধারণ ওয়েব-ভিত্তিক অ্যাপ্লিকেশন ডিজাইন করছি। আমি এই ওয়েব-ভিত্তিক ডোমেইনে নতুন। সার্ভলেটগুলির মধ্যে কীভাবে দায়িত্ব বিতরণ করা উচিত, নতুন সার্লেট তৈরির মানদণ্ড ইত্যাদি like ডিজাইনের ধরণগুলি সম্পর্কে আমার আপনার পরামর্শের দরকার ছিল etc.

প্রকৃতপক্ষে, আমার হোম পেজে আমার কয়েকটি সত্ত্বা রয়েছে এবং সেগুলির প্রত্যেকের সাথে আমাদের যুক্ত, সম্পাদনা এবং মোছার মতো কয়েকটি বিকল্প রয়েছে। এর আগে আমি সার্টিলেট 1 যুক্ত সত্তা 1 এর জন্য সার্ভলেট 1, সত্তা1 সম্পাদনা করার জন্য সার্লেট 2 এবং এই জাতীয় ব্যবহার করেছিলাম এবং এভাবে আমরা প্রচুর সংখ্যক সার্লেলেট পেয়ে শেষ করেছি।

এখন আমরা আমাদের নকশা পরিবর্তন করছি। আমার প্রশ্ন হ'ল আপনি কোনও সার্লেটের দায়িত্ব কীভাবে বেছে নিচ্ছেন তা আপনি ঠিক কীভাবে চয়ন করেন। আমাদের প্রতি সত্তা প্রতি একটি সার্লেট থাকতে হবে যা এর সমস্ত বিকল্পগুলি প্রক্রিয়া করবে এবং পরিষেবা স্তরে অনুরোধটি প্রেরণ করবে। বা আমাদের পুরো পৃষ্ঠার জন্য একটি সার্লেট থাকতে হবে যা পুরো পৃষ্ঠার অনুরোধটি প্রক্রিয়া করবে এবং তারপরে এটি সম্পর্কিত পরিষেবা স্তরটিতে ফরোয়ার্ড করবে? এছাড়াও, অনুরোধটি পরিষেবা স্তরটিতে প্রেরণ করা উচিত বা না উচিত।


8
সত্যিকার অর্থে ডিজাইনের নকশাগুলি নয়, তবে পিআরজি (পুনঃনির্দেশ-প্রাপ্ত) এবং হাইজ্যাক্সকে ভুলে যাবেন না (প্রথমে কোনও জেএস নিয়ে কাজ করবেন না, তারপরে অ্যাজাক্সের সাথে লিঙ্কগুলি এবং বোতামগুলি হাইজ্যাক করুন)
নিল ম্যাকগুইগান

উত্তর:


488

কিছুটা শালীন ওয়েব অ্যাপ্লিকেশনটিতে নকশার ধরণগুলির মিশ্রণ রয়েছে। আমি কেবল সবচেয়ে গুরুত্বপূর্ণ বিষয়গুলি উল্লেখ করব।


মডেল ভিউ কন্ট্রোলার নিদর্শন

আপনি যে কোর (আর্কিটেকচারাল) ডিজাইন প্যাটার্নটি ব্যবহার করতে চান তা হ'ল মডেল-ভিউ-কন্ট্রোলার প্যাটার্নকন্ট্রোলার একটি সার্ভলেট যা (IN) সরাসরি সৃষ্টি দ্বারা প্রতিনিধিত্ব করা হয় / একটি নির্দিষ্ট ব্যবহার মডেল এবং দেখুন অনুরোধ উপর ভিত্তি করে। মডেল জাভা বিন শ্রেণীর দ্বারা প্রতিনিধিত্ব করা হয়। এটি প্রায়শই বিজনেস মডেলে আরও বিভাজ্য হয় যার মধ্যে ক্রিয়া (আচরণ) এবং ডেটা মডেল থাকে যা ডেটা (তথ্য) ধারণ করে। দেখুন যা (থেকে সরাসরি প্রবেশাধিকার আছে JSP ফাইল দ্বারা প্রতিনিধিত্ব করা হয় ডেটা ) মডেল দ্বারা এল (এক্সপ্রেশন ভাষা)।

তারপরে, কীভাবে ক্রিয়া এবং ইভেন্টগুলি পরিচালনা করা হয় তার উপর ভিত্তি করে বিভিন্ন পরিবর্তন রয়েছে ations জনপ্রিয়গুলি হলেন:

  • অনুরোধ (অ্যাকশন) ভিত্তিক এমভিসি : এটি কার্যকর করার জন্য সবচেয়ে সহজ। ( ব্যবসায় ) মডেল সরাসরি HttpServletRequestএবং HttpServletResponseঅবজেক্টের সাথে কাজ করে। আপনাকে অনুরোধের পরামিতিগুলি (বেশিরভাগ) নিজেই সংগ্রহ করতে হবে, রূপান্তর করতে হবে এবং যাচাই করতে হবে। দেখুন প্লেইন ভ্যানিলা এইচটিএমএল / সিএসএস / জেএস এবং এটি বজায় রাখা না অনুরোধ জুড়ে রাষ্ট্র দ্বারা প্রতিনিধিত্ব করা যেতে পারে। অন্যদের মধ্যে স্প্রিং এমভিসি , স্ট্রুটস এবং স্ট্রিপস এইভাবে কাজ করে।

  • উপাদান ভিত্তিক এমভিসি : এটি প্রয়োগ করা আরও কঠিন। তবে আপনি একটি সহজ মডেল দিয়ে শেষ করেছেন এবং দেখুন যে সমস্ত "কাঁচা" সার্ভলেট এপিআই সম্পূর্ণ বিমূর্তভাবে দূরে রয়েছে। আপনার নিজের অনুরোধের প্যারামিটারগুলি সংগ্রহ, রূপান্তর এবং বৈধ করার দরকার নেই। কন্ট্রোলার এই কাজের এবং সেট জড়ো, রূপান্তরিত এবং বৈধ অনুরোধ মাপকাঠিগুলি করে মডেল । আপনাকে যা করার দরকার তা হ'ল মডেল বৈশিষ্ট্যগুলির সাথে সরাসরি কাজ করে এমন ক্রিয়া পদ্ধতি সংজ্ঞায়িত করা। দেখুন JSP taglibs বা XML উপাদান যা আবার উত্পন্ন এইচটিএমএল / সিএসএস / জেএস গন্ধ মধ্যে "উপাদান" দ্বারা প্রতিনিধিত্ব করা হয়। রাষ্ট্রের দেখুনপরবর্তী অনুরোধগুলির জন্য অধিবেশনটিতে রক্ষণাবেক্ষণ করা হয়। এটি সার্ভার-সাইড রূপান্তর, বৈধতা এবং মান পরিবর্তন ইভেন্টের জন্য বিশেষভাবে সহায়ক। অন্যদের মধ্যে এইভাবে জেএসএফ , উইকেট এবং খেলুন! কাজ করে।

পার্শ্ব নোট হিসাবে, একটি স্বজাতীয় এমভিসি কাঠামোর সাথে শখ করা একটি খুব দুর্দান্ত শেখার অনুশীলন, এবং যতক্ষণ না আপনি ব্যক্তিগত / ব্যক্তিগত উদ্দেশ্যে রাখেন ততক্ষণ আমি এটির প্রস্তাব দিই। তবে একবার আপনি পেশাদার হয়ে যান, তারপরে আপনার নিজের পুনরায় উদ্ভাবনের পরিবর্তে একটি বিদ্যমান কাঠামো বেছে নেওয়ার পক্ষে দৃ strongly়ভাবে সুপারিশ করা হয়। একটি বিদ্যমান এবং সু-বিকাশযুক্ত কাঠামো শিখতে দীর্ঘমেয়াদে নিজেকে একটি শক্তিশালী কাঠামো তৈরি এবং বজায় রাখার চেয়ে কম সময় লাগে।

নীচের বিশদ বিবরণে আমি নিজেকে ভিত্তিক এমভিসি অনুরোধ করতে সীমাবদ্ধ করব যেহেতু এটি কার্যকর করা সহজ।


সামনের নিয়ামক প্যাটার্ন ( মধ্যস্থতার প্যাটার্ন )

প্রথমত, কন্ট্রোলার অংশটি ফ্রন্ট কন্ট্রোলার প্যাটার্ন (যা একটি বিশেষ ধরণের মধ্যস্থতাকারী প্যাটার্ন ) প্রয়োগ করতে হবে । এটিতে কেবল একটি একক সার্লেট থাকা উচিত যা সমস্ত অনুরোধের কেন্দ্রীয়ভাবে প্রবেশের পয়েন্ট সরবরাহ করে। এটি অনুরোধের মাধ্যমে প্রাপ্ত তথ্যের উপর ভিত্তি করে মডেল তৈরি করা উচিত , যেমন প্যাথিনফো বা সার্লেটলেট, পদ্ধতি এবং / অথবা নির্দিষ্ট পরামিতি। ব্যবসায়িক মডেল বলা হয় Actionনীচের 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);
    }
}

ক্রিয়াকলাপটি সম্পাদন করে দৃশ্যটি সনাক্ত করতে কিছু শনাক্তকারীকে ফিরিয়ে দেওয়া উচিত। সবচেয়ে সহজ হ'ল এটি জেএসপির ফাইল নাম হিসাবে ব্যবহার করা। একটি নির্দিষ্ট এই সার্ভলেট মানচিত্র url-patternমধ্যে web.xml, যেমন /pages/*, *.doবা এমনকি মাত্র *.html

উদাহরণ হিসেবে উপসর্গ-রীতির যদি /pages/*তোমরা পারা ডাকা URL টি মত http://example.com/pages/register , http://example.com/pages/login , ইত্যাদি এবং প্রদান /WEB-INF/register.jsp, /WEB-INF/login.jspযথাযথ এবং GET পোস্ট কর্মের । অংশগুলি 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অনুরোধের সরবরাহিত তথ্যের ভিত্তিতে ইন্টারফেসের একটি প্রয়োগ ফিরিয়ে আনতে হবে। উদাহরণস্বরূপ, পদ্ধতি এবং প্যাথিনফো (ক্যোরিয় স্ট্রিং ব্যতীত অনুরোধ ইউআরএল মধ্যে প্রসঙ্গ এবং সার্লেট পাথের পরে প্যাথিনফো অংশ)।

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

actionsপালাক্রমে কিছু স্ট্যাটিক / applicationwide হওয়া উচিত Map<String, Action>যা সব পরিচিত ক্রিয়া ঝুলিতে। কীভাবে এই মানচিত্রটি পূরণ করবেন এটি আপনার উপর নির্ভর করে। Hardcoding:

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

Actionমামলার কোনও ম্যাপিং নেই এমন ক্ষেত্রে "কিছুই করবেন না" তৈরির বিষয়টি মনে রাখবেন । উদাহরণস্বরূপ এটি সরাসরি তত্ক্ষণাত আসুন request.getPathInfo().substring(1)


অন্যান্য নিদর্শন

এগুলি এখন পর্যন্ত গুরুত্বপূর্ণ নিদর্শন ছিল।

আরও একটি পদক্ষেপ পেতে, আপনি মুখোমুখি প্যাটার্নটি এমন একটি Contextশ্রেণি তৈরি করতে ব্যবহার করতে পারেন যা অনুরোধ এবং প্রতিক্রিয়া অবজেক্টগুলিকে আবৃত করে এবং অনুরোধ এবং প্রতিক্রিয়া অবজেক্টগুলিকে অর্পণ করে বিভিন্ন সুবিধামত পদ্ধতি সরবরাহ করে এবং Action#execute()পরিবর্তে পদ্ধতিতে যুক্তি হিসাবে পাস করে। এটি কাঁচা সরললেট এপিআই দূরে লুকানোর জন্য একটি অতিরিক্ত বিমূর্ত স্তর যুক্ত করে। তারপরে আপনার অবশ্যই প্রতিটি বাস্তবায়নের শূন্য import javax.servlet.* ঘোষণার সাথে শেষ করা উচিত Action। জেএসএফের ভাষায়, এটি FacesContextএবং ExternalContextক্লাসগুলি কী করছে। আপনি এই উত্তরের একটি দৃ concrete় উদাহরণ খুঁজে পেতে পারেন ।

তারপরে সেই মামলার স্টেট প্যাটার্ন রয়েছে যে আপনি অনুরোধের পরামিতিগুলি সংগ্রহ করার, তাদের রূপান্তরকরণ, তাদের বৈধকরণ, মডেল মানগুলি আপডেট করার এবং ক্রিয়াকলাপ সম্পাদনের কাজগুলিকে বিভক্ত করার জন্য একটি অতিরিক্ত বিমূর্ত স্তর যুক্ত করতে চান। জেএসএফের ভাষায়, এটি LifeCycleযা করছে।

তারপরে মামলার সংমিশ্রণ প্যাটার্ন রয়েছে যে আপনি কোনও উপাদান ভিত্তিক ভিউ তৈরি করতে চান যা মডেলটির সাথে সংযুক্ত হতে পারে এবং যার আচরণের অনুরোধ ভিত্তিক লাইফসাইকের অবস্থার উপর নির্ভর করে। জেএসএফের ভাষায়, এটিই UIComponentপ্রতিনিধিত্ব করে।

এভাবে আপনি কোনও উপাদান ভিত্তিক কাঠামোর দিকে কিছুটা হলেও বিবর্তিত হতে পারেন।


আরো দেখুন:


4
@ মাসাটো: আপনি উদাহরণস্বরূপ স্ট্যাটিক ইনিশিয়ালাইজার ব্লকটি করতে পারেন could
BalusC

1
@ মাসাটো: যাইহোক, আপনি যদি সেগুলি থেকে পুনরুদ্ধার করতে চান তবে আপনি এটির জন্য web.xmlএকটি ব্যবহার করতে পারেন ServletContextListener। কারখানা তা বাস্তবায়ন (এবং হিসাবে নিবন্ধিত আছে <listener>মধ্যে web.xml) এবং সময় ভর্তি কাজ contextInitialized()পদ্ধতি।
BalusC

3
"Post_servlet" এর পরিবর্তে অ্যাকশনে যে কাজটি করা উচিত তা করুন। আপনার একাধিক সার্লেট থাকা উচিত নয়। ব্যবসায়ের জিনিসগুলি অ্যাকশন ক্লাসে করা উচিত। আপনি যদি এটি একটি নতুন অনুরোধ হতে চান তবে অন্য কোনও দর্শনে ফিরুন যা পুনর্নির্দেশের কারণ এবং জিইটি অনুরোধের সাথে সম্পর্কিত নতুন ক্রিয়ায় কাজটি করবে।
বালুসসি

2
নির্ভর করে। Actionসাধারণ সার্লেলেটগুলির মতো ঠিক একইভাবে বাস্তবায়নের ক্ষেত্রে এটি করা সহজ ( একটি বেসিক উদাহরণের জন্য সার্লেলেট উইকিও দেখুন , যা আপনি কিছু Validatorইন্টারফেসে রিফ্যাক্টর মুক্ত করতে পারেন )। তবে আপনি ক্রিয়াটি চালনার আগে এটিও করতে পারেন, তবে এটি আরও জটিল কারণ এর জন্য প্রতি-ভিউ ভিত্তিতে বৈধতা সংক্রান্ত নিয়মগুলি জানা থাকা দরকার। JSF নৈবেদ্য এই আচ্ছাদিত হয়েছে required="true", validator="customValidatorName"এক্সএইচটিএমএল মার্কআপ মধ্যে, ইত্যাদি।
বালাসসি

2
@ অ্যান্ড্রেবোটালভ: এমএসসি ফ্রেমওয়ার্কগুলির জেএসএফ, স্প্রিং এমভিসি, উইকেট, স্ট্রুটস 2, ইত্যাদির সোর্স কোডটি চেক করুন এগুলি সমস্ত ওপেন সোর্স।
বালাসসি

13

পিট-আপ এমভিসি প্যাটার্নে, সার্লেটটি "সি" - নিয়ামক।

এর প্রাথমিক কাজটি প্রাথমিক অনুরোধের মূল্যায়ন করা এবং তারপরে নির্দিষ্ট কর্মীর কাছে প্রাথমিক মূল্যায়নের ভিত্তিতে প্রসেসিং প্রেরণ করা। শ্রমিকের একটি দায়িত্ব হতে পারে কিছু উপস্থাপনা স্তর বিনগুলি সেটআপ করা এবং এইচটিএমএল রেন্ডার করার জন্য জেএসপি পৃষ্ঠায় অনুরোধটি ফরোয়ার্ড করা। সুতরাং, একা এই কারণেই, আপনাকে অনুরোধ অবজেক্টটি পরিষেবা স্তরে পাস করতে হবে।

যদিও আমি কাঁচা Servletক্লাস লেখা শুরু করতাম না । তারা যে কাজটি করে তা খুব অনুমানযোগ্য এবং বয়লারপ্লেট, ফ্রেমওয়ার্ক খুব ভাল করে এমন কিছু করে। ভাগ্যক্রমে, অনেকগুলি উপলভ্য, সময়-পরীক্ষিত প্রার্থী রয়েছে (বর্ণানুক্রমিক ক্রমে): অ্যাপাচি উইকেট , জাভা সার্ভার ফেসস , স্প্রিং এর কয়েকটি নাম রয়েছে।


5

আইএমএইচও, আপনি যদি দায়িত্ব নির্ধারণের কোণ থেকে দেখে থাকেন তবে ওয়েব অ্যাপ্লিকেশনটির ক্ষেত্রে খুব বেশি পার্থক্য নেই। তবে স্তরটিতে স্পষ্টতা রাখুন keep ওয়েব নিয়ন্ত্রণগুলির জন্য নির্দিষ্ট নিয়ন্ত্রণ এবং কোডের মতো উপস্থাপনা স্তরের উপস্থাপনের উদ্দেশ্যে বিশুদ্ধভাবে কিছু রাখুন। ব্যবসায়ের স্তরটিতে কেবলমাত্র আপনার সত্তা রাখুন এবং সমস্ত বৈশিষ্ট্য (যেমন অ্যাড, সম্পাদনা, মোছা) ইত্যাদি etc তবে তাদের উপস্থাপনা স্তরে পরিচালনা করতে ব্রাউজারে রেন্ডারিং। । নেট জন্য, স্তরগুলি পৃথক রাখার ক্ষেত্রে এএসপি.নেট এমভিসি প্যাটার্নটি খুব ভাল। এমভিসি প্যাটার্নটি দেখুন।


সার্লেলে যা করা উচিত তাতে আপনি কিছুটা স্পষ্ট করে বলতে পারেন?
মাওয়িয়া

আপনি যদি এমভিসি ব্যবহার করেন তবে সার্ভলেটটি নিয়ামক হওয়া উচিত।
কাঙকান

3

আমি স্ট্রুট ব্যবহার করেছি ফ্রেমওয়ার্ক এবং এটি শিখতে মোটামুটি সহজ । ট্রট ফ্রেমওয়ার্ক ব্যবহার করার সময় আপনার সাইটের প্রতিটি পৃষ্ঠায় নিম্নলিখিত আইটেম থাকবে।

1) ব্যবহৃত এমন একটি ক্রিয়া যাচাই করা হয় যখনই এইচটিএমএল পৃষ্ঠাটি রিফ্রেশ হয়। পৃষ্ঠাটি প্রথমে লোড হওয়ার পরে এবং ওয়েব ইউআই এবং ব্যবসায়ের স্তরের মধ্যে মিথস্ক্রিয়া পরিচালনা করার সময় অ্যাকশনের ফর্মটিতে ডেটা পপুলেট করা উচিত। আপনি যদি কোনও জেএসপি পৃষ্ঠাটি কোনও পরিবর্তনীয় জাভা অবজেক্টটি সংশোধন করতে ব্যবহার করছেন তবে জাভা অবজেক্টের একটি অনুলিপি মূলের চেয়ে ফর্মে সংরক্ষণ করা উচিত যাতে ব্যবহারকারী পৃষ্ঠাটি সংরক্ষণ না করে মূল ডেটা পরিবর্তন করতে না পারে।

2) ফর্ম যা ক্রিয়া এবং jsp পৃষ্ঠার মধ্যে ডেটা স্থানান্তর করতে ব্যবহৃত হয়। এই অবজেক্টটিতে জেএসপি ফাইলটিতে অ্যাক্সেসযোগ্য হওয়া দরকার এমন বৈশিষ্ট্যের জন্য গেটর এবং সেটারগুলির একটি সেট থাকা উচিত। এই ফর্মটি স্থির হওয়ার আগে ডেটা বৈধ করার একটি পদ্ধতিও রয়েছে।

3) একটি জেএসপি পৃষ্ঠা যা পৃষ্ঠার চূড়ান্ত এইচটিএমএল রেন্ডার করতে ব্যবহৃত হয়। Jsp পৃষ্ঠা হ'ল এইচটিএমএল এবং ফর্মের ডেটা অ্যাক্সেস এবং ম্যানিপুলেট করতে ব্যবহৃত বিশেষ স্ট্রট ট্যাগগুলির সংকর। যদিও স্ট্রটস ব্যবহারকারীদের জাভা কোডটি জেএসপি ফাইলগুলিতে সন্নিবেশ করার অনুমতি দেয় তবে এটি করা সম্পর্কে আপনার খুব সতর্ক হওয়া উচিত কারণ এটি আপনার কোডটি পড়তে আরও কঠিন করে তোলে। Jsp ফাইলের ভিতরে জাভা কোডটি ডিবাগ করা কঠিন এবং ইউনিট পরীক্ষা করা যায় না। আপনি যদি নিজেকে একটি জেএসপি ফাইলের ভিতরে জাভা কোডের 4-5 লাইনের বেশি লিখতে দেখেন তবে কোডটি সম্ভবত অ্যাকশনে সরানো উচিত।


দ্রষ্টব্য: স্ট্রুট 2 এ ফর্ম অবজেক্টটি পরিবর্তে একটি মডেল হিসাবে উল্লেখ করা হয়েছে তবে আমি আমার মূল উত্তরে বর্ণিতভাবে একইভাবে কাজ করে।
এসোটেরিকনসেনস

3

বালুসসি চমৎকার উত্তরটি ওয়েব অ্যাপ্লিকেশনগুলির বেশিরভাগ নিদর্শনগুলিকে কভার করে।

কিছু অ্যাপ্লিকেশনটির জন্য চেইন অফ দায়িত্ব-প্যাটার্ন প্রয়োজন হতে পারে

অবজেক্ট-ওরিয়েন্টেড ডিজাইনে, চেইন অফ-দায়িত্ব প্যাটার্ন হ'ল একটি নকশার প্যাটার্ন যা কমান্ড অবজেক্টগুলির উত্স এবং প্রসেসিং অবজেক্টগুলির একটি সিরিজ সমন্বিত। প্রতিটি প্রসেসিং অবজেক্টে যুক্তি রয়েছে যা এটি পরিচালনা করতে পারে এমন কমান্ড অবজেক্টের ধরণের সংজ্ঞা দেয়; বাকিগুলি শৃঙ্খলে পরবর্তী প্রসেসিং অবজেক্টে পাস করা হয়।

এই প্যাটার্নটি ব্যবহার করতে কেস ব্যবহার করুন:

যখন কোনও অনুরোধ (কমান্ড) প্রক্রিয়াকরণের হ্যান্ডলারটি অজানা এবং এই অনুরোধটি একাধিক অবজেক্টে প্রেরণ করা যায়। সাধারণত আপনি আপত্তি উত্তরসূরি সেট । যদি বর্তমান অবজেক্ট অনুরোধটি পরিচালনা করতে না পারে বা অনুরোধটিকে আংশিকভাবে প্রক্রিয়া করতে না পারে এবং অনুরোধটিকে উত্তরসূরি বস্তুতে ফরোয়ার্ড করতে পারে ।

দরকারী এসই প্রশ্ন / নিবন্ধ:

কেন আমি কখনই কোনও সাজসজ্জারের উপর দায়বদ্ধতার চেইন ব্যবহার করব?

শৃঙ্খলাবদ্ধতার জন্য সাধারণ ব্যবহার?

চূড়ান্ত -দায়িত্ব-প্যাটার্ন ওডসাইন থেকে

উত্স নির্ধারণ থেকে শৃঙ্খলা_অনুসরণযোগ্যতা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.