มาดูแผนภูมิการไหล:
กระบวนการคำขอประมวลผลเซิร์ฟเวอร์:
(1) ทุกครั้งที่เซิร์ฟเวอร์ได้รับคำขอจะเปิดเธรดใหม่สำหรับคำขอ
(2) เซิร์ฟเวอร์จะห่อหุ้มข้อมูลคำขอของลูกค้าลงในวัตถุคำขอและคำขอเป็นผู้ให้บริการข้อมูลคำขอ!
(3) เซิร์ฟเวอร์จะสร้างวัตถุตอบกลับซึ่งเชื่อมต่อกับไคลเอนต์และสามารถใช้เพื่อส่งการตอบกลับไปยังไคลเอนต์
ดังที่เห็นได้จากแผนภูมิการไหลในคำขอและการตอบสนองของ Javaweb พารามิเตอร์ที่สำคัญที่สุดสองพารามิเตอร์คือการร้องขอและการตอบสนองซึ่งอยู่ในวิธีการบริการ () ของ servlet
1. แนวคิดการตอบสนอง:
การตอบสนองเป็นพารามิเตอร์ของวิธี servlet.service และเป็นประเภท javax.servlet.http.httpservletResponse เมื่อไคลเอนต์ทำแต่ละคำขอเซิร์ฟเวอร์จะสร้างวัตถุตอบกลับและส่งผ่านไปยังเมธอด servlet.service () วัตถุการตอบสนองใช้เพื่อตอบสนองต่อลูกค้าซึ่งหมายความว่าการใช้วัตถุการตอบสนองในวิธีการบริการ () สามารถทำให้การตอบกลับทำงานกับไคลเอนต์ให้เสร็จสมบูรณ์
ฟังก์ชั่นของวัตถุตอบสนองแบ่งออกเป็นสี่ประเภทต่อไปนี้:
(1) ตั้งค่าข้อมูลส่วนหัวการตอบกลับ
(2) ส่งรหัสสถานะ
(3) ตั้งค่าข้อความตอบกลับ
(4) เปลี่ยนเส้นทาง
2. ข้อความตอบสนองการตอบสนอง
การตอบสนองเป็นวัตถุตอบสนอง การไหลของการตอบสนองของร่างกายการตอบสนอง (ร่างกายตอบสนอง) สามารถใช้เพื่อส่งออกร่างกายการตอบสนองไปยังลูกค้า Repsonse จัดเตรียมวัตถุไหลตอบกลับสองรายการ:
(1) PrintWriter out = response.getWriter (): รับสตรีมอักขระ;
(2) servletoutputStream out = response.getOutputStream (): รับสตรีมไบต์;
แน่นอนถ้าเนื้อหาของร่างกายตอบสนองเป็นตัวละครให้ใช้ Response.getWriter () และหากเนื้อหาการตอบกลับเป็นไบต์ตัวอย่างเช่นเมื่อดาวน์โหลดคุณสามารถใช้ Response.getOutputStream ()
โปรดทราบ ว่าในคำขอเดียวสตรีมทั้งสองไม่สามารถใช้งานได้ในเวลาเดียวกัน! นั่นคือไม่ว่าคุณจะใช้ Reply.getWriter () หรือ Response.getOutputStream () แต่คุณไม่สามารถใช้สตรีมทั้งสองในเวลาเดียวกันได้ มิฉะนั้นจะมีการโยนผิดกฎหมายจะถูกโยนลงไป
3. ตั้งค่าข้อมูลส่วนหัวการตอบกลับ
คุณสามารถใช้เมธอด setheader () ของวัตถุตอบสนองเพื่อตั้งส่วนหัวการตอบกลับ! ชุดส่วนหัวการตอบกลับโดยใช้วิธีนี้ในที่สุดจะถูกส่งไปยังเบราว์เซอร์ไคลเอนต์!
(1) Response.Setheader ("เนื้อหาประเภท", "ข้อความ/html; charset = utf-8"): ตั้งส่วนหัวการตอบสนองประเภทเนื้อหา ฟังก์ชั่นของส่วนหัวนี้คือการบอกเบราว์เซอร์ว่าเนื้อหาการตอบกลับเป็นประเภท HTML และเข้ารหัสเป็น UTF-8 และในเวลาเดียวกันการเข้ารหัสสตรีมของตัวละครของการตอบสนองจะถูกตั้งค่าเป็น UTF-8 นั่นคือการตอบสนอง Setcharaceterencoding ("UTF-8");
(2) Response.Setheader ("Refresh", "5; url = http: //www.baidu.com"): มันจะข้ามไปที่หน้าแรกของ Baidu โดยอัตโนมัติหลังจาก 5 วินาที
4. ตั้งรหัสสถานะและวิธีการอื่น ๆ
(1) Response.SetContentType ("text/html; charset = utf-8"): เทียบเท่ากับการเรียกใช้การตอบสนอง setheader ("เนื้อหาประเภท", "text/html; charset = utf-8");
(2) Response.Setcharacterencoding ("UTF-8"): ตั้งค่าการเข้ารหัสอักขระของสตรีมตอบสนองของอักขระเป็น UTF-8;
(3) Response.SetStatus (200): ตั้งรหัสสถานะ;
(4) Response.Senderror (404, "ทรัพยากรที่คุณกำลังมองหาไม่มีอยู่"): เมื่อส่งรหัสสถานะข้อผิดพลาด Tomcat จะข้ามไปยังหน้าข้อผิดพลาดคงที่ แต่สามารถแสดงข้อความแสดงข้อผิดพลาดได้
5. เปลี่ยนเส้นทาง (****** คีย์ *******)
5.1 การเปลี่ยนเส้นทางคืออะไร (สองคำขอ)
เมื่อคุณเยี่ยมชม http://www.sun.com คุณจะพบว่า URL ในแถบที่อยู่เบราว์เซอร์จะกลายเป็น http://www.oracle.com/us/sun/index.htm ซึ่งเป็นการเปลี่ยนเส้นทาง การเปลี่ยนเส้นทางคือเมื่อเซิร์ฟเวอร์แจ้งให้เบราว์เซอร์เข้าถึงที่อยู่อื่นนั่นคือการออกคำขออื่น
5.2 วิธีการเปลี่ยนเส้นทางให้เสร็จสมบูรณ์?
คำตอบ: รหัสสถานะสำหรับการเปลี่ยนเส้นทางคือ 302 ก่อนอื่นเราใช้วัตถุตอบกลับเพื่อส่งรหัสสถานะ 302 ไปยังเบราว์เซอร์จากนั้นตั้งตำแหน่งนั่นคือให้ URL ที่มีอยู่และเบราว์เซอร์เข้าถึง URL ใหม่เพื่อรับรู้การเปลี่ยนเส้นทาง
ตัวอย่างเช่น:
ระดับสาธารณะ Aservlet ขยาย httpservlet {โมฆะสาธารณะ doget (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setStatus (302); Response.Setheader ("ตำแหน่ง", "http://www.baidu.com"); -วัตถุประสงค์ของรหัสข้างต้นคือ: หลังจากเข้าถึง Aservlet เบราว์เซอร์จะได้รับแจ้งให้เปลี่ยนเส้นทางไปยังหน้าแรกของ Baidu หลังจากเบราว์เซอร์ไคลเอ็นต์แยกวิเคราะห์รหัสตอบกลับของ 302 มันรู้ว่าเซิร์ฟเวอร์ปล่อยให้มันเปลี่ยนเส้นทางดังนั้นจะได้รับตำแหน่งส่วนหัวตอบกลับทันทีจากนั้นออกคำขอที่สอง
นอกจากนี้ยังมีวิธีการเปลี่ยนเส้นทางอย่างรวดเร็ว นั่นคือใช้วิธีการตอบสนอง Sendredirect () ตัวอย่างเช่นสองประโยคในตัวอย่างข้างต้นสามารถแทนที่ด้วย response.sendredirect ("http://www.baidu.com")
คำขอ encapsulates ข้อมูลการร้องขอทั้งหมดจากไคลเอนต์
1. คำขอภาพรวม
คำขอเป็นพารามิเตอร์ของวิธี servlet.service () และเป็นประเภท javax.servlet.http.httpservletrequest เมื่อไคลเอนต์ทำแต่ละคำขอเซิร์ฟเวอร์จะสร้างวัตถุคำขอและห่อหุ้มข้อมูลคำขอลงในคำขอแล้วส่งไปยังเมธอดบริการ () เมื่อเรียกใช้เมธอด servlet.service () ซึ่งแสดงว่าข้อมูลคำขอสามารถรับได้ผ่านวัตถุคำขอในเมธอดบริการ ()
ดังแสดงในรูป:
ฟังก์ชั่นของคำขอสามารถแบ่งออกเป็นประเภทต่อไปนี้:
(1) ห่อหุ้มข้อมูลส่วนหัวคำขอ
(2) ห่อหุ้มข้อมูลข้อความคำขอ หากเป็นคำขอ GET แสดงว่าไม่มีข้อความ
(3) คำขอเป็นวัตถุโดเมนซึ่งสามารถเพิ่มและเรียกคืนเป็นแผนที่
(4) คำขอให้ฟังก์ชั่นการส่งต่อการร้องขอและการร้องขอ
2. วิธีการขอโดเมน
คำขอเป็นวัตถุโดเมน! มีวัตถุโดเมนสี่ตัวใน Javaweb ซึ่งเป็นที่ servletContext เป็นวัตถุโดเมนซึ่งจะสร้างวัตถุ ServletContext หนึ่งชิ้นในแอปพลิเคชันทั้งหมด ขอหนึ่งในคำขอซึ่งสามารถแบ่งปันข้อมูลในคำขอ
คำขอสร้างวัตถุคำขอ หากมีประสบการณ์หลาย Servlets ในการร้องขอ Servlets หลายตัวสามารถใช้คำขอเพื่อแบ่งปันข้อมูล ตอนนี้เราไม่ทราบวิธีการผ่าน servlets หลายตัวในคำขอ
นี่คือวิธีการตามคำขอ:
(1) โมฆะ setAttribute (ชื่อสตริง, ค่าวัตถุ): ใช้ในการจัดเก็บวัตถุนอกจากนี้ยังสามารถเรียกว่าการจัดเก็บแอตทริบิวต์โดเมนเช่น: servletContext.setAttribute ("xxx", "xxx") แอตทริบิวต์โดเมนจะถูกบันทึกไว้ในคำขอ โปรดทราบว่าหากวิธีการที่เรียกว่าหลายครั้งและมีการใช้ชื่อเดียวกันค่าสุดท้ายจะถูกเขียนทับซึ่งเหมือนกับแผนที่
(2) Object GetAttribute (ชื่อสตริง): ใช้เพื่อรับข้อมูลในคำขอ จะต้องเก็บไว้ก่อนที่จะได้รับ ตัวอย่างเช่น: string value = (string) request.getAttribute ("xxx"); เพื่อให้ได้แอตทริบิวต์โดเมนชื่อ XXX;
(3) โมฆะ removeattribute (ชื่อสตริง): ใช้เพื่อลบแอตทริบิวต์โดเมนในคำขอ หากแอตทริบิวต์โดเมนที่ระบุโดยชื่อพารามิเตอร์ไม่มีอยู่วิธีนี้จะไม่ทำอะไรเลย
(4) การแจงนับ getattributenames (): รับชื่อของแอตทริบิวต์โดเมนทั้งหมด
3. พารามิเตอร์ผ่านตามคำขอ
มีสองวิธีที่พบบ่อยที่สุดในการส่งพารามิเตอร์บนไคลเอนต์:
(1) อินพุตโดยตรงจากแถบที่อยู่เบราว์เซอร์: ต้องเป็นคำขอรับ
(2) ไฮเปอร์ลิงก์: ต้องเป็นคำขอรับ;
(3) แบบฟอร์ม: สามารถรับหรือโพสต์ซึ่งขึ้นอยู่กับค่าแอตทริบิวต์วิธีการของ <form>;
ความแตกต่างระหว่างคำขอ GET และ Post Request:
(1) รับคำขอ:
พารามิเตอร์คำขอจะแสดงในแถบที่อยู่ของเบราว์เซอร์ดังนั้นจึงไม่ปลอดภัย
ขีดจำกัดความยาวของพารามิเตอร์คำขออยู่ภายใน 1k;
คำขอรับไม่มีตัวตนดังนั้นการเข้ารหัสของพารามิเตอร์ไม่สามารถตั้งค่าผ่านคำขอ setcharacterencoding ();
(2) คำขอโพสต์:
พารามิเตอร์คำขอจะไม่แสดงแถบที่อยู่ของเบราว์เซอร์ซึ่งค่อนข้างปลอดภัย
ไม่มีขีด จำกัด เกี่ยวกับความยาวของพารามิเตอร์ที่ร้องขอ
4. คำขอส่งต่อและการร้องขอการรวม (****** คีย์ *******)
ไม่ว่าจะเป็นการส่งต่อการร้องขอหรือการรวมคำขอนั่นหมายความว่า Servlets หลายตัวร่วมกันจัดการกับคำขอ ตัวอย่างเช่น servlet1 จัดการคำขอจากนั้น servlet1 ส่งต่อไปยัง servlet2 เพื่อดำเนินการประมวลผลคำขอต่อไป
ขอส่งต่อและคำขอรวมถึง
RequestDispatcher RD = request.getRequestDispatcher ("/myServlet"); ใช้คำขอเพื่อรับออบเจ็กต์ RequestDispatcher พารามิเตอร์ของวิธีการคือเส้นทาง servlet ของ servlet ที่ส่งต่อหรือที่มีอยู่
การร้องขอการส่งต่อ: RD.Forward (คำขอ, การตอบกลับ);
คำขอรวมถึง: rd.include (คำขอ, การตอบกลับ);
บางครั้งคำขอต้องใช้ servlets หลายตัวเพื่อทำงานร่วมกันดังนั้นคุณต้องกระโดดใน servlet หนึ่งไปยังอีก servlet!
> คำขอครอบคลุมหลาย servlets และต้องมีการส่งต่อและการรวม
> การส่งต่อคำขอ: หน่วยตอบกลับเสร็จสมบูรณ์โดย servlet ถัดไป! servlet ปัจจุบันสามารถตั้งค่าส่วนหัวการตอบกลับ! (ออกจากศีรษะ แต่ไม่ใช่ร่างกาย) นั่นคือหัวที่สอดคล้องกันที่กำหนดโดย servlet ปัจจุบันนั้นถูกต้องและร่างกายที่สอดคล้องกันนั้นไม่ถูกต้อง
> คำขอประกอบด้วย: ร่างกายตอบสนองไม่เสร็จสมบูรณ์ด้วยสอง servlets! (อยู่ทั้งหมด) ทั้งหมดถูกต้อง
> ไม่ว่าจะเป็นการส่งต่อคำขอหรือคำขอที่มีอยู่นั้นอยู่ในขอบเขตของคำขอ! ใช้คำขอและการตอบกลับเดียวกัน!
คำขอส่งต่อและคำขอรวมถึงการเปรียบเทียบ:
(1) หากคำขอถูกส่งต่อไปยัง bservlet ใน aservlet ร่างกายการตอบสนองจะไม่ได้รับอนุญาตให้ส่งออกใน aservlet นั่นคือ response.getWriter () และ response.getOutputStream () ไม่สามารถส่งออกไปยังไคลเอนต์ได้อีกต่อไป งานนี้ควรทำโดย bservlet; หากใช้เพื่อรวมคำขอไม่มีข้อ จำกัด ดังกล่าว
(2) แม้ว่าการส่งต่อคำขอไม่สามารถส่งออกร่างกายการตอบสนอง แต่ส่วนหัวการตอบสนองยังสามารถตั้งค่าได้เช่น: response.setContentType ("ข้อความ/html; charset = utf-8");
(3) คำขอส่วนใหญ่ถูกนำไปใช้ในหน้า JSP เพื่อให้การผสานของหลาย ๆ หน้าเสร็จสมบูรณ์
(4) การส่งต่อการร้องขอส่วนใหญ่จะถูกนำไปใช้ใน Servlets และเป้าหมายการส่งต่อส่วนใหญ่เป็นหน้า JSP
ดังแสดงในรูป:
การเปรียบเทียบคำขอส่งต่อและการเปลี่ยนเส้นทาง
(1) การร้องขอการส่งต่อเป็นคำขอเดียวในขณะที่การเปลี่ยนเส้นทางเป็นสองคำขอ;
(2) หลังจากการส่งต่อการร้องขอแถบที่อยู่เบราว์เซอร์จะไม่เปลี่ยนแปลง แต่การเปลี่ยนเส้นทางจะเปลี่ยนไปเนื่องจากการเปลี่ยนเส้นทางเป็นสองคำขอ
(3) เป้าหมายของการร้องขอการส่งต่อสามารถเป็นทรัพยากรในแอปพลิเคชันนี้เท่านั้นและเป้าหมายของการเปลี่ยนเส้นทางสามารถเป็นแอปพลิเคชันอื่น ๆ
(4) วิธีการส่งต่อการร้องขอสำหรับ aservlet และ bservlet นั้นเหมือนกันนั่นคือทั้งสองได้รับหรือทั้งสองเป็นโพสต์เนื่องจากการส่งต่อคำขอเป็นคำขอ;
(5) คำขอที่สองสำหรับการเปลี่ยนเส้นทางจะต้องได้รับ;
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น