Server Response trong Servlet



Như đã bàn luận trong chương trước, khi một Web Server phản hồi một HTTP Request tới trình duyệt, phản hồi đặc trưng bao gồm một dòng Status, một số trường Header, một dòng trống, và tài liệu. Một phản hồi đặc trưng giống như sau:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (Blank Line)


...

...


Dòng Status gồm HTTP version (trong ví dụ là HTTP/1.1), một Status code ( trong ví dụ là 200), và một thông báo rất ngắn tương ứng với Status code (trong ví dụ là OK).

Dưới đây là các trường Header hữu ích nhất trong phản hồi HTTP 1.1 mà trở lại trình duyệt từ Web Server và bạn sẽ thường xuyên sử dụng chúng trong lập trình web:

HeaderMiêu tả
AllowTrường này xác định các phương thức yêu cầu (GET, POST, .v.v.) mà Server hỗ trợ
Cache-ControlTrường này xác định các hoàn cảnh mà trong đó tài liệu phản hồi có thể được cache một cách an toàn. Nó có thể có các giá trị publics, private hoặc no-cache, .v.v.. Trong đó, publics nghĩa là tài liệu có thể được cache, private nghĩa là tài liệu dành cho một người sử dụng và chỉ có thể được lưu giữ riêng (không được chia sẻ) và no-cache nghĩa là tài liệu không bao giờ được cache
ConnectionTrường này chỉ dẫn trình duyệt có sử dụng persistent trong các kết nối HTTP hoặc không. Một giá trị close chỉ rằng trình duyệt không sử dụng các kết nối HTTP dạng persistent và keep-alive nghĩa là sử dụng các kết nối persistent
Content-DispositionTrường này cho bạn yêu cầu rằng trình duyệt hỏi người sử dụng để lưu phản hồi lên địa trong một file với tên đã cho
Content-EncodingTrường này xác định cách mà trang được mã hóa trong khi truyền tải
Content-LanguageTrường này xác định ngôn ngữ mà tài liệu được viết. Ví dụ en, en-us, ru, …
Content-LengthTrường này xác định số byte trong phản hồi. Thông tin này chỉ cần thiết nếu trình duyệt đang sử dụng một kết nối HTTP dạng persistent (giá trị keep-alive)
Content-TypeTrường này kiểu MIME (Multipurpose Internet Mail Extension) của tài liệu phản hồi
ExpiresTrường này xác định thời gian tại đó nội dung nên được xem là hết hạn và không bao giờ được cache nữa
Last-ModifiedTrường này chỉ dẫn khi tài liệu được thay đổi lần cuối. Sau đó Client có thể cache tài liệu này và cung cấp một date bởi một trường yêu cầu If-Modified-Since trong các yêu cầu sau đó
LocationTrường này nên được bao với tất cả phản hồi mà có Status code là 300. Nó thông báo cho trình duyệt về địa chỉ tài liệu. Trình duyệt tự động kết nối lại tới vị trí này và thu nhận tài liệu mới
RefreshTrường này xác định khi nào trình duyệt nên đề nghị một trang đã được update. Bạn có thể xác định thời gian với đơn vị là số giây sau đó một trang sẽ được refresh
Retry-AfterTrường này có thể được sử dụng khi kết hợp với phản hồi 503 (Service Unavailable) để nói cho Client khi nào thì nó có thể lặp lại yêu cầu
Set-CookieTrường này xác định một cookie mà liên kết với trang

Các phương thức để thiết lập HTTP Response Header

Bảng dưới liệt kê các phương thức có thể được sử dụng để thiết lập HTTP Response Header trong chương trình Servlet. Các phương thức này có là có sẵn với đối tượng HttpServletResponse.

STTPhương thức và Miêu tả
1String encodeRedirectURL(String url)

Mã hóa URL đã cho để sử dụng trong phương thức sendRederect, hoặc nếu mã hóa này không được đòi hỏi, thì trả về URL như cũ

2String encodeURL(String url)

Mã hóa URL đã cho bằng việc thêm ID của session trong nó, hoặc nếu mã hóa này không được đòi hỏi, thì trả về URL như cũ

