কিছুটা শালীন ওয়েব অ্যাপ্লিকেশনটিতে নকশার ধরণগুলির মিশ্রণ রয়েছে। আমি কেবল সবচেয়ে গুরুত্বপূর্ণ বিষয়গুলি উল্লেখ করব।
আপনি যে কোর (আর্কিটেকচারাল) ডিজাইন প্যাটার্নটি ব্যবহার করতে চান তা হ'ল মডেল-ভিউ-কন্ট্রোলার প্যাটার্ন । কন্ট্রোলার একটি সার্ভলেট যা (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
প্রতিনিধিত্ব করে।
এভাবে আপনি কোনও উপাদান ভিত্তিক কাঠামোর দিকে কিছুটা হলেও বিবর্তিত হতে পারেন।
আরো দেখুন: