English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

كيفية تنفيذ الطلبات والإجابات في javaweb

 دعونا نبدأ بمراجعة رسم بياني:

 مسار معالجة الطلب من الخادم:

  (1) سيقوم الخادم بإنشاء thread جديد لكل طلب يستلمه.
  (2) سيقوم الخادم بغمس بيانات الطلب من العميل في موضوع request، والذي هو حامل بيانات الطلب!
  (3) سيقوم الخادم أيضًا بإنشاء موضوع response، والذي سيكون مرتبطًا بالاتصال مع العميل، وهو يمكن استخدامه لإرسال الرد إلى العميل.
 

 من خلال الرسم البياني، يمكن ملاحظة أن الأهميتين الأكثر في طلبات وردات JavaWeb هي request وresponse، وهذان المعاملان موجودان في طريقة service() لمتدخل Servlet.

1、مفهوم response:

         موضوع response هو إحدى المعلمات لمتدخل Servlet.service، وهو من نوع javax.servlet.http.HttpServletResponse. في كل مرة يرسل العميل طلبًا، يقوم الخادم بإنشاء موضوع response ويعطيه لمتدخل Servlet.service(). يتم استخدام موضوع response لرد العميل، مما يعني أنه يمكن إكمال عمل الرد للعميل باستخدام موضوع response في طريقة service().

تتكون وظائف موضوع response من الأنواع التالية أربعة:

(1) إعداد معلومات رأس الرد

(2) إرسال رمز الحالة

(3) إعداد نص الرد

(4) التوجيه 

2、نص الرد من response

response هو موضوع الرد، يمكن استخدام مسار الرد من response لتقديم النص الناتج (جسم الرد). يقدم response إثنين من موضوعات مسارات الرد:

PrintWriter out = response.getWriter(): الحصول على تيار النصوص;

ServletOutputStream out = response.getOutputStream(): الحصول على تيار البايتات; 

بالطبع، إذا كان محتوى نص الاستجابة، يمكنك استخدام response.getWriter()، وإذا كان محتوى الاستجابة هو بيانات كيلو بايت، مثل التحميل، يمكنك استخدام response.getOutputStream();

ملاحظةفي طلب واحد، لا يمكن استخدام هذين التيارين في نفس الوقت! أي أنك يجب أن تستخدم إما response.getWriter() أو response.getOutputStream()، لا يمكن استخدام كلاهما في نفس الوقت. وإلا سيتم إطلاق استثناء IllegalStateException.

3. إعداد معلومات الرؤوس الاستجابة

يمكن استخدام طريقة setHeader() من كائن response لضبط رؤوس الاستجابة! سيتم إرسال الرؤوس التي يتم ضبطها باستخدام هذه الطريقة إلى متصفح العملاء!

response.setHeader(“content-type”, “text/html;charset=utf-8”): إعداد رأس content-type، والذي يخبر المتصفح أن محتوى الاستجابة من نوع html، ويتم إعداد تشفير تيار الاستجابة كـ utf-8. كما سيتم إعداد تشفير تيار الاستجابة كـ utf-8 أيضًا، أي response.setCharaceterEncoding(“utf-8”);

response.setHeader("Refresh","5; URL=http://www.baidu.com"): الانتقال تلقائيًا إلى صفحة بaidu.com بعد 5 ثوانٍ.

4. إعداد رمز الحالة وأساليب أخرى

response.setContentType("text/html;charset=utf-8"): يساوي إلى إجراء response.setHeader(“content-type”, “text/html;charset=utf-8”);

response.setCharacterEncoding("utf-8"): إعداد تشفير تيار الاستجابة كـ utf-8;

response.setStatus(200): إعداد رمز الحالة;

عند إرسال رمز حالة الخطأ، ينتقل Tomcat إلى صفحة خطأ ثابتة، ولكن يمكن عرض رسالة الخطأ.

5、إعادة التوجيه (*****مهم*****)}

5.1 ما هو إعادة التوجيه (مرتان طلب؟)

عند زيارة http://www.sun.com، ستجد أن عنوان URL في شريط عنوان المتصفح يصبح http://www.oracle.com/us/sun/index.htm، هذا هو إعادة التوجيه. إعادة التوجيه هي إعلام الخادم للمتصفح بزيارة عنوان آخر، أي إرسال طلب آخر.

 5.2 كيفية إكمال إعادة التوجيه؟

الإجابة: رمز حالة إعادة توجيه هو 302، نستخدم أولاً عميل الرد لإنشاء رمز حالة 302 لجهاز التصفح، ثم نُحدد Location، أي نعطي عنوان URL قابلاً للوصول، يذهب إليه المتصفح لزيارة العنوان الجديد، مما يؤدي إلى إعادة توجيه.

مثال:

public class AServlet extends HttpServlet { 
  public void doGet(HttpServletRequest request, HttpServletResponse response) 
      يُلقي ServletException, IOException { 
    response.setStatus(302);  
    response.setHeader("Location", "http://www.baidu.com");  
  } 
} 

