JavaRush /Blog Java /Random-VI /Phần 5. Servlets, Java servlet API. Viết một ứng dụng web...

Phần 5. Servlets, 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. Servlets, Java servlet API.  Viết ứng dụng web đơn giản - 1Bạn đã biết cách viết các ứng dụng Java xuất văn bản ra 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, hãy thoải mái nhé. Trong bài viết này, chúng ta sẽ làm quen với các 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ọ một jarnik hoặc buộc họ tải xuống Java. Hãy viết một ứng dụng web . Nếu bạn chưa quen với các phương pháp tiếp cận được sử dụng trong lập trình web, tôi khuyên bạn nên bắt đầu đọc từ 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ì

Trước tiên, hãy tìm hiểu servlet là gì và tại sao bạn lại nghe về nó thường xuyên như vậy. API Java Servlet là một API tiêu chuẩn được thiết kế để triển khai trên máy chủ và làm việc với máy khách bằng cách sử dụng sơ đồ phản hồi yêu cầu. 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 nó. Đúng, servlet trong Java chính xác là các thành phần mà kiến ​​trúc máy khách-máy chủ được xây dựng. Nếu bạn còn nhớ, chúng ta đã nói về nó ở một trong những bài viết trong loạt bài này. Chúng ta đừng vòng vo: hãy viết một số mã ngay lập tức.

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

Để làm việc thoải mái với các servlet trong Java, bạn sẽ cần Intellij IDEA Ultimate Edition. Nó được trả phí nhưng bạn có thể kích hoạt thời gian dùng thử 30 ngày hoặc sử dụng phiên bản truy cập sớm - phiên bản này luôn miễn phí. Đồng thời cài đặt máy chủ ứng dụng của chúng tôi - Apache Tomcat. Tomcat là một thùng chứa servlet: nó xử lý các yêu cầu đến từ bên ngoài và chuyển chúng đến ứng dụng của chúng ta. Bạn có thể tải xuống Tomcat từ liên kết này .

Tạo ứng dụng web đầu tiên

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 thì hãy chú ý đến bài viết trước . Hãy bắt đầu!
  1. Trong pom.xml, thêm phần phụ thuộc javax.servlet-api và thiết lập cuộc chiến đóng gói:

    <?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, Java servlet API.  Viết ứng dụng web đơn giản - 2 Phần 5. Servlet, Java servlet API.  Viết ứng dụng web đơn giản - 3

  3. Tiếp theo, chúng tôi cho biết chúng tôi sẽ sử dụng phiên bản Tomcat nào, URL mà chúng tôi có thể truy cập vào máy chủ và cổng. Bạn sẽ nhận được một cái gì đó như thế này:

    Phần 5. Servlets, Java servlet API.  Viết ứng dụng web đơn giản - 4
  4. Tất cả những gì còn lại là chỉ định tạo phẩm (dự án đã được tập hợp vào kho lưu trữ jar), dự án này 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 đã phát nổ : điều này có nghĩa là sau khi dự án được xây dựng lại, tạo tác sẽ tự động được đặt vào thùng chứa servlet. Phần 5. Servlets, Java servlet API.  Viết ứng dụng web đơn giản - 5

  5. Bối cảnh Ứng dụng được đặt thành servlets_war_exploded theo mặc định , có nghĩa là ứng dụng phải được truy cập tại: http://localhost:8080/servlets_war_exploded .

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

    Phần 5. Servlets, Java servlet API.  Viết ứng dụng web đơn giản - 6

  6. Bấm vào đồng ý. Chúng tôi thấy rằng bây giờ chúng tôi có cơ hội khởi chạy ứng dụng:

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

    Bây giờ, khi bạn khởi chạy ứng dụng, trình duyệt sẽ mở và hiển thị lỗi 404. Điều này là hợp lý, vì tại địa chỉ http://localhost:8080/ cần có một servlet có ánh xạ “/” và servlet duy nhất của chúng ta có ánh xạ “/hello” .

  7. Chúng tôi liên hệ với nó tại http://localhost:8080/hello và nhận được phản hồi như mong đợi - chuỗi “Xin chào”!

Nếu mọi thứ đều hoạt động, hãy xem mã. Để tạo một http servlet từ một lớp thông thường , bạn cần kế thừa nó từ lớp HttpServlet. Phía trên lớp, chúng ta chỉ định chú thích @WebServlet(), trong đó chúng ta liên kết (ánh xạ) servlet vớ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, vì vậy có rất nhiều ví dụ trên Internet về việc ánh xạ servlet xảy ra thông qua một tệp XML. Bây giờ điều này là không cần thiết. Để xử lý các yêu cầu GET , chúng ta ghi đè phương thức doGet(). Hãy chú ý đến các đối số của phương thức - HttpServletRequest và HttpServletResponse. Từ đối tượng HttpServletRequest chúng ta có thể lấy tất cả thông tin cần thiết về yêu cầu, trong HttpServletResponse chúng ta có thể ghi lại 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à phiên

Hãy cải thiện servlet của chúng tôi để nó có thể xử lý các tham số yêu cầu và hoạt động với 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();
   }
}
servlet hiện đang chạy phiên, tăng lượt truy cập mỗi lần trang được truy cập. Nếu thuộc tính VisitCounter chưa được tạo (lần đầu tiên bạn truy cập trang), phương thức getAttribution() sẽ trả về null, vì vậy bạn cần kiểm tra null. Điều tương tự cũng áp dụng cho 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, giá trị của nó sẽ là null. Trong trường hợp này, chúng tôi sẽ chào người dùng dưới dạng ẩn danh. Để truyền tham số trong yêu cầu GET, các biến đường dẫn được sử dụng, nghĩa là bạn cần truy cập vào liên kết http://localhost:8080/hello?username=Pavel . Bạn có thể đọc thêm về các yêu cầu http trong bài viết trước trong loạt bài này. Bây giờ ứng dụng của chúng tôi có logic tối thiểu, nhưng lỗi 404 trong đường dẫn gốc hơi khó chịu. Để khắc phục, hãy tạo một servlet khác và ánh xạ nó tới trang ban đầu @WebServlet("/"). Công việc 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ẽ cần phải hiểu sự khác biệt giữa chúng là gì. chuyển tiếp - các đại biểu yêu cầu xử lý tới một servlet khác trên máy chủ, máy khách không liên quan. Để thực hiện việc này, bạn cần 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 vào bối cảnh servlet, lấy trình quản lý yêu cầu của servlet mong muốn từ nó và yêu cầu nó xử lý một yêu cầu cụ thể với các tham số đã chỉ định (req, resp). chuyển hướng - trả về cho khách hàng địa chỉ mà anh ta cần liên hệ để xử lý yêu cầu của mình. Hầu hết các trình duyệt đều tự động truy cập vào liên kết được truyền. Để thực hiện chuyển hướng, bạn cần thêm mã này:
resp.sendRedirect(req.getContextPath() + "/hello");
Trong HttpServletResponse chúng ta gọi phương thức redirect() và truyền cho nó địa chỉ mà client cần liên hệ. 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 cho lắm. Trong trường hợp của chúng tôi, tốt hơn là sử dụng chuyển tiếp, nhưng điều đó xảy ra là sử dụng chuyển hướng sẽ tốt hơn. Nếu bạn hiểu sự khác biệt trong công việc của họ, bạn sẽ không sai lầm với lựa chọn của mình. 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");
   }
}

Điểm mấu chốt

Ứng dụng web đầu tiên của bạn đã sẵn sàng. Trong bài viết tiếp theo, bạn sẽ tìm hiểu 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ự - ghi đè các phương thức tương ứng của lớp cha. Bằng cách sử dụng các servlet đơn giản như vậy, bạn có thể xây dựng các ứng dụng web phức tạp và phong phú. Tất nhiên, sử dụng các framework lớn như Spring thì việc này dễ thực hiện hơn nhiều. Nhưng nếu bạn thực sự muốn tìm hiểu chi tiết 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. Thùng chứa Servlet Phần 7. Giới thiệu mẫu MVC (Model-View-Controller) Phần 8. Viết một ứng dụng nhỏ trong spring-boot
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION