كائنات JSP الضمنية

⚡ ملخص ذكي

كائنات JSP الضمنية هي متغيرات محددة مسبقًا يقوم حاوية servlet بإنشائها تلقائيًا أثناء ترجمة الصفحة، مما يسمح للمطورين بالوصول إلى تدفقات الإخراج والطلبات والاستجابات والجلسات وبيانات التطبيق مباشرة داخل الصفحة دون إعلان يدوي أو تكوين إضافي.

  • 🖨️ الكائن الناتج: يكتب البيانات إلى المخزن المؤقت ويرسل المخرجات إلى العميل عبر صفحة JSPWriter تيار.
  • 📥 كائن الطلب: مثال على HttpServletRequest يقوم باسترداد المعلمات والعناوين وتفاصيل الخادم باستخدام getParameter().
  • 📤 كائن الاستجابة: يقوم بتنفيذ HttpServletResponse لتعيين نوع المحتوى وإضافة ملفات تعريف الارتباط وإعادة توجيه العميل.
  • ⚙️ التكوين والتطبيق: يقرأ ملف التكوين معلمات التهيئة من ملف web.xml؛ ويشارك التطبيق بيانات السياق عبر عملية النشر بأكملها.
  • 🗂️ الجلسة وسياق الصفحة: تحتفظ الجلسة بسمات المستخدم عبر الصفحات؛ يدير سياق الصفحة السمات عبر نطاقات الصفحة والطلب والجلسة والتطبيق.
  • ⚠️ كائن الاستثناء: يوجد استثناء قابل للرمي متاح فقط في صفحات الخطأ، ويقوم بالإبلاغ عن أخطاء وقت التشغيل مثل ArrayIndexOutOfBounds.

ما هو كائن JSP الضمني؟

  • يتم إنشاء كائنات JSP الضمنية أثناء مرحلة ترجمة JSP إلى servlet.
  • يمكن استخدام هذه الكائنات مباشرة في البرامج النصية التي تدخل في طريقة الخدمة.
  • يتم إنشاؤها بواسطة الحاوية تلقائيًا، ويمكن الوصول إليها باستخدام الكائنات.

كم عدد الكائنات الضمنية المتوفرة في JSP؟

هناك 9 أنواع من الكائنات الضمنية المتوفرة في الحاوية:

  1. خارج
  2. أطلب
  3. استجابة
  4. التكوين
  5. تطبيق
  6. جلسة
  7. سياق الصفحة
  8. صفحة
  9. استثناء

دعونا ندرس واحدًا تلو الآخر

1) خارج

  • Out هو أحد الكائنات الضمنية لكتابة البيانات إلى المخزن المؤقت وإرسال الإخراج إلى العميل استجابةً لذلك
  • يتيح لنا الكائن Out الوصول إلى دفق إخراج servlet
  • الناتج هو كائن من javax.servlet.jsp.jspWriter فئة
  • أثناء العمل مع بريمج، نحن بحاجة إلى كائن الطابعة

على سبيل المثال:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP1</title>
</head>
<body>
<% int num1=10;int num2=20;
out.println("num1 is " +num1);
out.println("num2 is "+num2);
%>
</body>
</html>

شرح الكود:

Code الخط 11-12- يستخدم للطباعة في دفق الإخراج

عندما ننفذ الكود أعلاه، نحصل على الإخراج التالي:

خارج في JSP

الإخراج:

  • في الإخراج، نحصل على قيم num1 و num2

2) الطلب

  • كائن الطلب هو مثيل لـ java.servlet.http.HttpServletRequest وهو أحد وسيطات طريقة الخدمة
  • سيتم إنشاؤه بواسطة الحاوية لكل طلب.
  • سيتم استخدامه لطلب المعلومات مثل المعلمة ومعلومات الرأس واسم الخادم وما إلى ذلك.
  • ويستخدم getParameter() للوصول إلى معلمة الطلب.

على سبيل المثال:

Implicit_jsp2.jsp (النموذج الذي يتم إرسال الطلب منه إلى guru.jsp)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru form JSP2</title>
</head>
<body>
<form action="guru.jsp">
<input type="text" name="username">
<input type="submit" value="submit">
</form>
</body>
</html>

Guruملف .jsp (حيث يتم تنفيذ الإجراء)

طلب في JSP

شرح الكود:

Code الأسطر 10-13: في implicit_jsp2.jsp(form) يتم إرسال الطلب، وبالتالي تتم معالجة اسم المستخدم المتغير وإرساله إلى guru.jsp وهو إجراء من JSP.

Guru.jsp

Code السطر 10-11: إنه الإجراء jsp حيث تتم معالجة الطلب، ويتم أخذ اسم المستخدم من النموذج jsp.

عند تنفيذ الكود أعلاه، ستحصل على الناتج التالي

الإخراج:

طلب في JSP

عندما تكتب اختبارًا وتنقر على زر الإرسال، ستحصل على الناتج التالي "مرحبًا بالاختبار".

طلب في JSP

3) الاستجابة

  • "الاستجابة" هي مثيل للفئة التي تطبق واجهة HttpServletResponse
  • تقوم الحاوية بإنشاء هذا الكائن وتمريره إلى طريقة _jspservice() كمعلمة
  • سيتم إنشاء "كائن الاستجابة" بواسطة الحاوية لكل طلب.
  • إنه يمثل الرد الذي يمكن تقديمه للعميل
  • يتم استخدام كائن الاستجابة الضمني لنوع المحتوى وإضافة ملف تعريف الارتباط وإعادة التوجيه إلى صفحة الاستجابة

على سبيل المثال:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP4</title>
</head>
<body>
<%response.setContentType("text/html"); %>
</body>
</html>

شرح الكود:

Code خط 11: في كائن الاستجابة يمكننا تعيين نوع المحتوى

نحن هنا نقوم بتعيين نوع المحتوى فقط في كائن الاستجابة. وبالتالي، لا يوجد مخرج لهذا.

4) التكوين

  • "التكوين" من النوع java.servlet.servletConfig
  • يتم إنشاؤه بواسطة الحاوية لكل صفحة jsp
  • يتم استخدامه للحصول على معلمة التهيئة في web.xml

على سبيل المثال:

ملف Web.xml (يحدد الاسم والخريطة)ping (من السيرفلت)

التكوين في JSP

Implicit_jsp5.jsp (الحصول على قيمة اسم servlet)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP5</title>
</head>
<body>
<% String servletName = config.getServletName();
out.println("Servlet Name is " +servletName);%>
</body>
</html>

شرح الكود:

في web.xml

Code السطر 14-17: لدينا خريطة في ملف web.xmlping من servlets إلى الفئات.

Implicit_jsp5.jsp

Code السطر 10-11: للحصول على اسم servlet في JSP، يمكننا استخدام config.getServletName، والذي سيساعدنا في الحصول على اسم servlet.

عند تنفيذ الكود أعلاه، ستحصل على الناتج التالي:

الاستجابة في JSP

الإخراج:

  • اسم السيرفلت هو "Guru"Servlet" كما هو موضح في ملف web.xml

5) التطبيق

  • كائن التطبيق (سطر الكود 10) هو مثيل لـ javax.servlet.ServletContext ويتم استخدامه للحصول على معلومات السياق والسمات في JSP.
  • يتم إنشاء كائن التطبيق بواسطة الحاوية رقم واحد لكل تطبيق، عند نشر التطبيق.
  • يحتوي كائن Servletcontext على مجموعة من الأساليب التي تستخدم للتفاعل مع حاوية servlet. يمكننا العثور على معلومات حول حاوية servlet

على سبيل المثال:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Implicit JSP6</title>
</head>
<body>
<% application.getContextPath(); %>
</body>
</html>

شرح الكود:

  • في الكود أعلاه، تساعد سمة التطبيق في الحصول على مسار السياق لصفحة JSP.

6) الجلسة

  • تحتوي الجلسة على كائن "httpsession" (سطر الكود 10).
  • يتم استخدام كائن الجلسة للحصول على السمات وضبطها وإزالتها في نطاق الجلسة ويستخدم أيضًا للحصول على معلومات الجلسة

على سبيل المثال:

Implicit_jsp7(تم تعيين السمة)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit JSP</title>
</head>
<body>
<% session.setAttribute("user","GuruJSP"); %>
<a href="implicit_jsp8.jsp">Click here to get user name</a>
</body>
</html>

Implicit_jsp8.jsp (getAttribute)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>implicit Guru JSP8</title>
</head>
<body>
<% String name = (String)session.getAttribute("user");
out.println("User Name is " +name);
%>
</body>
</html>

شرح الكود:

Implicit_jsp7.jsp

Code خط 11: نحن نقوم بتعيين مستخدم السمة في متغير الجلسة، ويمكن جلب هذه القيمة من الجلسة في أي مكان يتم استدعاء jsp منه (_jsp8.jsp).

Code خط 12: نحن نستدعي jsp آخر على href حيث سنحصل على قيمة سمة المستخدم التي تم تعيينها.

Implicit_jsp8.jsp

Code خط 11: نحن نحصل على قيمة سمة المستخدم من كائن الجلسة ونعرض تلك القيمة

عند تنفيذ الكود أعلاه، ستحصل على الناتج التالي:

جلسة في JSP

عند النقر على الرابط الخاص باسم المستخدم، ستحصل على النتيجة التالية.

جلسة في JSP

الإخراج:

  • عندما نضغط على الرابط الموجود في implicit_jsp7.jsp، تتم إعادة توجيهنا إلى صفحة jsp الثانية، أي صفحة (_jsp8.jsp) ونحصل على القيمة من كائن الجلسة لسمة المستخدم (_jsp7.jsp).

