یک پروژه ساده با JSP – فرم login
در سری مقالات آموزش Java Enterprise, میخواهیم یک پروژه ساده با JSP ایجاد کنیم و ادامه مفاهیم را در قالب پروژه بررسی کنیم.
در مقاله قبل شیوه کد نویسی JSP ها را بررسی کردیم. ابتدا به مفهوم Action میپردازیم. با استفاده از Action ها میتوان رفتار JSP Engine را کنترل کرد. برای مثال میتوان به صورت پویا یک فایل را در پروژه قرار داد و یا کاربر را به صفحه دیگری هدایت کرد. با استفاده از include میتوان یک فایل را درون صفحه قرار داد. برخلاف include در directive ها, فایل در هنگام ارسال request به صفحه افزوده میشود. دو attribute برای include وجود دارد :
- path : آدرس فایل
- flush : مشخص میکند که آیا بافر آن flush شود یا خیر
ابتدا یک فایل برای header ایجاد میکنیم و نام آنرا header.jsp قرار میدهیم :
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> </head> <body> <img src="https://zerotohero.ir/wp-content/uploads/2016/02/thumb.png" height="471" width="900"/> </br> <%=new Date() %> </body> </html>
و آنرا به صفحه اصلی ( index.jsp ) اضافه میکنیم :
<body> <%-- header --%> <jsp:include page="header.jsp" flush="true"/> </body>
در اینجا نیاز است تا یک مفهوم جدید به نام Java Beans را معرفی کنیم. Java Beans ها کلاس هایی هستند که تعداد زیادی object را در خود نگهداری میکنند. Serialize هستند و Constructor آنها پارامتر ورودی ندارد (Zero Argument Constructor) و با استفاده از getter و setter میتوان به properties ها دسترسی پیدا کرد. با استفاده از useBean میتوان به Java Beans ها دستری پیدا کرد. یک Beans ایجاد میکنیم و نام آنرا MyBeans.Java قرار میدهیم :
public class MyBeans { public MyBeans() { } private String username; public String getUsername() { return "you are "+username; } public void setUsername(String username) { this.username = username; } }
برای افزودن beans به صفحه از useBean استفاده میشود و شامل دو attribute مهم است :
- id : در صفحه از طریق id میتوان به beans دسترسی پیدا کرد
- class : آدرس کلاس را مشخص میکند
<jsp:useBean id="mybeans" class="beans.MyBeans" />
برای مقدار دهی به Property های Java Beans از setProperty استفاده میشود. این Action شامل چهار attribute است :
- name : نام bean که از قبل توسط useBean مشخص شده است
- property : نام property که میخواهیم مقدار آنرا مشخص کنیم
- value : مقدار property را مشخص میکند
- param : مقداری که از request دریافت میکند و در property قرار میدهد. توجه داشته باشید که نمیتوان همزمان از value و param استفاده کرد
<jsp:setProperty name="mybeans" property="username" value="vhdrjb"/>
و برای دریافت مقدار این property باید از getProperty استفاده شود. این Action شامل دو Attribute است :
- name : نام bean که از قبل توسط useBean مشخص شده است
- property : نام property که مقدار آن را میخواهیم
<b><jsp:getProperty name="mybeans" property="username"/></b>
اگر بخواهیم کاربر را به یک صفحه دیگر هدایت کنیم, از forward استفاده میشود. این Action یک attribute به نام page دارد و آدرس صفحه را مشخص میکند.
تا به اینجا به مبحث Action ها پرداختیم. Action های دیگری نیز وجود دارد ولی ما سعی کردیم Action هایی که بیشتر مورد استفاده قرار میگیرد را بررسی کنیم. اکنون میخواهیم یک فرم ورود را طراحی کنیم و با استقاده از JSP یک کاربر را احراز هویت کنیم.
یک صفحه ورود طراحی میکنیم:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Zero to Hero Login</title> </head> <body> <form action="${pageContext.request.contextPath}/loginProcess" method="post"> Username <input type="text" name="username"> <br><br> Password <input type="password" name="password"> <br><br> <input type="submit" value="Login"> <br> </form> </body>
یک Servlet با نام loginProcess ایجاد میکنیم وعمل پردازش را در آن قرار میدهیم و بر روی آن Session را تنظیم کرده تا اگر کاربر یک بار احراز هویت شد، در مراحل بعدی دیگر نیاز به انجام مجدد این مرحله نباشد :
@WebServlet(name = "LoginProcess", urlPatterns = {"/loginProcess"}) public class LoginProcess extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getSession().getAttribute("username") != null) { request.getRequestDispatcher("profile.jsp").forward(request, response); } String username = request.getParameter("username"); String passowrd = request.getParameter("password"); Auth auth = new Auth(); if (auth.validate(username, passowrd)) { request.setAttribute("username", username); request.getSession().setAttribute("username", username); request.getRequestDispatcher("profile.jsp").forward(request, response); } else { request.setAttribute("username", username); request.getRequestDispatcher("fail.jsp").forward(request, response); } }
صفحه profile.jsp را به این صورت طراحی میکنیم :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@include file="header.jsp"%> <hr> <html> <head> <title>Title</title> </head> <body> <p> <b> Welcome <%= request.getAttribute("username") %></b> to zero to hero </p> </body> </html>
صفحه header.jsp را به این صورت طراحی میکنیم :
<a href="logout.jsp">LogOut </a>| <a href="https://www.zerotohero.ir">ZeroToHero</a>
صفحه fail,jsp را به این صورت طراحی میکنیم :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang=en> <meta charset=utf-8> <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width"> <title>Error 404 (Not Found)!!1</title> <body> <p>User <%=request.getAttribute("username")%> Not Found </p> </body> </html>
اکنون میخواهیم محدودیتی اعمال کنیم تا IP های مشخصی قابلیت دستری به سامانه را داشته باشند. ابتدا باید یک Filter تعریف کنیم. برای نوشتن این کلاس ها نیاز است تا از کلاس Filter ارث بری کنیم (در حقیقت این عمل یک request را پیش از دسترسی به منابع و یا یک response را پیش از ارسال به client بررسی میکند). یک کلاس با نام IpFilter ایجاد میکنیم:
@WebFilter(filterName = "IPFilter", urlPatterns = {"/index.jsp"}, initParams = @WebInitParam(name = "allow", value = "192.168")) public class IPFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { if (req.getRemoteAddr().startsWith(allowIP)) { chain.doFilter(req, resp); } else { HttpServletResponse response = (HttpServletResponse) resp; req.getRequestDispatcher("embargoed.jsp").forward(req, response); } } private String allowIP; public void init(FilterConfig config) throws ServletException { allowIP = config.getInitParameter("allow"); } }
صفحه embargoed.jsp را به این صورت طراحی میکنیم :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang=en> <meta charset=utf-8> <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width"> <title>Error 404 (Not Found)!!1</title> <body> <p>User <%=request.getRemoteAddr()%> Not Allowed </p> </body> </html>
برای بررسی عملکرد مثال فوق ابتدا با آدرس localhost این برنامه را اجرا کنید. اگر تمام مراحل را درست انجام داده باشید با چنین پیامی مواجه میشوید :
User 127.0.0.1 Not Allowed
اما اگر با یک Ip Private برنامه را اجرا کنید ( برای مثال ۱۹۲.۱۶۸.۱.۷ ), فرم ورود باز میشود.
در این مقاله سعی شد تا مفاهیم باقی مانده از JSP را در قالب یک پروژه ارائه دهیم. مسلما مطالب پیرامون JSP و Servlet ها بسیار فراروان است و با تمرین و نوشتن نمونه پروژه های مختلف, میتوانید بهتر آنرا را بیاموزید. در مقاله بعد با استفاده از مفاهیم این مقاله, یک MVC Application ایجاد میکنیم.
سری مقالات آموزش 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.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام کلاس Auth اصلا وجود نداره!!!!!!!!!!!!!
سلام. ممنون از همراهیتون. همونطور که در کد هم میبینید فقط از object کلاس auth استفاده شده. یعنی شما متناسب با ساختار و Framework های استفاده شده در پروژه باید احراز هویت انجام بدین. در واقع باید این کلاس خودتون پیاده سازی کنین و در اینجا فقط ساختار JSP بحث شده.