Servlet & JSP - Bài 3 - HTTP Protocol cơ bản, phương thức GET và POST


Từ: 12:10 27/09/2012
Bài: 155
Cảm ơn: 178
Thích: 28

Tuần vừa rồi bị người yêu giận, đâm ra sáng phải đưa đi, trưa đón về, tối nấu mỳ còn đêm làm gì thì...còn lâu mới nói. Bận vậy nên không có thời gian làm tiếp TUT cho anh em. Hôm nay giải quyết công việc xong xuôi rồi mình lại tiếp tục loại bài này.

Ở bài trước chúng ta đã cài đặt thành công môi trường phát triển Servlet - JSP, còn ở bài này ta sẽ đề cập tới vấn đề cơ bản đầu tiên trong Servlet.

1. HTTP Protocol là gì?

HTTP - Hypertext Tranfer Protocol., giao thức truyền siêu văn bản. Như ta đã biết HTTP Protocol là 1 giao thức trong bộ giao thức TCP/IP. HTTP thường được sử dụng trong các ứng dụng Web, nó là giao thức giúp cho các ứng dụng Web giao tiếp đươc với Client và ngược lại. Để có thể truyền tin qua giao thức HTTP thì HTTP qui định ra các phương thức truyền (Method). Trong giao thức HTTP có 9 phương thức truyền được liệt kê dưới đây.

GET

POST

DELETE

HEAD

TRACE

PUT

OPTION

CONNECT

PATH

Ở đây ta không đi sâu vào tìm hiểu các phương thức, và trên thực tế 2 phương thức GET và POST được sử dụng nhiều nhất, nên ta chỉ quan tâm tới 2 phương thức đó. Nếu bạn nào có thời gian có thể tìm hiểu qua về các phương thức còn lại, nó cũng là 1 kiến thức hay :D

2. GET và POST dùng để làm gì?

- GET: Dùng để yêu cầu lấy dữ liệu từ Server

- POST: Dùng để đưa dữ liệu từ Client lên Server.

Trên thực tế ta cũng có thể dùng GET để đưa dữ liệu lên Server. Tuy nhiên việc so sánh giữa GET và POST dưới đây sẽ cho ta thấy không nên sử dụng GET để truyền dữ liệu lên Server.

Đầu tiêu ta xây dựng 1 Form bằng HTML như sau:

Các bạn chú ý tới 2 Attributes của Form là ActionMethod.

Action là địa chỉ mà ta cần truyền dữ liệu tới, được xác định bằng URL

Method chính là phương thức truyền ta sử dụng. Mặc định nếu ta không khai báo sẽ là GET, ở đây mình viết rõ ra cho các bạn dễ hiểu.

Bây giờ ta chạy thử Form và Submit dữ liệu vào. Khi ta nhập dữ liệu vào Form (phần khung đỏ) và Submit thì đường Link của trình duyệt sẽ được thay đổi như sau (phần khung xanh).

Ta thây rằng những dữ liệu mà ta nhập vào được xuất hiện trên đường Link của trình duyệt.

index.html?username=username&password=password

Trong đó “index.html” là nơi dữ liệu được truyền tới, sau dấu “?” sẽ là dữ liệu của chúng ta, được qui định theo dạng “name=value”. Như vậy các bạn đã thấy, khi dùng GET Method, dữ liệu sẽ được gửi lên Server và ta cũng sẽ nhìn thấy được dữ liệu đó. Bên cạnh đó, do giới hạn của đường Link (khoảng 255 kí tự) thì dữ liệu được gửi bằng GET Method cũng sẽ bị hạn chế. Khi dung GET, ta không nhất thiết phải Submit nó từ 1 Form mà ta có thể chèn trực tiếp dữ liệu vào đường Link của trình duyệt.

Bây giờ ta thử thay đổi Method của Form sang POST xem sao. Chạy lại Form, nhập dữ liệu và theo dõi đường Link của trình duyệt, ta thấy rằng không có dữ liệu nào được chứa trong đường Link. Như vậy GET sẽ tiện hơn POST vì nó có thể lưu lại đường Link để sử dụng lại.

Ok như vậy ta đã thấy được sự khác nhau cơ bản giữa GET và POST. Từ đó ta kết luận rằng dung POST để gửi dữ liệu sẽ an toàn hơn GET vì không ai có thể thấy được dữ liệu nào đã được gửi đi. Hơn thế nếu dung POST, dữ liệu chúng ta gửi sẽ không bị giới hạn bởi độ dài như khi dung GET. Vậy nên khi gửi dữ liệu ta nên dùng POST thay vì GET.

Ở đây bạn có thể tìm hiểu thêm về HTTP và MIME để thấy rằng những dữ liệu nào sẽ được truyền đi khi giao tiếp giữa Client và Server được thiết lập.

http://en.wikipedia.org/wiki/MIME

http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

3. Làm việc với GET và POST trong Servlet.

Để làm việc với GET và POST thì Servlet cung cấp cho chúng ta 2 phương thức đó là doGet() và doPost().

Trong đó doGet() để xử lí các yêu cầu khi Client gửi GET Method tới Server và doPost() để xử lí yêu cầu khi Client gửi POST Method tới Server. Ta để ý rằng mỗi Servlet đều kế thừa từ HttpServlet, trong đó có 2 đối tượng là HttpServletRequest và HttpServletRespone, một cái dung để tiếp nhận dữ liệu từ Client (Request) và cái còn lại để trả về kết quả cho Client (Response). Trong 2 phương thức doGet() và doPost() của chúng ta cũng mặc định truyền vào 2 tham số với kiểu của đối tượng HttpServletRequest và HttpServletRespone.

Bây giờ để rõ hơn ta sẽ làm một ví dụ về việc xử lý Method trong Servlet.

Các bạn dùng lại Form Login mà ta đã tạo vừa nãy và sửa Action của nó trỏ tới Servlet của chúng ta. Nếu bạn nào không biết Servlet của ta có Link là gì thì hãy chú ý tới phần @WebServlet(/GETPOST) – phía trên phần khai báo Class của Servlet, trong đó “GETPOST” chính là đường dẫn tới Servlet của chúng ta. Phần này được gọi là Java Anotation (chỉ dẫn biên dịch). Ta phải bỏ dấu / ở đầu đi nếu không trình biên dịch sẽ hiểu nhầm nó là đường dẫn từ gốc trong khi ta đang muốn 1 đường dẫn ngang bằng.

Ok sau khi đã xây dựng xong Form ta bắt đầu xử lý tới Servlet. Ở đây có 2 phương thức cho 2 Method khác nhau, tức là Servlet không biết khi nào ta sẽ gửi POST và khi nào sẽ dùng GET. Nếu viết Code xử lí cho cả 2 phương thức thì rất là dài nên ta sẽ viết riêng nó ra thành 1 phương thức khác, trong đó sẽ kiểm tra xem người dùng sử dụng phương thức gì, từ đó mới xác định công việc cần phải làm. Một lưu ý nhỏ là nếu bạn nào dùng Netbean thì mặc định Netbean sẽ tạo phương thức này cho chúng ta, còn trên Eclipse thì bạn sẽ phải tự tạo :D

Như trên ta đã tạo được phương thức getRequest() với các tham số tương tự như doGet() và doPost(). Trong phương thức này ta khai báo 1 String là method và giá trị của nó được lấy từ phương thức getMethod() của đối tượng Request. Phương thức này trả về tên phương thức và Client gửi tới (GET hoặc POST). Sau đó ta kiểm tra xem phương thức đó là gì, từ đó tiến hành giải quyết công việc. Sau khi đã có phương thức getRequest() ta sẽ gọi nó trong cả 2 phương thức doGet() và doPost().

Quay trở lại với ví dụ về Form Login, ta sẽ tiến hành Code trong Servlet để xử lí việc đăng nhập của Client qua phương thức POST. Nếu như phương thức là POST, tức là dữ liệu được gửi từ Client lên thì ta mới xử lí, còn nếu là GET, tức là người dùng truy cập trực tiếp vào Link của Servlet thì ta sẽ chuyển ngược người dùng về trang Login. Code của chúng ta như sau:

Trong đó để ý tới phần được gạch chân PrintWriter out, đó là 1 đối tượng dùng để in ra kết quả trả về cho Client, đối tượng này được gán với 1 phương thức của đối tượng Response. Phương thức request.getParameter(String param) nhận nhiệm vụ lấy giá trị từ Input có tên tương ứng. Của chúng ta có 2 Input là username và password.

Phần response.sendRedriect() là một phương thức của đối tượng response, sẽ chuyển liên kết của ta quay ngược về trang chứa Login Form ban đầu.

Ok bây giờ bạn hãy chạy Form của chúng ta và xem kết quả nhé :D Để thấy được sự khác biệt khi truyền POST và GET bạn hãy chạy Servlet trực tiếp, bạn sẽ thấy nó được chuyển ngay sang Form Login của chúng ta. Như vậy ta biết rằng Servlet của chúng ta chỉ xử lí POST Method mà thôi.

Như vậy em đã hướng dẫn các anh chị xong phần cơ bản của việc xử lí GET và POST trong Servlet. Hi vọng các anh chị thấy bổ ích !

Tutorial by Jino Hoàng - Viết TUT theo phong cách trẻ trâu