เมื่อเว็บเซิร์ฟเวอร์ได้รับคำขอ http ของลูกค้า เว็บเซิร์ฟเวอร์จะสร้างวัตถุคำขอที่แสดงถึงคำขอและวัตถุการตอบสนองที่แสดงถึงการตอบสนองสำหรับแต่ละคำขอ เนื่องจากออบเจ็กต์คำขอและการตอบสนองเป็นตัวแทนของคำขอและการตอบกลับ หากเราต้องการได้รับข้อมูลที่ลูกค้าส่งมา เราจึงต้องค้นหาออบเจ็กต์คำขอเท่านั้น หากต้องการส่งข้อมูลออกไปยังไคลเอนต์ เพียงแค่มองหาออบเจ็กต์ตอบสนอง
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.yyz.response;
นำเข้า java.io.IOException;
นำเข้า java.io.OutputStream;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า 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(ร้องขอ, ตอบกลับ);
-
-
ผลการทดสอบเมื่อตั้งค่าการเข้ารหัสเบราว์เซอร์เป็น GB2312:
ผลการทดสอบเมื่อตั้งค่าการเข้ารหัสเบราว์เซอร์เป็น UTF-8:
เพื่อให้เว็บไซต์ของเราสามารถเข้าถึงได้โดยผู้ใช้ชาวต่างชาติ เมื่อเราแปลงข้อมูลอักขระเป็นข้อมูลไบต์ เราต้องระบุตารางรหัสการแปลงเป็น UTF-8 แต่ในเวลานี้หากเปิดเบราว์เซอร์ด้วย GB2312 ตัวอักษรที่อ่านไม่ออกจะปรากฏขึ้นอีกครั้ง แม้ว่าปัญหาโค้ดที่อ่านไม่ออกนี้สามารถแก้ไขได้ด้วยการเปลี่ยนการตั้งค่าเบราว์เซอร์ แต่ก็ไม่เอื้อต่อการเพิ่มประสิทธิภาพประสบการณ์ผู้ใช้ ดังนั้นเราจึงจำเป็นต้องใช้โปรแกรมเพื่อบอกเบราว์เซอร์ว่าควรปรึกษาตารางโค้ดใดเพื่อแสดงข้อมูล
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.yyz.response;
นำเข้า java.io.IOException;
นำเข้า java.io.OutputStream;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
//มีปัญหากับการแสดงผลภาษาจีน
ResponseDemo คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
//ที่ฝั่งเซิร์ฟเวอร์ ซึ่งข้อมูลจะถูกส่งออกจากตารางโค้ดใด จำเป็นต้องควบคุมว่าเบราว์เซอร์จะเปิดตารางโค้ดใด
ข้อมูลสตริง = "จีน";
response.setHeader("ประเภทเนื้อหา", "ข้อความ/html;charset=UTF-8");
OutputStream out = response.getOutputStream();
out.write(data.getBytes("UTF-8"));
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet(ร้องขอ, ตอบกลับ);
-
-
เรียนรู้อีกหนึ่งเคล็ดลับ:
ใช้แท็ก <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;
นำเข้า java.io.IOException;
นำเข้า java.io.PrintWriter;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
//มีปัญหากับการแสดงผลภาษาจีน
ResponseDemo คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
//ที่ฝั่งเซิร์ฟเวอร์ ซึ่งข้อมูลจะถูกส่งออกจากตารางโค้ดใด จำเป็นต้องควบคุมว่าเบราว์เซอร์จะเปิดตารางโค้ดใด
ข้อมูลสตริง = "จีน";
response.setHeader("ประเภทเนื้อหา", "ข้อความ/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter ออก = response.getWriter();
ออกเขียน(ข้อมูล);
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet(ร้องขอ, ตอบกลับ);
-
-
มีรายละเอียดเล็กๆ น้อยๆ บางประการที่ควรทราบที่นี่:
1. response.setCharacterEncoding("UTF-8"); จะต้องเขียนไว้ข้างหน้า PrintWriter out = response.getWriter(); ไม่มีประโยชน์ที่จะตั้งค่าการเข้ารหัสหลังจากได้รับสตรีมอักขระ
2. response.setHeader("content-type", "text/html;charset=UTF-8"); มีวิธีที่ง่ายกว่าในการเขียน response.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. จากการอ่านข้างต้น ผู้อ่านควรจะเข้าใจได้ว่าเหตุใดผลลัพธ์ของ response.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");