Spring/Dependency Injection/Inversion of Control(IoC)

2 Aug 2023

How does Spring MVC work

JavaEE Application တွေမှာ Spring သည် defacto standard ပါပဲ။ Spring ရဲ. MVC ဘယ်လိုအလုပ်လုပ်သွားသလဲဆိုတာလေးပါ။
Spring framework က MVC လုပ်သွားတဲ့နောက်က component တွေရဲ. detail အကုန်ကိုပြောတာမဟုတ်ပဲ conceptually how they work ဆိုတာလောက်ကိုပဲရှင်းမှာ။

Spring framework သည် servlet technologies ကိုအခြေခံပါတယ်။ လွယ်လွယ်ပြောရရင် Servlet ဆိုတာ Java program တခုပါပဲ HttpServlet ဆိုတဲ့ class ကို extend လုပ်ထားတဲ့ Java class တခုပါပဲ။ Http get, post စတဲ့ method တွေမှာ ဘာလုပ်ပါဆိုပြီး doGet , doPost စတဲ့ action တွေ service method တွေရေးလို.ရတယ် တခြား language, platform concept ဘက်ကကြည့်ရင် CGI program လေးတွေပေါ့။

Spring ဆီကိုရောက်လာတဲ့ http request တိုင်းက ဘယ်ကိုအရင်ရောက်သလဲဆိုရင် Dispatcher Servlet ဆိုတဲ့ Spring ရဲ. Main servlet ကြီးဆီအရင်ရောက်တယ်။ Dispatcher Servlet က front controller pattern ဆိုတဲ့ architecture design pattern ကိုသုံးထားတယ်၊ အဲ့ဒီ servlet ကြီးကနေမှာ main ဂိတ်ဝကြီးပေါ့ request path တွေ http method တွေ အပေါ်မူတည်ပြီးတော့ ဘယ် controller ဆီသွားရမယ်ဆိုတာကို ဆုံးဖြတ်ပေးတယ်။ ဉပမာ

@Controller
public class HomeController {
@GetMapping(“/hello”)
String hello().
{
return “hello”;
};
အပေါ်က code က Controller ဆိုပါစို. Controller ဆိုတာ url pattern တခုပေါ့ ဒီ case ဆို /hello ဆိုတာပေါ့ သူ.ကို client ကနေ ခေါ်လိုက်ရင် ထ run ဖို.လုပ်ထားတာ အဓိက request က လာတဲ့ကောင်တွေကို parameter တွေယူမယ် business logic လုပ်မယ် နောက်ပြီး view ကိုပြန်ပေးမယ်ပေါ့။

ခုနက /hello ဆိုတာကို client browser ကနေ ခေါ်လိုက်ရင် ပထမဆုံး Spring Dispatcher Servlet ဆီရောက်မယ် အဲ့ကနေ မှ ခုနက /hello ဆိုတာ ဘယ် controller ကိုခေါ်ရမလဲဆိုတာကို ဆုံးဖြတ်ရတယ် ၊ အဲ့လိုဆုံးဖြတ်ဖို. Handler Mapper တွေကိုသုံးရတယ်၊ Handler Mapper တွေဆိုတာ client http request နဲ. controller ကို map လုပ်ပေးတဲ့ကောင်တွေပေါ့။ SimpleUrlHandlerMapping တို.
BeanNameUrlHandlerMapping ဆိုပြီး အမျိုးကွဲတွေရှိသေးတယ်။
အဲ့တော့ ခုနက Mapper တွေက ဘယ်ကောင်က Controller ဆိုပြီး ဘယ်လိုသိလဲဆိုရင် @Controller annotation တွေကနေသိတယ်။ Spring framework စ run တဲ့အချိန်မှာ ခုနက mapping တွေကို တည်ဆောက်ထားရတယ်။ Controller မှန်းသိဖို. classpath ထဲက class တွေကို Java relection API သုံးပြီး Controller annoation ပါရင် Controller မှန်းသိတယ်ပေါ့။ အဲ့ကနေ Relection API သုံးပြီး annotation က url value တွေယူ class က method တွေနဲ.ဆိုင်ရာတွဲပေါ့ အဲ့တာသည် url handler mapper ရဲ.အလုပ်ပေါ့။

ဒါဆိုခုနက request သည် dispatcher ရောက် dispatcher ကနေ URL handler mapper ကို ဘယ် controller ကိုခေါ်ရမလဲ မေးတယ် အဲ့မှာ url handler mapper ကနေ controller class , method ပြန်ပေးတယ် အဲ့တာကို Java Reflection သုံးပြီး invoke လုပ်မယ် controller ထ run တယ်ပေါ့။

ကြားထဲမှာ တခြား interecpetor တွေ parameter java bean တွေ map လုပ်တာတွေ validation စစ်တာတွေ လုပ်ရသေးတယ်။ Interceptor တွေကို chain of responsibility design pattern သုံးထားတဲ့အတွက် တခုပြီး တခု ဆင့်ဆင့်ပြီး ခေါ်သွားလို.ရတယ်၊

ဒါနဲ. Controller run လိုက်တယ်ဆိုပါစို.၊ request ကလာတဲ့ input parameter တွေယူ. နောက် business logic ဘက်က service layer ကိုလှမ်းခေါ် အဲ့တာတွေပြီးသွားရင် view မှာပြမဲ့ data ကို session ထဲမှာ ထဲ့လိုက်တယ်ဆိုပါစို.။ addAttribute method တွေနဲ. ဒါဆို controller ကနေ ဘာ return ပြန်လဲ ကြည့်တယ်။
View ကိုပြန်တယ်ဆိုရင် အဲ့ view က ဘယ်ကိုခေါ်ရမလဲ။ ဘယ်လို render လုပ်မလဲဆိုတာကို စဉ်းစားရတယ် ဆိုပါစို. အပေါ်က controller ဆို “hello” ဆိုတဲ့ view ကို return ပြန်တယ်ဆိုပါစို.၊ အဲ့မှာ Spring မှာ JSTLView ကိုသုံးပြီး setup လုပ်ထားတယ်ဆိုပါစို.။ ဒါဆိုရင် prefix , suffix ပေးရပြီ prefix ဆိုတာ JSP path ပေါ့ များသောအားဖြင့် suffix ကတော့ jsp အတွက်ဆို .jsp ပေါ့၊ ဒါဆိုပေးထားတဲ့ prefix က “/WEB-INF/view/” ဆိုပါစို. ဒါဆိုရင် Spring ရဲ. JSTLViewResolver သည် /WEB-INF/view/hello.jsp ကိုရှာတယ်.

ခုနက controller session ထဲမှာ ရှိတဲ့ model attribute တွေကို JSP က ယူသုံးလို.ရအောင် session ထဲကိုရိုက်တယ်။
ပြီးရင် JSP page ကို render လုပ်တယ်။ တကယ်က JSP page မှာ tag library တွေဘာတွေပါရင် သူတို.ပါ run ရသေးတာပေါ့။ JSP page က တကယ်တမ်းက ဟိုးအောက်ဆင်းသွားရင် Java Servlet ပဲ။ နောက်ဆုံးကြ HTTP Protocol ရဲ. response body text ထဲကို text output တွေရိုက်ထုတ်တာပဲပေါ့

Original link

crd=>(https://m.facebook.com/story.php?story_fbid=pfbid02bUYod2FnUeqN2FSfG9ZbTr2jYg6gCEzAA2usnsmw83XCZpBbQq6gtaJRSsgvgbesl&id=1819241055&mibextid=Nif5oz)

Leave a comment