3boolean containsHeader(String name)

Trả về một Boolean chỉ rằng có hay không header phản hồi với tên đã cho đã được thiết lập

4boolean isCommitted()

Trả về một Boolean chỉ rằng nếu phản hồi đã được commit

5void addCookie(Cookie cookie)

Thêm cookie đã cho tới phản hồi

6void addDateHeader(String name, long date)

Thêm một header phản hồi với tên và giá trị date đã cho

7void addHeader(String name, String value)

Thêm một header phản hồi với tên và giá trị đã cho

8void addIntHeader(String name, int value)

Thêm một header phản hồi với tên và giá trị integer đã cho

9void flushBuffer()

Force bất kỳ nội dung nào trong Buffer để được ghi tới Client đó

10void reset()

Xóa bất dữ liệu nào tồn tại trong buffer cũng như Status code và các trường header

11void resetBuffer()

Xóa nội dung của buffer nằm dưới trong phản hồi mà không xóa các trường header và status code

12void sendError(int sc)

Gửi một phản hồi lỗi tới Client bởi sử dụng Status code đã cho và xóa buffer

13void sendError(int sc, String msg)

Gửi một phản hồi lỗi tới Client bởi sử dụng Status code đã cho

14void sendRedirect(String location)

Gửi một phản hồi Redirect tạm thời tới Client bởi sử dụng địc chỉ URL để Redirect đã cho

15void setBufferSize(int size)

Thiết lập kích cỡ buffer cho thân phản hồi

16void setCharacterEncoding(String charset)

Thiết lập mã hóa ký tự (MIME Charset) của phản hồi đang được gửi tới Client, ví dụ, thiết lập là UTF-8

17void setContentLength(int len)

Thiết lập độ dài nội dung của thân phản hồi trong HTTP Servlet, phương thức này thiết lập trường header là HTTP Content-Length

18void setContentType(String type)

Thiết lập kiểu nội dung của phản hồi đang được gửi tới Client, nếu phản hồi vẫn chưa được commit

19void setDateHeader(String name, long date)

Thiết lập một header phản hồi với tên và giá trị date đã cho

20void setHeader(String name, String value)

Thiết lập một header phản hồi với tên và giá trị đã cho

21void setIntHeader(String name, int value)

Thiết lập một header phản hồi với tên và giá trị integer đã cho

22void setLocale(Locale loc)

Thiết lập Locale của phản hồi, nếu phản hồi vẫn chưa được commit

23void setStatus(int sc)

Thiết lập Status code cho phản hồi này

Ví dụ về HTTP Header Response

Bạn đã thấy cách phương thức setContentType() làm việc trong ví dụ trước và ví dụ sau cũng sử dụng phương thức này, ngoài ra chúng ta sẽ sử dụng phương thức setIntHeader() để thiết lập trường Refresh Header:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class Refresh extends HttpServlet {
 
  // Method to handle GET method request.
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Set refresh, autoload time as 5 seconds
      response.setIntHeader("Refresh", 5);
 
      // Set response content type
      response.setContentType("text/html");
 
      // Get current time
      Calendar calendar = new GregorianCalendar();
      String am_pm;
      int hour = calendar.get(Calendar.HOUR);
      int minute = calendar.get(Calendar.MINUTE);
      int second = calendar.get(Calendar.SECOND);
      if(calendar.get(Calendar.AM_PM) == 0)
        am_pm = "AM";
      else
        am_pm = "PM";
 
      String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
    
      PrintWriter out = response.getWriter();
      String title = "Auto Refresh Header Setting";
      String docType =
      "\n";
      out.println(docType +
        "\n" +
        "" + title + "\n"+
        "\n" +
        "

" + title + "

\n" + "

Current Time is: " + CT + "

\n"); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

Bây giờ gọi Servlet trên sẽ hiển thị System Time hiện tại sau mỗi 5s như sau. Bạn chạy và đợi để xem kết quả:

Auto Refresh Header Setting

Current Time is: 9:44:50 PM

Các bài học SEO phổ biến khác tại VietJack: