ทุกคนคงคุ้นเคยกับ servlet แล้ว วันนี้ผมจะมารีวิวให้ฟังนะครับ ถ้ามีอะไรเขียนไม่ดี หรือผิด หวังว่าชาวเน็ตจะวิจารณ์และแก้ไขนะครับ วันนี้เราจะพูดถึงสองวิธีในการรับและโพสต์เท่านั้น มีความแตกต่างมากมายระหว่างพวกเขา ดังนั้นวิธีการเข้ารหัสจะแตกต่างกัน ปัญหาของโพสต์จะแก้ไขได้ง่ายกว่า เข้าใจหลักการจำที่ดีและความแตกต่างระหว่างกัน
ทั้งวิธีการรับและวิธีการโพสต์จะขึ้นอยู่กับโปรโตคอล http โดยมีวัตถุประสงค์เพื่อให้วิธีการเผยแพร่และรับหน้า html
ข้อความคำขอที่สมบูรณ์ประกอบด้วย: บรรทัดคำขอ ส่วนหัวของข้อความหลายรายการ และเนื้อหาเอนทิตีคำขอ
บรรทัดคำขอประกอบด้วยวิธีการร้องขอ (รับหรือโพสต์) เส้นทางทรัพยากร (ที่อยู่ที่จะเข้าถึง) หมายเลขเวอร์ชัน http (http1.1)
ส่วนหัวของข้อความหลายรายการ (เช่น รวมถึงข้อมูลเคอร์เนลของเบราว์เซอร์ (user-agent) ที่เปิดหน้าหลัก (อ้างอิง) เป็นต้น
มีบรรทัดว่างในเนื้อหาเอนทิตีคำขอและส่วนหัวของข้อความเพื่อแยกส่วนหัวของข้อความและเนื้อหาเอนทิตีคำขอ เนื้อหาเอนทิตีถูกส่งโดยผู้ใช้
ข้อความตอบกลับที่สมบูรณ์ประกอบด้วย: บรรทัดสถานะ ส่วนหัวของการตอบกลับหนึ่งรายการขึ้นไป บรรทัดว่าง และเอนทิตีการตอบกลับ
บรรทัดสถานะ: รวมถึงหมายเลขเวอร์ชันโปรโตคอล http รหัสสถานะ และคำอธิบายเหตุผล
รหัสสถานะทั่วไป: 200 ปกติ
404: ไม่มีทรัพยากรที่ร้องขอ
500: ข้อผิดพลาดภายในเซิร์ฟเวอร์
หลังจากพูดคุยสั้น ๆ เกี่ยวกับ http แล้ว เราจะแนะนำความแตกต่างระหว่างวิธีการรับและโพสต์
รับวิธีการ:
วิธีการ get วางเนื้อหาที่ส่งไว้ที่ส่วนท้ายของ url และความยาวจะถูกจำกัด ทั้งการโพสต์และการรับจะขึ้นอยู่กับโปรโตคอล http วิธีการโพสต์ มันถูกวางไว้ในเนื้อหาเอนทิตีคำขอ วิธีการโพสต์นั้นค่อนข้างปลอดภัย เบราว์เซอร์จะไม่เก็บข้อมูลแคช ในขณะที่วิธีการรับจะเก็บแคชไว้ มีการจำกัดความยาวหมายเลขโพสต์
เป็นเพราะตำแหน่งของโปรโตคอล http เมื่อส่งข้อมูลในวิธี get และวิธีการโพสต์แตกต่างกัน วิธีการเข้ารหัสเพื่อแก้ปัญหาก็จะแตกต่างกันเช่นกัน
การแก้ปัญหาอักขระที่อ่านไม่ออกในโหมดโพสต์:
ในวิธีการบริการของเซิร์ฟเล็ต (วิธี doGet หรือ doPost ก็เป็นที่ยอมรับเช่นกัน) ให้ตั้งค่าการเข้ารหัสของคำขอเป็น UTF-8
req.setCharacterEncoding("UTF-8");
ด้วยวิธีนี้ การเข้ารหัสคำขอจึงไม่มีปัญหา จากนั้นการเข้ารหัสการตอบสนองก็ตั้งค่าเป็น UTF-8 เช่นกัน
resp.setCharacterEncoding("UTF-8");
ด้วยวิธีนี้ไม่มีปัญหากับการเข้ารหัสการตอบกลับ แต่หลังจากเขียนแบบนี้ อาจยังมีปัญหาในเบราว์เซอร์อยู่เนื่องจากเบราว์เซอร์ไม่ทราบว่ารูปแบบการเข้ารหัสของคุณคืออะไรจึงแสดงตาม รูปแบบเริ่มต้นของเบราว์เซอร์ ดังนั้น หากต้องการตั้งค่าวิธีการเข้ารหัสสำหรับการแสดงผลของเบราว์เซอร์เป็น UTF-8 คำสั่งจะเป็นดังนี้:
resp.setContextType("ข้อความ/html;charset=utf-8");
ในเวลาเดียวกัน คุณต้องตรวจสอบให้แน่ใจด้วยว่าการเขียนโค้ดของเครื่องมือการพัฒนาของคุณสอดคล้องกับการเขียนโค้ดของโปรเจ็กต์ ไม่เช่นนั้นอักขระที่อ่านไม่ออกอาจเกิดขึ้นได้ในที่นี้ เราใช้ UTF-8 เป็นตัวอย่าง
การแก้ปัญหาอักขระที่อ่านไม่ออกในเมธอด get:
นอกเหนือจากการดำเนินการข้างต้นแล้ว วิธีการ get ยังต้องเพิ่มประโยคลงในไฟล์คอนฟิกูเรชัน server.xml ในไดเร็กทอรี conf ของ tomcat ค้นหาประโยคต่อไปนี้
<พอร์ตตัวเชื่อมต่อ = "8080" protocol = "HTTP/1.1" ConnectionTimeout = "20000" เปลี่ยนเส้นทางพอร์ต = "8443" />
หลังจากแก้ไขก็เป็นได้
<พอร์ตตัวเชื่อมต่อ = "8080" protocol = "HTTP/1.1" ConnectionTimeout = "20000" เปลี่ยนเส้นทางพอร์ต = "8443" userBodyEncodingForURI = "true" />
วิธีแก้ไขนี้มีความยืดหยุ่นมากกว่า ทำให้รูปแบบการเข้ารหัสของ URL เหมือนกับรูปแบบการเข้ารหัสของหน้าเว็บ หรือสามารถกำหนดเป็นรูปแบบคงที่ได้ เช่น
<พอร์ตตัวเชื่อมต่อ = "8080" protocol = "HTTP/1.1" ConnectionTimeout = "20000" เปลี่ยนเส้นทางพอร์ต = "8443" EncodingForURI = "UTF-8" />
วิธีนี้โดยพื้นฐานแล้วจะไม่มีปัญหาใดๆ หากยังมีปัญหาอยู่ คุณจะต้องใช้วิธีใน String เพื่อเปลี่ยนอักขระที่อ่านไม่ออกบนหน้าให้อยู่ในรูปแบบที่คุณต้องการ อย่างไรก็ตาม หากวิธีการข้างต้นถูกต้อง วิธีนี้ จะไม่ทำงาน มันจะใช้ได้อย่างไร?
นอกเหนือจากการดำเนินการข้างต้นแล้ว รูปแบบการเข้ารหัสของฐานข้อมูลจะต้องถูกตั้งค่าให้เหมือนกับโปรเจ็กต์ด้วย ที่นี่จึงเปลี่ยนเป็น UTF-8 เนื่องจากมีเวลาจำกัด การเขียนจึงหยาบและหลายสิ่งหลายอย่างถูกละเว้น แต่ควรจะเพียงพอที่จะแก้วิธีการเข้ารหัสเซิร์ฟเล็ตได้
คุณสามารถใช้ js เมื่อโทรได้ เช่น:
function ceshi() {window.location.href = "UserServlet?uname=zhangsan&realname=" + encodeURIComponent("สวัสดีทุกคน");}
ด้วยวิธีนี้ ตัวอักษรจีน สวัสดีทุกคน จะไม่แสดงในแถบที่อยู่อีกต่อไป (ผูกประโยคนี้เข้ากับปุ่มส่ง) และคุณสามารถส่งไปยังเซิร์ฟเล็ตที่เกี่ยวข้องได้ วิธีการแก้ไขอักขระที่อ่านไม่ออกนี้ยังใช้ได้กับ jsp ด้วย
ยังไงก็ตามฉันต้องพูดถึงบางสิ่งที่เกี่ยวข้องกับเซิร์ฟเล็ตนั่นคือการส่งต่อและการเปลี่ยนเส้นทางสามารถข้ามไปในโปรเจ็กต์ปัจจุบันเท่านั้นและการเปลี่ยนเส้นทางสามารถข้ามไปยังภายนอกได้แน่นอนว่ามีความแตกต่างอื่น ๆ ที่นี่เท่านั้น ให้ฉันพูดถึงบางสิ่งที่ฉันคิดว่าสำคัญ นั่นคือไม่ว่าจะใช้อันไหน หลังจากเขียนไปข้างหน้าและเปลี่ยนเส้นทางแล้ว อย่าลืมเพิ่ม return ต่อไป คำสั่ง จะมีการรายงานข้อผิดพลาดซึ่งจะป้องกันไม่ให้หน้าเดียวกันกระโดดหลายครั้ง ชาวเน็ตที่ไม่ชอบทำผิดพลาดขอบคุณสำหรับความร่วมมือและขอบคุณชาวเน็ตที่ช่วยฉันแก้ไขข้อผิดพลาดของฉันเพราะด้วยวิธีนี้ฉันจะพัฒนาต่อไปขอบคุณอย่างจริงใจ