السلام عليكم ورحمة الله وبركاته
JSP هي لغة برمجة لتوليد صفحات الويب ديناميكيا تتميز بقوة ادائها و اتساع مجالات استخدامها لانها تحمل كافة ميزات الجافا مثل خاصية العمل على انظمة تشغيل مختلفة و القدرة على الاتصال بين عدة مخدمات ذات انظمة تشغيل مختلفة للحصول على المعلومات وسوف نوضح قليلا في هذه المقالة كيفية عمل هذه التقنية و لماذا تعاني من البطئ في التشغيل مقارنة بباقي لغات البرمجة المشابهة (PHP - ASP ) . في حقيقة الامر ان JSP ليست سوى واجهة لتسهيل استخدام الـ Servlet بكلام آخر يمكن الاستغناء عن JSP تماما و لكن ذلك سوف يزيد من صعوبة اظهار الرد بصيغة HTML فما الذي يحدث حقيقة عندما نطلب صفحة JSP من مخدم (منصب عليه Tomcat مثلا) يحدث احد الامرين التاليين اذا كانت مشغلة من قبل فسوف يتم تشغيل السيرفلت و يتم عرض الصفحة اما اذا كان هذا اول تشغيل للصفحة فسوف يتم تحويل صفحة الجي اس بي الى ملف جافا مصدري و بعدها يتم ترجمته و انتاج كلاس جديد (سيرفلت جديد ) يتم تشغيله و تعرض الصفحة و هنا يحدث البطئ التي تعاني منه هذه التقنية و كما لاحظتم فهو يحدث عند التشغيل في اول مرة فقط حيث يتم تحويل و ترجمة و من ثم تشغيل و العرض و بعدها اذا طلبت الصفحة مرة اخرى فسيتم التشغيل و ثم العرض فقط و هذه العملية لا تعاني من البطئ ابدا و لذا لا يصح اتهام اللغة بالبطئ بالاداء دوما و طبعا تعاد عملية الترجمة و التحويل في كل مرة تجري فيها تعديلا حتى لو كان بسيطا على صفحة الـ JSP .
و خلاصة الامر ان التقنيتان و جهان لعملة واحدة و لكن عند فهمهما معا سوف تعلم متى تعتمد على JSP او متى تعتمد على Servlet و يمكنني تلخيص هذه المعرفة و بابسط ما يمكن لكي تدرك متى يحين استخدام كل واحدة منهم، حيث سوف تجد سهولة كبيرة تقدمها JSP عندما تحتوي الصفحة على خرج كبير على شكل HTML حيث تستطيع البرمجة و التصميم بواسطة HTML بالشكل المعتاد و تدخل معها كود JSP اما للاضافة او الحذف او التعديل على محتويات و اجزاء صفحة HTML اما عند اعتمادك على Servlet فستجد امكانية و سهولة اكبر للوصول الى الكلاسات و الحزم الاخرى و تبادل المعلومات معها و بمعنى آخر تتيح لك مكان واسع لكتابة الاكواد البرمجية الحقيقية و المعقدة و بالطبع تستطيع الاستفادة من مزايا و التخلص من عيوب التقنيتين عند استخدامها معاً فمثلا تضع الكود البرمجي العام في Beans على حسب الحاجة مثلا ( للتعامل مع قواعد البيانات- لحساب الزمن – لادارة المفات – الخ ) و من ثم تبرمج Servlet تضع فيها الاكواد المتوسطة و التي تهدف الى الجمع و استخلاص المفيد من Beans المختلفة و ترسله الى الاطراف المستفيدة و اذا كان الخرج عبارة عن صفحة HTML معقدة نسبيا فالافضل ان تترك المهمة الى JSP و بحيث تكون قد سهلت الحصول على المعلومات قدر الامكان لتلافي التعقيد في كود الـ JSP .
و المثال التالي يوضح فكرة عمل JSP :
ليكون لدينا الصفحة
ArabTeam2000.jsp
<html>
<head>
<title>Confusing !!! JSP or Servlet??</title>
<% String ramy="Hi Ramy,, I heat you so much...whatever"; %>
</head>
<body>
<%=ramy%>
</body>
</html>
و بما انها جديدة سوف تمر على المراحل التي تم ذكرها سابقاً و سيولد الحاوي ( Tomcat في مثالنا ) كود جافا مصدري داخل مجلد يحوي اسم التطبيق الذي هو بداخل المجلد work و فيما يلي كود السيرفلت المولد نتيجة لصفحة JSP السابقة :
ArabTeam2000$jsp.java
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class ArabTeam2000$jsp extends HttpJspBase {
static {
}
public ArabTeam2000$jsp( ) {
}
private static boolean _jspx_inited = false;
public final void _jspx_init() throws org.apache.jasper.runtime.JspException {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
String _value = null;
try {
if (_jspx_inited == false) {
synchronized (this) {
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,
"", true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
// HTML // begin [file="/ArabTeam2000.jsp";from=(0,0);to=(3,0)]
out.write("<html>\r\n<head>\r\n<title>Confusing !!! JSP or Servlet??</title>\r\n");
// end
// begin [file="/ArabTeam2000.jsp";from=(3,2);to=(3,58)]
String ramy="Hi Ramy,, I heat you so much...whatever";
// end
// HTML // begin [file="/ArabTeam2000.jsp";from=(3,60);to=(7,0)]
out.write("\r\n</head>\r\n\r\n<body>\r\n");
// end
// begin [file="/ArabTeam2000.jsp";from=(7,3);to=(7,7)]
out.print(ramy);
// end
// HTML // begin [file="/ArabTeam2000.jsp";from=(7,9);to=(11,0)]
out.write("\r\n</body>\r\n\r\n</html>\r\n");
// end
} catch (Throwable t) {
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (pageContext != null) pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
}
}
}
و السلام عليكم و رحمة الله....