CodeGym /Blog Java /Ngẫu nhiên /Phần 5. Servlet và Java Servlet API. Viết một ứng dụng we...
John Squirrels
Mức độ
San Francisco

Phần 5. Servlet và Java Servlet API. Viết một ứng dụng web đơn giản

Xuất bản trong nhóm
Tài liệu này là một phần của loạt bài "Giới thiệu về Phát triển Doanh nghiệp". Các bài viết trước: Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 1Bạn đã biết cách viết ứng dụng Java hiển thị văn bản trên bảng điều khiển, nhưng bạn vẫn chưa thực sự biết cách tạo ứng dụng web đầu tiên của mình? Tuyệt vời, làm cho mình thoải mái. Trong bài viết này, chúng ta sẽ làm quen với servlet và viết một ứng dụng mà bạn có thể khoe với bạn bè mà không cần gửi cho họ tệp JAR và không bắt họ tải xuống Java. Hãy viết một ứng dụng web đơn giản . Nếu bạn chưa quen với các phương pháp được sử dụng trong phát triển web, tôi khuyên bạn nên bắt đầu bằng cách đọc bài viết đầu tiên trong loạt bài " Giới thiệu về Phát triển Doanh nghiệp ".

Một servlet là gì?

Đầu tiên, hãy tìm hiểu xem servlet là gì và tại sao bạn lại nghe về chúng thường xuyên như vậy. Java Servlet API là một API được tiêu chuẩn hóa nhằm triển khai trên máy chủ. Nó tương tác với khách hàng theo sơ đồ yêu cầu-phản hồi. Một servlet là một lớp có thể nhận các yêu cầu từ máy khách và trả về các phản hồi cho máy khách. Trên thực tế, các servlet chính xác là các khối xây dựng mà chúng ta sử dụng để tạo kiến ​​trúc máy khách-máy chủ trong Java. Bạn có thể nhớ lại rằng chúng ta đã nói về kiến ​​trúc đó trong một bài viết khác trong loạt bài này. Chúng ta sẽ không vòng vo: hãy viết mã ngay lập tức.

Những gì bạn cần để tạo một ứng dụng web

Để thuận tiện nhất khi làm việc với Java servlet, bạn cần IntelliJ IDEA Ultimate Edition. Đây là một sản phẩm trả phí nhưng bạn có thể kích hoạt bản dùng thử 30 ngày hoặc sử dụng phiên bản truy cập sớm luôn miễn phí. Ngoài ra, hãy cài đặt Apache Tomcat — máy chủ của ứng dụng của chúng tôi. Tomcat là một thùng chứa servlet: nó xử lý các yêu cầu đến và chuyển chúng đến ứng dụng của chúng ta. Tải xuống Tomcat tại đây .

Hãy tạo ứng dụng web đầu tiên của chúng tôi

Nếu mọi thứ đã sẵn sàng, hãy tạo một dự án Maven. Nếu bạn chưa quen với Maven, hãy xem bài viết trước . Hãy bắt đầu nào!
  1. Trong pom.xml, hãy thêm phụ thuộc javax.servlet-api và chỉ định gói WAR:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>
    

    Lớp servlet đơn giản:

    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
    
  2. Để chạy ứng dụng, bạn cần tạo cấu hình Tomcat:

    Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 2Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 3

  3. Tiếp theo, chúng tôi cho biết phiên bản Tomcat nào chúng tôi sẽ sử dụng cũng như URL và cổng để liên lạc với máy chủ. Cậu nên có vài thứ như thế này:

    Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 4
  4. Bây giờ chúng ta chỉ cần chỉ định tạo tác (dự án được lắp ráp trong kho lưu trữ JAR) sẽ được triển khai trong vùng chứa. Bạn có thể nhấp vào nút Fix và chọn chiến tranh đã nổ : điều này có nghĩa là sau khi dự án được xây dựng lại, tạo phẩm sẽ tự động được đặt trong thùng chứa servlet. Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 5

  5. Giá trị mặc định cho Application contextservlets_war_exploded . Điều này có nghĩa là chúng tôi truy cập ứng dụng tại: http://localhost:8080/servlets_war_exploded .

    Tại sao chúng ta muốn có thêm văn bản? Hãy xóa những gì không cần thiết. Bây giờ, địa chỉ ứng dụng web của chúng tôi là: http://localhost:8080 .

    Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 6
  6. Nhấp vào OK. Chúng tôi thấy rằng bây giờ chúng tôi có thể khởi chạy ứng dụng:

    Phần 5. Servlet và Java Servlet API.  Viết ứng dụng web đơn giản - 7

    Bây giờ khi bạn mở ứng dụng trong trình duyệt của mình, bạn sẽ gặp lỗi 404. Điều này hợp lý, bởi vì địa chỉ http://localhost:8080/ cần một servlet ánh xạ tới "/", nhưng servlet duy nhất của chúng tôi ánh xạ tới "/hello" .

  7. Chúng tôi có thể truy cập nó tại http://localhost:8080/hello . Khi chúng tôi làm điều đó, chúng tôi sẽ nhận được câu trả lời mong đợi — chuỗi "Xin chào"!

Nếu mọi thứ đang hoạt động, hãy phân tích mã. Để tạo một HTTP-servlet từ một lớp thông thường , nó phải kế thừa lớp HttpServlet. Phía trên khai báo lớp, chúng tôi chỉ ra @WebServlet()chú thích. Đây là nơi chúng tôi liên kết (hoặc ánh xạ) servlet tới một đường dẫn cụ thể ("/hello"). Chú thích này chỉ xuất hiện trong Java Servlet API 3.0, do đó, Internet có rất nhiều ví dụ trong đó ánh xạ servlet xảy ra thông qua một tệp XML. Điều này không còn cần thiết nữa. Để xử lý các yêu cầu GET , chúng tôi ghi đè doGet()phương thức. Hãy chú ý đến các tham số của phương thức: HttpServletRequestHttpServletResponse. Đối HttpServletRequesttượng cung cấp cho chúng tôi tất cả các thông tin cần thiết về yêu cầu. Trong HttpServletResponse, chúng tôi viết phản hồi của mình và đặt các tiêu đề cần thiết.

Làm việc với các tham số và một phiên

Hãy cải thiện servlet của chúng ta để nó có thể xử lý các tham số yêu cầu và làm việc với một phiên:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
Bây giờ, servlet hoạt động với một phiên, tăng giá trị visitCountermỗi khi trang được truy cập. Nếu visitCounterthuộc tính chưa được tạo (trong lần truy cập đầu tiên vào trang), phương getAttribute()thức trả về null, vì vậy chúng ta cần kiểm tra null. Điều tương tự cũng xảy ra với các tham số yêu cầu. Nếu người dùng không chuyển tham số tên người dùng thì giá trị của nó sẽ là null. Trong trường hợp này, chúng tôi chào đón người dùng với tư cách là khách truy cập ẩn danh. Để truyền tham số trong yêu cầu GET, một chuỗi truy vấn được sử dụng. Ví dụ: chúng tôi có thể sử dụng URL sau: http:// localhost:8080/hello? Tên người dùng = Paul. Bạn có thể đọc thêm về các yêu cầu HTTP trong bài viết trướctrong sê-ri. Ứng dụng của chúng tôi hiện không có nhiều logic, nhưng hơi khó chịu là chúng tôi gặp lỗi 404 ở đường dẫn gốc. Để khắc phục điều này, chúng tôi sẽ tạo một servlet khác và ánh xạ nó tới trang bắt đầu: @WebServlet("/"). Mục đích của servlet này là chuyển hướng các yêu cầu đến đường dẫn "/hello". Có hai cách để thực hiện việc này: sử dụng "chuyển tiếp" hoặc "chuyển hướng". Có lẽ thật đáng để hiểu sự khác biệt giữa chúng. Chuyển tiếp ủy quyền xử lý yêu cầu cho một servlet khác trên máy chủ. Khách hàng không tham gia. Để thực hiện việc này, hãy thêm đoạn mã sau vào phương thức doGet() của servlet mới:

getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Trong mã này, chúng tôi truy cập ngữ cảnh của servlet, nhận bộ điều phối yêu cầu cho servlet có liên quan và yêu cầu nó xử lý một yêu cầu cụ thể với các đối số đã chỉ định (req, resp). Chuyển hướng trả lại cho máy khách địa chỉ mà máy khách phải sử dụng để xử lý yêu cầu của nó. Hầu hết các trình duyệt tự động điều hướng đến URL được trả về. Để triển khai chuyển hướng, bạn cần thêm mã này:

resp.sendRedirect(req.getContextPath() + "/hello");
Chúng ta gọi redirect()phương thức trên HttpServletResponsetham số và truyền cho nó địa chỉ mà client cần sử dụng. Đây là một chi tiết quan trọng: Các tham số HTTP cũng phải được thêm vào cuối đường dẫn chuyển hướng đầy đủ, điều này không thuận tiện lắm. Trong trường hợp của chúng tôi, nên sử dụng forward, nhưng đôi khi sử dụng redirectlại tốt hơn. Nếu bạn hiểu sự khác biệt trong cách thức hoạt động của chúng, bạn sẽ không lựa chọn sai. Mã cho servlet mới trông như thế này:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Bản tóm tắt

Ứng dụng web đầu tiên của bạn đã hoàn tất. Trong phần tiếp theo, bạn sẽ học cách triển khai nó mà không cần sử dụng IntelliJ IDEA. Chúng tôi đã viết một ứng dụng chỉ xử lý các yêu cầu GET. Các phương thức HTTP còn lại được xử lý theo cách tương tự — bằng cách ghi đè các phương thức tương ứng của lớp cha. Bạn có thể sử dụng các servlet đơn giản như thế này để xây dựng các ứng dụng web đa năng phức tạp. Tất nhiên, việc sử dụng các framework lớn như Spring giúp việc này trở nên dễ dàng hơn nhiều. Nhưng nếu bạn thực sự muốn tìm hiểu sâu hơn về tất cả các khả năng của servlet, bạn có thể đọc thông số kỹ thuật chính thức . Phần 6. Bộ chứa Servlet Phần 7. Giới thiệu mẫu MVC (Model-View-Controller)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION