عندما يتلقى خادم الويب طلب http الخاص بالعميل، فإنه سيقوم بإنشاء كائن طلب يمثل الطلب وكائن استجابة يمثل الاستجابة لكل طلب. نظرًا لأن كائنات الطلب والاستجابة تمثل الطلبات والاستجابات، إذا أردنا الحصول على البيانات المقدمة من العميل، فنحن نحتاج فقط إلى العثور على كائن الطلب. لإخراج البيانات إلى العميل، ما عليك سوى البحث عن كائن الاستجابة.
انسخ رمز الكود كما يلي:
الحزمة com.yyz.response؛
import java.io.IOException;
استيراد java.io.OutputStream؛
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// مشكلة في إخراج اللغة الصينية
الطبقة العامة ResponseDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
بيانات السلسلة = "الصين"؛
OutputStream out = Response.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); يتضمن هذا الرمز التحقق من جدول التعليمات البرمجية مرتين.
* عندما تتغير "الصين" من بيانات الأحرف إلى بيانات البايت، سيتم الرجوع إلى جدول الرموز gb2312.
* عندما يتم إرسال البيانات إلى المتصفح للعرض، يجب الرجوع إلى جدول التعليمات البرمجية مرة أخرى، ويرتبط جدول التعليمات البرمجية الذي تمت استشارته في هذا الوقت بإعدادات المتصفح.
*/
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
}
نتائج الاختبار عند ضبط تشفير المتصفح على GB2312:
نتائج الاختبار عند ضبط ترميز المتصفح على UTF-8:
من أجل جعل موقعنا في متناول المستخدمين الأجانب، عندما نقوم بتحويل بيانات الأحرف إلى بيانات بايت، يجب علينا تحديد جدول رمز التحويل كـ UTF-8. ولكن في هذا الوقت، إذا تم فتح المتصفح باستخدام GB2312، فستظهر الأحرف المشوهة مرة أخرى. على الرغم من أنه يمكن حل مشكلة التعليمات البرمجية المشوهة هذه عن طريق تغيير إعدادات المتصفح، إلا أنها لا تساعد على تحسين تجربة المستخدم. لذلك، نحتاج إلى استخدام برنامج لإخبار المتصفح بجدول الأكواد الذي يجب الرجوع إليه لعرض البيانات.
انسخ رمز الكود كما يلي:
الحزمة com.yyz.response؛
import java.io.IOException;
استيراد java.io.OutputStream؛
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// مشكلة في إخراج اللغة الصينية
الطبقة العامة ResponseDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
// من جانب الخادم، أي جدول تعليمات برمجية يتم إخراج البيانات منه، فمن الضروري التحكم في جدول التعليمات البرمجية الذي سيتم فتح المتصفح به.
بيانات السلسلة = "الصين"؛
Response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream out = Response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
}
تعلم خدعة أخرى:
استخدم علامة <meta> بلغة HTML للتحكم في سلوك المتصفح.
<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
يحاكي http-equiv رأس استجابة HTTP ويطلب من المتصفح فتحه في جدول رموز UTF-8. لرؤوس الاستجابة الحقيقية الأسبقية على رؤوس الاستجابة التي تمت محاكاتها باستخدام http-equiv.
في التطوير الفعلي، يجب على الخادم استخدام تدفقات الأحرف لكتابة البيانات النصية إلى المتصفح. ومع ذلك، فإن جدول التعليمات البرمجية الافتراضي لتدفق الأحرف الذي تم الحصول عليه من خلال طريقة الاستجابة getWriter هو ISO8859-1، ولا يوجد ترميز صيني مطابق في جدول التعليمات البرمجية هذا، فهل سيتم تغييره؟ يتم إرسال الترميز المقابل إلى المتصفح، وعند فتح المتصفح، يكون مليئًا بعلامات الاستفهام. يمكن تعديل جدول التعليمات البرمجية الذي يستشيره الخادم عند إرسال البيانات من خلال setCharacterEncoding للاستجابة.
انسخ رمز الكود كما يلي:
الحزمة com.yyz.response؛
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// مشكلة في إخراج اللغة الصينية
الطبقة العامة ResponseDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
// من جانب الخادم، أي جدول تعليمات برمجية يتم إخراج البيانات منه، فمن الضروري التحكم في جدول التعليمات البرمجية الذي سيتم فتح المتصفح به.
بيانات السلسلة = "الصين"؛
Response.setHeader("content-type", "text/html;charset=UTF-8");
Response.setCharacterEncoding("UTF-8");
PrintWriter out = Response.getWriter();
out.write(data);
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
}
هناك بعض التفاصيل الصغيرة التي يجب ملاحظتها هنا:
1.response.setCharacterEncoding("UTF-8"); يجب كتابته أمام PrintWriter out = Response.getWriter();. لا فائدة من ضبط الترميز بعد الحصول على دفق الأحرف.
2.response.setHeader("content-type", "text/html;charset=UTF-8"); هناك طريقة أبسط لكتابة الاستجابة.setContentType("text/html;charset=UTF-8");.
3.response.setContentType("text/html;charset=UTF-8"); يحتوي هذا الرمز في الواقع على وظيفتين: إشعار الاستجابة للإخراج في UTF-8 والمتصفح لفتحه في UTF-8. وهذا يعادل Response.setHeader("content-type", "text/html;charset=UTF-8"); وresponse.setCharacterEncoding("UTF-8");.
4. من خلال القراءة المذكورة أعلاه، يجب أن يكون القراء قادرين على فهم سبب كون مخرجات الاستجابة.getOutputStream.write(1); في المتصفح ليست 1; نظرًا لأن المتصفح عبارة عن محرر نصوص، بعد تلقي البيانات، سيستغرق الأمر 1 للبحث عن جدول التعليمات البرمجية، ثم عرض الأحرف المقابلة. إذا كنت تريد إخراج الأرقام في المتصفح، فيجب عليك تحويل الأرقام إلى سلاسل، Response.getOutputStream.write((1+"").getBytes());.
استخدم OutputStream (دفق البايت) لإرسال البيانات:
1.response.getOutputStream().write("China".getBytes());// إرسال البيانات بالترميز الافتراضي
2.response.getOutputStream().write("China".getBytes("UTF-8"));// أرسل البيانات بتشفير UTF-8، وسيظهر المتصفح (GB2312 الافتراضي) مشوهًا
حل:
2.1 عن طريق تغيير طريقة تشفير المتصفح: IE/"View"/"Encoding"/"UTF-8" (غير مستحسن)
2.2 أبلغ العميل بطريقة التشفير عن طريق تعيين رأس الاستجابة: Response.setHeader("Content-type", "text/html;charset=UTF-8");// أبلغ المتصفح بنوع البيانات والتشفير
2.3 محاكاة رؤوس الطلب من خلال العلامات الوصفية: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 من خلال الطريقة التالية: Response.setContentType("text/html;charset=UTF-8");