English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
دعونا نبدأ بمراجعة رسم بياني:
مسار معالجة الطلب من الخادم:
(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,这取决与