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();
        }
    }
}