يهدف هذا الكود إلى: عند زيارة AServlet، يُخبر المتصفح عن إعادة توجيه إلى صفحة بaidu الرئيسية. بعد أن يفسر المتصفح رد الكود إلى رمز 302، يعلم أن الخادم يريد إعادة توجيه، لذا يُطلب من المتصفح الحصول على رأس الرد Location ويُرسل طلبًا ثانيًا.

هناك أيضًا طريقة سريعة لإعادة توجيهحتى باستخدام طريقة response.sendRedirect(). على سبيل المثال، يمكن استبدال الجملتين في المثال السابق بـ response.sendRedirect("http://www.baidu.com").

request—قام بتعليق جميع بيانات الطلبات للعميل 

1、م��لة request

طلب هو معامل من طريقة Servlet.service()، من نوع javax.servlet.http.HttpServletRequest. في كل مرة يرسل العميل طلبًا، يخلق الخادم دائمًا عميلًا request ويقوم بتعليق بيانات الطلب في request، ثم يرسلها إلى طريقة service() عند استدعاء Servlet.service()، مما يعني أن يمكنك الحصول على بيانات الطلب من خلال عميل request في طريقة service().

كما يظهر في الشكل التالي:


request的功能可以分为以下几种:

(1)封装了请求头数据;

(2)封装了请求正文数据,如果是GET请求,则没有正文;

(3)request是一个域对象,可以将其视为Map来添加和获取数据;

(4)request提供了请求转发和请求包含功能。

2、request域方法

request是域对象!在JavaWeb中总共有四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request是其中之一,request可以在请求中共享数据。

一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。现在我们还不知道如何在请求中经历多少个Servlet。

以下是request的域方法:

(1)void setAttribute(String name, Object value):用于存储一个对象,也可以称为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用此方法,并且使用相同的name,则将覆盖上一次的值,此特性与Map相同;

(2)Object getAttribute(String name):用于获取request中的数据,在获取之前需要先进行存储,例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;

(3)void removeAttribute(String name):用于从request中移除域属性,如果指定的域属性name不存在,则此方法不执行任何操作;

(4)getAttributeNames():获取所有域属性的名称;

3、request传递参数

最为常见的客户端传递参数方式有两种:

(1)浏览器地址栏直接输入:一定是GET请求;

(2)超链接:一定是GET请求;

(3)表单:可以是GET,也可以是POST,这取决与

的method属性值;

GET请求和POST请求的区别:

(1)GET请求:

请求参数会在浏览器的地址栏中显示,所以不安全;

请求参数长度限制长度在1K之内;

GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

(2)POST请求:

请求参数不会显示浏览器的地址栏,相对安全;

请求参数长度没有限制;

4、请求转发和请求包含(*****重点*****)

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径

请求转发:rd.forward(request,response);
请求包含:rd.include(request,response);

有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
    > 一个请求跨多个Servlet,需要使用转发和包含。
 > 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)            即当前Servlet设置的相应头有效,相应体无效。
    > 请求包含:由两个Servlet共同未完成响应体!(都留)                                                                     都有效。     
    أياً كان التحويل الطلب أو الدمج الطلب، فإنهما يقعان في نطاق طلب واحد! يستخدم نفس request وresponse!  

مقارنة التحويل الطلب والدمج الطلب:

(1) إذا تم تحويل الطلب من AServlet إلى BServlet، فإنه لا يمكن للـ AServlet إنتاج جسم الرد مرة أخرى، أي لا يمكن استخدامه response.getWriter() و response.getOutputStream() للإرسال إلى العميل، هذا العمل يجب أن يتم من قبل BServlet؛ إذا تم استخدامه لدمج الطلبات، فإن هناك هذه القيود.

(2) على الرغم من أن التحويل لا يمكنه إنتاج جسم الرد، يمكنه أيضًا تعيين رؤوس الرد، مثل: response.setContentType(”text/html;charset=utf-8”);

(3) الطلب غالبًا ما يتم في صفحة JSP، لإنهاء دمج الصفحات المتعددة؛

(4) التحويل غالبًا ما يتم في Servlet، وغالبًا ما يكون الهدف التحويل هو صفحة JSP؛

كما يظهر في الشكل التالي:


مقارنة التحويل والتحويل

(1) التحويل هو طلب واحد، بينما التحويل هو طلبان؛

(2) بعد التحويل، لن يغير عنوان العنوان في شريط العناوين في المتصفح، ولكن بعد التحويل سيكون هناك تغيير، لأن التحويل هو طلبان؛

(3) الهدف من التحويل يجب أن يكون مادة في هذا التطبيق، بينما يمكن أن يكون الهدف من التحويل في تطبيق آخر؛

(4) طريقة الطلب في التحويل للـ AServlet و BServlet يجب أن تكون متطابقة، أي أن تكون إما GET أو POST، لأن التحويل هو طلب واحد؛

(5) الطلب الثاني في التحويل يجب أن يكون GET؛

 هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أيضًا أن تدعموا وتصفقوا لتدريب呐喊.

بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر مملوكة للمالك الأصلي، المحتوى تم تقديمه من قبل مستخدمي الإنترنت بشكل تلقائي، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا اكتشفت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لتقديم الشكوى، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

سيذهب لك