7) سياق الصفحة

  • هذا الكائن من نوع pagecontext.
  • يتم استخدامه للحصول على السمات وتعيينها وإزالتها من نطاق معين

النطاقات هي من 4 أنواع:

  • صفحة
  • أطلب
  • جلسة
  • تطبيق

على سبيل المثال:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP9</title>
</head>
<body>
<% pageContext.setAttribute("student","gurustudent",pageContext.PAGE_SCOPE);
String name = (String)pageContext.getAttribute("student");
out.println("student name is " +name);
%>
</body>
</html>

شرح الكود:

Code خط 11: نقوم بتعيين السمة باستخدام كائن pageContext، ولها ثلاث معلمات:

  • القفل
  • بعد التخفيض
  • مجال

في الكود أعلاه، المفتاح هو الطالب والقيمة هي "gurustudent" بينما النطاق هو نطاق الصفحة. النطاق هنا هو "صفحة" ويمكن استخدامه باستخدام نطاق الصفحة فقط.

Code خط 12: نحن نحصل على قيمة السمة باستخدام pageContext

عند تنفيذ الكود أعلاه، ستحصل على الناتج التالي:

سياق الصفحة في JSP

الإخراج:

  • سيتم طباعة الإخراج "اسم الطالب هو المعلم".

8) الصفحة

  • يحتوي المتغير الضمني للصفحة على كائن servlet الذي تم تنفيذه حاليًا لـ jsp المقابل.
  • يعمل كهذا الكائن لصفحة jsp الحالية.

على سبيل المثال:

في هذا المثال، نستخدم كائن الصفحة للحصول على اسم الصفحة باستخدام طريقة toString

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP10</title>
</head>
<body>
<% String pageName = page.toString();
out.println("Page Name is " +pageName);%>
</body>
</html>

شرح الكود:

Code السطر 10-11: في هذا المثال، نحاول استخدام الأسلوب toString() لكائن الصفحة ونحاول الحصول على اسم السلسلة لصفحة JSP.

عندما تقوم بتنفيذ الكود ستحصل على الناتج التالي:

الصفحة في JSP

الإخراج:

  • الإخراج هو اسم السلسلة لصفحة jsp أعلاه

9) الاستثناء

  • الاستثناء هو الكائن الضمني للفئة القابلة للرمي.
  • يتم استخدامه ل معالجة الاستثناءات في JSP.
  • لا يمكن استخدام كائن الاستثناء إلا في صفحات الخطأ.على سبيل المثال:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Implicit Guru JSP 11</title>
</head>
<body>
<%int[] num1={1,2,3,4};
out.println(num1[5]);%>
<%= exception %>
</body>
</html>

شرح الكود:

Code الخط 10-12 - تحتوي على مصفوفة من الأرقام، أي num1 بأربعة عناصر. في المخرجات، نحاول طباعة العنصر الخامس من المصفوفة من num1، والذي لم يتم إعلانه في قائمة المصفوفات. لذلك يتم استخدامه للحصول على كائن استثناء من jsp.

الإخراج:

استثناء في JSP

لقد حصلنا على ArrayIndexOfBoundsException في المصفوفة حيث حصلنا على مصفوفة رقم 1 من العنصر الخامس.

الأسئلة الشائعة

لا. يقوم الحاوية بإنشاء جميع الكائنات التسعة الضمنية تلقائيًا أثناء مرحلة الترجمة. يمكن للمطورين استخدامها مباشرةً داخل البرامج النصية وطريقة الخدمة دون استيراد الحزم أو تعريف أي متغيرات.

لا. الكائنات الضمنية متاحة فقط داخل البرامج النصية والتعبيرات التي تُشير إلى طريقة الخدمة. لا يمكن استخدامها داخل علامات تعريف JSP، التي تُنشئ أعضاء على مستوى الفئة خارج تلك الطريقة.

يعمل PageContext عبر جميع النطاقات الأربعة - الصفحة، والطلب، والجلسة، والتطبيق. وهو يوفر طرق setAttribute و getAttribute و removeAttribute، مما يجعله الكائن الضمني الأكثر مرونة لإدارة البيانات عبر مستويات النطاق المختلفة.

بإمكان الذكاء الاصطناعي شرح كل كائن ضمني بأمثلة، وتحويل شيفرة البرامج النصية إلى بدائل أكثر وضوحًا، والإجابة على أسئلة النطاق فورًا. وهذا يساعد المبتدئين على فهم متى يستخدمون كائنات الطلب أو الجلسة أو التطبيق بشكل صحيح.

نعم. تستطيع أدوات الذكاء الاصطناعي إنشاء أجزاء برمجية JSP فعّالة باستخدام كائنات out و request و session وغيرها من الكائنات الضمنية، ثم شرح كل سطر. مع ذلك، ينبغي على المطورين مراجعة المخرجات للتأكد من معالجة النطاق بشكل صحيح وضمان الأمان.

تلخيص هذه التدوينة بـ: