3.1 คลาส HttpServletResponse
หลังจากเรียกservice()
เมธอด servlet ของคุณแล้ว เว็บคอนเทนเนอร์จะสร้างการตอบกลับไปยังไคลเอ็นต์ตามไฟล์HttpServletResponse
. ดังนั้นหากคุณต้องการมีอิทธิพลต่อการตอบสนองต่อลูกค้า คุณควรแก้ไขวัตถุนี้
การตอบสนองของเซิร์ฟเวอร์ประกอบด้วยสามส่วน:
- บรรทัดสถานะ (เช่น: 200 OK)
- ส่วนหัว
- ร่างกายตอบสนอง
และวิธีการเรียนHttpServletResponse
ยังแบ่งออกเป็น 3 กลุ่ม? เกือบ:
วิธีการ | คำอธิบาย | |
---|---|---|
1 | void setStatus(int sc) |
ตั้งค่ารหัสสถานะการตอบสนอง |
2 | void sendError(int sc) |
ส่งข้อผิดพลาดไปยังไคลเอนต์ด้วยรหัสที่ระบุ |
3 | void sendError(int sc, String msg) |
ส่งข้อผิดพลาดพร้อมรหัสที่ระบุและข้อความไปยังไคลเอ็นต์ |
4 | void addHeader(String name, String value) |
เพิ่มส่วนหัวในรายการของส่วนหัวของการตอบสนอง |
5 | void setHeader(String name, String value) |
เปลี่ยนส่วนหัวในรายการส่วนหัวของการตอบสนอง |
6 | boolean containsHeader(String name) |
ตรวจสอบว่ามีส่วนหัวอยู่แล้วหรือไม่ |
7 | void addCookie(Cookie cookie) |
เพิ่มคุกกี้ในการตอบกลับ |
8 | void sendRedirect(String location) |
เปลี่ยนเส้นทางไคลเอ็นต์ไปยัง URL อื่น |
9 | String encodeRedirectURL(String url) |
เข้ารหัส URL ที่ระบุเพื่อใช้ในเมธอด sendRedirect |
10 | String encodeURL(String url) |
เข้ารหัส URL ที่ระบุ รวมถึง ID เซสชัน |
สิบเอ็ด | void setContentType(String type) |
ตั้งค่า MimeType ของผลลัพธ์ |
12 | void setContentLength(int len) |
ตั้งค่าความยาวของเนื้อหาการตอบสนอง |
13 | void setCharacterEncoding(String charset) |
ตั้งค่าชุดการเข้ารหัสการตอบสนอง |
14 | void setBufferSize(int size) |
ตั้งค่าขนาดบัฟเฟอร์สำหรับเนื้อหาการตอบสนอง |
15 | boolean isCommitted() |
ตรวจสอบว่าได้เขียนบัฟเฟอร์ไปยังการตอบกลับแล้วหรือไม่ |
16 | void flushBuffer() |
เขียนเนื้อหาของบัฟเฟอร์ในการตอบสนอง |
17 | void reset() |
รีเซ็ตข้อมูลทั้งหมดที่เก็บไว้ในบัฟเฟอร์ ส่วนหัว และโค้ดตอบกลับ |
18 | void resetBuffer() |
ล้างบัฟเฟอร์การตอบสนอง |
วิธีการที่นี่ค่อนข้างเล็กน้อย แต่ฉันจะให้ไฮไลท์ด้านล่าง
บัฟเฟอร์ _ การตอบสนองของเซิร์ฟเล็ตของคุณถูกเขียนไปยังบัฟเฟอร์ ไม่ใช่ส่งไปยังผู้ใช้ทันที ดังนั้นในบางขั้นตอน (เช่น หากเกิดข้อผิดพลาด) คุณสามารถรีเซ็ต (ลบ) ทุกสิ่งที่เขียนไปยังบัฟเฟอร์ คุณยังสามารถเรียกใช้เมธอด reset() และลบเนื้อหาของบัฟเฟอร์ไม่เพียงเท่านั้น แต่ยังรวมถึงส่วนหัวด้วยรหัสตอบกลับด้วย
3.2 เปลี่ยนเส้นทาง ()
จุดสำคัญที่สองคือการเปลี่ยนเส้นทาง หากเซิร์ฟเล็ตของคุณตัดสินใจเปลี่ยนเส้นทางไคลเอ็นต์ไปยัง URL อื่น คุณจะต้องส่ง URL นี้ไปยังไคลเอ็นต์ด้วยวิธีใดวิธีหนึ่ง ซึ่งสามารถทำได้โดยsendRedirect
ใช้
แต่มีความแตกต่างที่สำคัญ URI สามารถมีอักขระได้หลากหลายกว่าที่อนุญาตในเนื้อหาการตอบสนอง ดังนั้น URL จะต้องถูกเข้ารหัสเป็นชุดอักขระที่ถูกต้องก่อนที่จะเรียกใช้sendRedirect()
เมธอด มีวิธีการพิเศษสำหรับสิ่งencodeRedirectURL(String url)
นี้ ใช้มัน.
ตัวอย่างการเปลี่ยนเส้นทาง:
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String newUrl = "http://google.com?q=Learn to google!";
String redirectUrl = response.encodeRedirectURL(newUrl);
response.sendRedirect(redirectUrl);
}
}
3.3 เมธอด getWriter()
และตอนนี้เราจะเรียนรู้วิธีเขียนข้อความของเราเป็นเนื้อหาตอบกลับ ในการทำเช่น นี้คลาสHttpServletResponse
มีเมธอดพิเศษgetWriter()
ที่ส่งคืนออบเจกต์ PrintStream
ถ้าใครลืมนี่คือประเภทของฟิลด์ที่มีชื่อSystem.out
.
ในการเขียนข้อความเป็นการตอบกลับเซิร์ฟเล็ต คุณต้อง:
- รับวัตถุ PrintStream โดยเรียกไฟล์
response.getWriter()
. - เขียนสิ่งที่คุณคิดว่าจำเป็นไปยังวัตถุ PrintStream (ข้อมูลทั้งหมดจะถูกเขียนไปยังบัฟเฟอร์)
- ส่งบัฟเฟอร์ไปยังผู้ใช้โดยเรียกเมธอด
close()
บน PrintStream
มาเขียนเซิร์ฟเล็ตที่บวกเลขสองตัวa
และb
ส่งคืนผลลัพธ์ให้กับผู้ใช้:
public class CalculatorServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
// Getting the parameter “a” and “b” from request
String a = request.getParameter("a");
String b = request.getParameter("b");
try {
// Convert strings to numbers and calculate sum
int sum = Integer.parseInt(a) + Integer.parseInt(b);
// Print HTML as a response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head> <title> CalculatorServlet </title> </head>");
out.println("<body>");
out.println("<h1> Sum == " + sum + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}