Bài đăng nổi bật

 Java Server-Side Programming

Java Servlets

1.  Introduction

Trong những ngày đầu, các máy chủ web cung cấp các nội dung tĩnh không quan tâm đến yêu cầu của người dùng. Java servlet là các chương trình phía máy chủ (chạy bên trong máy chủ web) xử lý các yêu cầu của khách hàng và trả về phản hồi động hoặc tùy chỉnh cho mỗi yêu cầu. Phản hồi động có thể dựa trên thông tin đầu vào của người dùng (ví dụ: tìm kiếm, mua sắm trực tuyến, giao dịch trực tuyến) với dữ liệu được truy xuất từ ​​cơ sở dữ liệu hoặc các ứng dụng khác hoặc dữ liệu nhạy cảm về thời gian (chẳng hạn như tin tức và giá cổ phiếu).

Các servlet Java thường chạy trên giao thức HTTP. HTTP là một giao thức phản hồi yêu cầu không đối xứng . Máy khách gửi một thông báo yêu cầu đến máy chủ và máy chủ trả về một thông báo phản hồi như được minh họa.


Công nghệ phía máy chủ

Có nhiều công nghệ phía máy chủ (cạnh tranh) có sẵn: dựa trên Java (servlet, JSP, JSF, Struts, Spring, Hibernate), ASP, PHP, CGI Script và nhiều công nghệ khác.

Java servlet là nền tảng của công nghệ phía máy chủ Java, JSP (JavaServer Pages), JSF (JavaServer Faces), Struts, Spring, Hibernate và các công nghệ khác, là các phần mở rộng của công nghệ servlet.

Điều kiện tiên quyết

HTML, Ngôn ngữ lập trình Java, Máy chủ HTTP và Apache Tomcat, Hệ thống cơ sở dữ liệu SQL và MySQL, và nhiều thứ khác.

Máy chủ Apache Tomcat

