ایجاد یک MVC Application در Java Enterprise
در سری مقالات آموزش Java Enterprise, میخواهیم یک MVC Application با استفاده از مفاهیمی که تا به حال پیرامون آن صحبت کردهایم, ایجاد کنیم.
درابتدا نیاز است تا با مفهوم MVC آشنا شویم. برای درک بهتر MVC میتوانید به اینجا مراجعه کنید. وقتی یک request به web application ارسال میشود, در ابتدا controller این request را دریافت میکند. controller میداند که یک request را به کجا باید ارسال کند, با آن چه کند و چه زمانی response آن request را ارسال کند. سپس request را به Business Service میدهد. در واقع Controller میداند که یک object دیگر وجود دارد که با استفاده از متد ها و دستوراتی که در آن وجود دارد میتواند از این request استفاده کند. سپس مقدار پردازش شده به controller بازگردانده میشود. در نهایت controller نتیجه را به view ارسال میکند و اکنون داده ها آماده نمایش داده شدن به کاربر درخواست دهنده است. در اینجا Business Service در نقش model است.
وقتی میخواهیم از MVC در Java Enterprise استفاده کنیم, Servlet به عنوان Controller ایفای نقش میکند. سپس درخواست ها به Bean ها ارسال میشود. برای درک بهتر پیرامون Bean ها میتوانید به اینجا مراجعه کنید. سپس Response از Bean ها به Servlet ارسال میگردد. در نهایت Response از Servlet به JSP ارسال و قابل نمایش به کاربر درخواست دهنده می شود.
در این مقاله قصد داریم تا یک MVC Application ایجاد کنیم و توسط آن یک کاربر را به طور کامل احراز هویت کنیم.. در ابتدا باید Controller را مشخص کنیم. میدانیم Controller همان Servlet های ما هستند. در اینجا نیاز داریم تا وقتی که کاربر در صفحه ورود مشخصات خود را وارد کرده است, توسط Servlet دریافت شود. سپس احراز هویت را به Business Service واگذار میکند. نتیجه احراز هویت میتواند از نوع داده ای boolean باشد و یا شامل اطلاعات کاربر باشد. اگر بخواهیم اطلاعاتی را به عنوان نتیجه احراز هویت دریافت کنیم نیاز است تا یک model برای نگهداری این اطلاعات پیاده سازی کنیم. نتیجه احراز هویت به Servlet ارسال میشود و سپس در Servlet مشخص میشود که کاربر به کدام صفحه باید هدایت شود (صفحه کاربران یا ماندن در فرم ورود).
در ابتدا به یک فرم ورود نیاز داریم. ما در اینجا از فرمی که در مقاله قبل ایجاد کرده ایم استفاده میکنیم و Form Action آن را ZeroToHeroLoginServlet قرار میدهیم. این Servlet به عنوان Controller است.
@WebServlet(name = "ZeroToHeroLoginServlet",description = "Login Controller",urlPatterns = {"/loginController"}) public class ZeroToHeroLoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("login.jsp").forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usr = req.getParameter("username"); String pswd = req.getParameter("password"); } }
در اینجا تنها پارامتر های ارسالی از JSP را دریافت کرده ایم. اکنون نیاز است تا Business Service را ایجاد کنیم تا صحت اطلاعات وارد شده را مشخص کند.
String usr = req.getParameter("username"); String pswd = req.getParameter("password"); ZeroToHeroLoginService loginService=new ZeroToHeroLoginService(); if (loginService.auth(usr, pswd)) { req.getSession().setAttribute("username", usr); req.getRequestDispatcher("users.jsp").forward(req, resp); } else { req.setAttribute("failed", true); req.getRequestDispatcher("login.jsp").forward(req, resp); }
و باید آنرا به Controller اضافه کرد:
String usr = req.getParameter("username"); String pswd = req.getParameter("password"); ZeroToHeroLoginService loginService=new ZeroToHeroLoginService(); if (loginService.auth(usr, pswd)) { req.getSession().setAttribute("username", usr); req.getRequestDispatcher("users.jsp").forward(req, resp); } else { req.setAttribute("failed", true); req.getRequestDispatcher("login.jsp").forward(req, resp); }
در اینجا اگر کاربر اطلاعات هویتی خود را به درستی وارد کرده باشد, به صفحه کاربری خود هدایت میشود و در غیر این صورت در فرم ورود میماند. اگر کاربر اطلاعاتش را به درستی وارد کرده باشد, مقادیر را در Session قرار میدهیم تا نیاز نباشد مجددا به فرم ورود هدایت شود.
اکنون فایل users.jsp را ایجاد میکنیم:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title><%= session.getAttribute("username") %> Panel </title> </head> <body> <h1> Dear <%=session.getAttribute("username")%></h1> <h2>Welcome to your Panel</h2> </body> </html>
همچنین میتوان فرم ورود را طوری اصلاح کرد تا اگر کاربر اطلاعات را به اشتباه وارد کرد, پیغام خطا برای وی نمایش داده شود:
<body> ...... <% if (request.getAttribute("failed") != null) { %> <br> <h3>Login Failed</h3> <%} %> .... </body>
در Controller مشخص کرده ایم که اگر احراز هویت به درستی انجام نشد, یک attribute به نام faild ایجاد کند و مقدار آن را true قرار دهد. این attribute در object مربوط به request در Servlet ایجاد شده است. وقتی با استفاده از getRequestDispatcher اقدام به هدایت کاربر به صفحه دیگر میکنیم, متد forward دو object فعلی (request و response) در Servlet را به صفحه جدید ارسال میکند. بنابراین attribute قرار داده شده در request در صفحه جدید قابل استفاده است.
req.setAttribute("failed", true); req.getRequestDispatcher("login.jsp").forward(req, resp);
اکنون بهتر است تا با استفده از filter ها فعالیت کاربر را تحت کنترل داشته باشیم.
@WebFilter("/*") public class LoginFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse resp = (HttpServletResponse) servletResponse; HttpServletRequest req = (HttpServletRequest) servletRequest; HttpSession session = req.getSession(false); String loginURI = req.getContextPath() + "/loginController"; boolean loggedin = session != null && session.getAttribute("username") != null; boolean loginRequest = req.getRequestURI().equals(loginURI); if (loggedin||loginRequest) { filterChain.doFilter(req, resp); } else { resp.sendRedirect(loginURI); } } public void destroy() { } }
در این فیلتر مشخص میکند که اگر اطلاعات کاربر در session وجود ندارد, کاربر به فرم ورود هدایت شود. بنابراین اگر کاربر هر صفحه ای را بخواهد باز کند (با استفاده از url), اگر احراز هویت نشده باشد, به فرم ورود هدایت میشود.
اکنون ممکن است بخواهیم نتیجه احراز هویت چیزی بیش از یک boolean باشد. به این ترتیب نیاز است تا یک model برای نگهداری اطلاعات کاربر ایجاد کنیم.
public class UserModel { private String username; private String fullName; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } }
در این Bean اطلاعات کاربر نگهداری میشود. سپس میتوان Business Service را طوری تغییر داد تا بجای boolean یک object از model را برگرداند.
public UserModel auth(String usr, String paswd) { if (usr == null || usr.trim().equals("")) { return null; } if (paswd == null || paswd.trim().equals("")) { return null; } UserModel userModel=new UserModel(); userModel.setUsername("Vhdrjb"); userModel.setFullName("Vahid Rajabi"); return userModel; }
و در Controller نیز نیاز است تا چنین تغییری بوجود آید:
ZeroToHeroLoginService loginService=new ZeroToHeroLoginService(); UserModel userModel = loginService.auth(usr, pswd); if (userModel!=null) { req.getSession().setAttribute("username", usr); req.setAttribute("user", userModel); req.getRequestDispatcher("users.jsp").forward(req, resp); } else {
و در نهایت صفحه users.jsp به این صورت تغییر میکند:
<body> <% UserModel userModel = (UserModel) request.getAttribute("user"); %> <h1> Dear <%=userModel.getFullName() %></h1> <h2>Welcome to your Panel</h2> </body>
در این مقاله سعی بر این شد تا با مفاهیمی که از قبل گفته شد, یک MVC Application ایجاد کنیم و تمام مفاهیم را به طور یکجا در یک پروژه کامل و قابل اجرا بررسی و مرور کنیم. در مقاله بعدی JSTL در JSP را مورد بررسی قرارمیدهیم.
سری مقالات آموزش Java Enterprise همچنان ادامه دارد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
از Java به Dart – کلاس و Constructor
آموزش Gradle – اهمیت Project Automation
تفاوت Sequence و List در کاتلین
بهترین محیط های توسعه(IDE) برای جاوا
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
ممنون از مقاله جامع و مدونتون
پاسخ خیلی از سوالاتم رو گرفتم
سلام دوست عزیز ، ممنون از همراهی شما