Servlet là các chương trình phía máy chủ chạy bên trong một máy chủ HTTP hỗ trợ Java . Apache Tomcat Server (@ http://tomcat.apache.org ) là Triển khai Tham chiếu (RI) chính thức cho Java servlet và JSP, được cung cấp miễn phí bởi tổ chức nguồn mở Apache (@ http://www.apache.org ).

Bạn cần cài đặt Tomcat để dùng thử các servlet Java. Đọc Cách cài đặt Tomcat và bắt đầu lập trình Java Servlet ".

Tôi sẽ biểu thị thư mục đã cài đặt của Tomcat là <CATALINA_HOME>và giả sử rằng máy chủ Tomcat đang chạy ở cổng 8080.

Tomcat cung cấp nhiều ví dụ về servlet tuyệt vời trong " <CATALINA_HOME>\webapps\examples\servlets". Bạn có thể chạy các ví dụ này bằng cách khởi chạy Tomcat và phát hành URL http://localhost:8080/examples.

Phiên bản Java Servlet

Java Servlet có các phiên bản sau: [TODO các tính năng và tính năng mới]

  • J2EE 1.2 (ngày 12 tháng 12 năm 1999) ( Java Servlet 2.2 , JSP 1.1, EJB 1.1, JDBC 2.0)
  • J2EE 1.3 (ngày 24 tháng 9 năm 2001) ( Java Servlet 2.3 , JSP 1.2, EJB 2.0, JDBC 2.1)
  • J2EE 1.4 (ngày 11 tháng 11 năm 2003) ( Java Servlet 2.4 , JSP 2.0, EJB 2.1, JDBC 3.0)
  • Java EE 5 (ngày 11 tháng 5 năm 2006) ( Java Servlet 2.5 , JSP 2.1, JSTL 1.2, JSF 1.2, EJB 3.0, JDBC 3.0)
  • Java EE 6 (ngày 10 tháng 12 năm 2009) ( Java Servlet 3.0 , JSP 2.2 / EL 2.2, JSTL 1.2, JSF 2.0, EJB 3.1, JDBC 4.0)
  • Java EE 7: dự kiến ​​vào cuối năm 2012.

Trang chủ Java Servlets là @ http://java.sun.com/products/servlet ( http://www.oracle.com/technetwork/java/javaee/servlet/index.html ). Đối với các nhà phát triển, hãy xem Servlet Developers @ http://java.net/projects/servlet/ .

Java Servlet là công nghệ nền tảng cho lập trình phía máy chủ Java. Bạn cần phải hiểu Servlet kỹ lưỡng trước khi có thể tiếp tục với các công nghệ phía máy chủ Java khác như JavaServer Pages (JSP) và JavaServer Faces (JSF).

2. Đánh giá về HTTP

Một HTTP Servlet chạy theo giao thức HTTP. Điều quan trọng là phải hiểu giao thức HTTP để hiểu các chương trình phía máy chủ (servlet, JSP, ASP, PHP, v.v.) chạy trên HTTP. Đọc " Kiến thức cơ bản về HTTP ", nếu cần.

Tóm lại, HTTP là một giao thức phản hồi yêu cầu. Máy khách gửi một thông báo yêu cầu đến máy chủ. Đến lượt nó, máy chủ sẽ trả về một thông báo phản hồi. Thông báo bao gồm hai phần: tiêu đề (thông tin về thông báo) và nội dung (nội dung). Header cung cấp thông tin về các tin nhắn. Dữ liệu trong tiêu đề được tổ chức theo các cặp tên-giá trị.

Đọc " Thông báo phản hồi và yêu cầu HTTP " để biết định dạng, cú pháp của thông báo yêu cầu và phản hồi cũng như các ví dụ.

3. Servlet "Hello-world" đầu tiên

Chúng ta hãy bắt đầu bằng cách viết một servlet nói xin chào để đáp ứng yêu cầu của khách hàng. Chúng tôi sẽ sử dụng JDK và Tomcat để hiểu những điều cơ bản, thay vì IDE như IntelliJ/ Eclipse / NetBeans. Khi bạn đã hiểu những điều cơ bản, bạn nên sử dụng 

IntelliJ/Eclipse / NetBeans để phát triển ứng dụng web của mình nhằm đạt năng suất tốt hơn.

3.1 Tạo một ứng dụng web mới " helloservlet "

Chúng tôi sẽ bắt đầu bằng cách xác định một ứng dụng web (ứng dụng web) mới có tên là " helloservlet" trong Tomcat. Ứng dụng web, được gọi là ngữ cảnh web trong Tomcat, bao gồm một tập hợp các tài nguyên, chẳng hạn như tệp HTML, CSS, JavaScripts, hình ảnh, chương trình và thư viện.

Ứng dụng web Java có cấu trúc thư mục được chuẩn hóa để lưu trữ các loại tài nguyên khác nhau.

Tạo một thư mục " helloservlet" trong thư mục " " của Tomcat webapps(tức là " <CATALINA_HOME>\webapps\helloservlet", <CATALINA_HOME>biểu thị thư mục đã cài đặt của Tomcat) Tạo các thư mục con " WEB-INF" và " META-INF" dưới " helloservlet". Tạo các thư mục con phụ " classes", " lib" và " src" dưới " WEB-INF". Hãy lưu ý rằng tên thư mục có phân biệt chữ hoa chữ thường.

Các tài nguyên phải được giữ trong các thư mục tương ứng:

  • <CATALINA_HOME> \ webapps \ helloservlet : Thư mục này được gọi là thư mục gốc cho ngữ cảnh web " helloservlet". Nó chứa các tài nguyên mà khách hàng có thể truy cập , chẳng hạn như HTML, CSS, Scripts và hình ảnh. Các tài nguyên này sẽ được giao cho khách hàng như nó vốn có . Bạn có thể tạo thư mục con như imagescssvà scripts, để loại hơn nữa các nguồn lực.
  • <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF : Ứng dụng khách KHÔNG thể truy cập trực tiếp thư mục này. Đây là nơi bạn lưu giữ các tệp cấu hình dành riêng cho ứng dụng của mình (chẳng hạn như " web.xml") và các thư mục con của nó chứa các lớp chương trình, tệp nguồn và thư viện.
    • <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF \ src : Giữ các tệp nguồn chương trình Java. Đó là một thực tiễn tốt để tách các tệp nguồn và các lớp để tạo điều kiện triển khai.
    • Các lớp <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF \ : Giữ các lớp Java (được biên dịch từ mã nguồn). Các lớp được định nghĩa trong gói phải được giữ theo cấu trúc thư mục gói.
    • <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF \ lib : giữ các tệp JAR được cung cấp bởi các gói bên ngoài, chỉ dành cho ứng dụng web này.
  • <CATALINA_HOME> \ webapps \ helloservlet \ META-INF : Ứng dụng khách cũng KHÔNG thể truy cập thư mục này. Nó giữ các tài nguyên và cấu hình (ví dụ: " context.xml") liên quan đến máy chủ cụ thể (ví dụ: Tomcat, Glassfish). Ngược lại, " WEB-INF" dành cho các tài nguyên liên quan đến ứng dụng web này, độc lập với máy chủ.

3.2 Viết một Java Servlet Hello-world - " HelloServlet.java "

Servlet là các chương trình Java chạy bên trong một máy chủ HTTP hỗ trợ Java. Người dùng có thể gọi một servlet bằng cách cấp một URL cụ thể từ trình duyệt (máy khách HTTP). Trong ví dụ này, chúng ta sẽ viết một servlet có tên là " HelloServlet.java" và được biên dịch thành " HelloServlet.class". Khách hàng có thể gọi " HelloServlet.class" bằng cách cấp URL http://hostname:port/helloServlet/sayhello(tức là " sayhello" liên quan đến ứng dụng web).

Một servlet sẽ được giữ bên trong một gói Java (thay vì gói không có tên mặc định ) để triển khai thích hợp. Hãy gọi gói của chúng tôi " mypkg". Tạo một thư mục con có tên " mypkg" dưới " WEB-INF\src". Sử dụng trình soạn thảo văn bản lập trình để nhập các mã nguồn sau và lưu dưới dạng " HelloServlet.java" trong " <CATALINA_HOME>webapps\helloservlet\WEB-INF\src\mypkg".



Phân tích chương trình:
  • Chúng tôi định nghĩa một lớp Java được gọi là HelloServlet(trong Dòng 8). Dòng 2 đặt lớp này trong một gói được gọi mypkgDo đó, chúng tôi lưu tệp nguồn trong " mypkg" của thư mục " helloservlet\WEB-INF\src", theo cấu trúc thư mục gói chuẩn của Java.
  • Chúng tôi cần thư viện API Servlet để biên dịch chương trình này. Servlet API không phải là một phần của JDK hoặc Java SE (nhưng thuộc về Java EE). Tomcat cung cấp một bản sao của API servlet được gọi là "servlet-api.jar"in" <CATALINA_HOME>\lib". Bạn có thể sao chép "servlet-api.jar"từ" <CATALINA_HOME>\lib"sang" <JAVA_HOME>\jre\lib\ext"(Thư mục mở rộng JDK) hoặc bao gồm tệp Servlet JAR trong của bạn CLASSPATH.
  • Để biên dịch chương trình theo JDK, chúng ta cần sử dụng -dtùy chọn chỉ định thư mục đích đầu ra để đặt lớp đã biên dịch trong helloservlet\WEB-INF\class\mypkgthư mục "".
    // Thay đổi thư mục thành <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF 
    d: \ ...> cd <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF 
      
    // Biên dịch tệp nguồn và đặt lớp vào thư mục đích đã chỉ định 
    d: \ <CATALINA_HOME> \ webapps \ helloservlet \ WEB-INF> lớp javac -d src \ mypkg \ HelloServlet.java
    Tùy chọn " -d classes" chỉ định thư mục đích đầu ra, liên quan đến thư mục hiện tại. Đầu ra là Trình biên dịch tự động tạo thư mục gói " ".<CATALINA_HOME>\webapps\helloservlet\WEB-INF\classes\mypkg\HelloServlet.classmypkg
  • Chúng tôi không viết một servlet từ đầu. Thay vào đó, chúng tôi tạo một servlet bằng cách phân loại con javax.servlet.http.HttpServlet(trong Dòng 8).
  • Như đã đề cập, một servlet được gọi để đáp lại một URL yêu cầu do một máy khách cấp. Cụ thể, một máy khách đưa ra một yêu cầu HTTP, máy chủ sẽ định tuyến thông báo yêu cầu đến servlet để xử lý. Servlet trả về một thông báo phản hồi cho máy khách.
  • Một yêu cầu HTTP có thể sử dụng các phương thức yêu cầu GET hoặc POST, các phương thức này sẽ được xử lý bởi phương thức doGet()hoặc doPost()phương thức của servlet .
  • Trong HelloServlet, chúng tôi ghi đè doGet()phương thức (như được biểu thị bằng chú thích @Override). Quá trình doGet()chạy để đáp ứng yêu cầu HTTP GET do người dùng đưa ra thông qua một URL. doGet()nhận hai đối số, một HttpServletRequestđối tượng và một HttpServletResponseđối tượng, tương ứng với các thông báo yêu cầu và phản hồi.
  • Đối HttpServletRequesttượng có thể được sử dụng để truy xuất tiêu đề yêu cầu HTTP đến và dữ liệu biểu mẫu . Đối HttpServletResponsetượng có thể được sử dụng để đặt tiêu đề phản hồi HTTP (ví dụ: loại nội dung) và nội dung thông báo phản hồi .
  • Trong Dòng 13, chúng tôi đặt kiểu "MIME" của thông báo phản hồi thành " text/html". Khách hàng cần biết loại thông báo để hiển thị chính xác dữ liệu nhận được. (Loại MIME khác bao gồm text/plainimage/jpegvideo/mpegapplication/xml, và nhiều người khác). Trong Dòng 15, chúng ta lấy một Writerđối tượng gọi là outđể viết các thông điệp trả lời cho khách hàng qua mạng. Sau đó, chúng tôi sử dụng out.println()để in ra một trang HTML thích hợp có chứa thông báo "Xin chào, thế giới!". Servlet này cũng lặp lại một số thông tin yêu cầu của khách hàng và in ra một số ngẫu nhiên cho mỗi yêu cầu.

3.3 Định cấu hình Bộ mô tả Triển khai Ứng dụng - " web.xml "

Người dùng web gọi một servlet, được giữ trong máy chủ web, bằng cách cấp một URL cụ thể từ trình duyệt. Trong ví dụ này, chúng tôi sẽ định cấu hình URL yêu cầu sau để kích hoạt " HelloServlet":

http://hostname:port/helloservlet/sayhello

File cấu hình được gọi là  "web.xml", và lưu lại  "webapps\helloservlet\WEB-INF", như sau:


  • The "web.xml" is called web application deployment descriptor. It provides the configuration options for that particular web application, such as defining the the mapping between URL and servlet class.
  • web.xml" Được gọi là bộ mô tả triển khai ứng dụng web . Nó cung cấp các tùy chọn cấu hình cho ứng dụng web cụ thể đó, chẳng hạn như xác định ánh xạ giữa URL và lớp servlet.
  • Cấu hình trên xác định một servlet có tên " HelloWroldServlet", được triển khai trong " mypkg.HelloServlet.class" (đã viết trước đó) và ánh xạ tới URL " /sayhello", trong đó " /" biểu thị gốc ngữ cảnh của ứng dụng web này " helloservlet". Nói cách khác, URL tuyệt đối cho servlet này là http://hostname:port/helloservlet/sayhello


  • Hãy lưu ý rằng MỖI servlet yêu cầu một cặp <servlet>và <servlet-mapping>các phần tử để thực hiện ánh xạ, thông qua một tùy ý nhưng duy nhất <servlet-name>Hơn nữa, tất cả các <servlet>phần tử phải được nhóm lại với nhau và đặt trước các <servlet-mapping>phần tử (như được chỉ định trong lược đồ XML).
  • 3.4 Chạy Servlet Hello-world

    Để chạy servlet, trước tiên hãy khởi động máy chủ Tomcat. Xác minh rằng ngữ cảnh web " helloservlet" đã được triển khai bằng cách quan sát các thông báo sau trong bảng điều khiển của Tomcat:

    xxx x, xxxx xx: xx: xx xx org.apache.catalina.startup.HostConfig deployDirectory
    THÔNG TIN: Triển khai thư mục ứng dụng web helloservlet 
    ......

    Khởi động trình duyệt web (Firefox, IE hoặc Chrome) và nhập URL sau (như được định cấu hình trong " web.xml"). Giả sử rằng Tomcat đang chạy ở cổng số 8080.


http://localhost:8080/helloservlet/sayhello

    Chúng ta sẽ thấy đầu ra "Hello, world!".


Hãy thử chọn "Xem Nguồn" trong trình duyệt của bạn để tạo ra các đầu ra sau:

<!DOCTYPE html>
<html><head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>Hello, World</title></head>
<body>
<h1>Hello, world!</h1>
<p>Request URI: /helloservlet/sayhello</p>
<p>Protocol: HTTP/1.1</p>
<p>PathInfo: null</p>
<p>Remote Address: 127.0.0.1</p>
<p>A Random Number: <strong>0.4320795689818858</strong></p>
</body>
</html>

Điều quan trọng cần lưu ý là người dùng nhận đầu ra của servlet. Người dùng không nhận được mã chương trình của servlet, được giữ trong thư mục ẩn " WEB-INF" và người dùng web không thể truy cập trực tiếp.


Mọi thứ có thể xảy ra sai sót sẽ xảy ra sai sót ... Đọc " Thông báo lỗi phổ biến ". Các lỗi có thể xảy ra là "Không tìm thấy tệp 404" và "Lỗi máy chủ nội bộ 500".





Post a Comment

Mới hơn Cũ hơn