JavaRush /Blog Java /Random-VI /Phần 6: Thùng chứa Servlet

Phần 6: Thùng chứa Servlet

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 6: Servlet Container - 1Trong bài viết trước, chúng ta đã làm quen với các servlet và tìm hiểu cách tạo các ứng dụng web với sự trợ giúp của chúng. Đã đến lúc xem xét kỹ hơn những gì kỳ nghỉ này sẽ không thể thực hiện được nếu không có - hộp đựng servlet.

Nội dung:

Thùng chứa servlet là gì

Đây là một chương trình chạy trên máy chủ và có thể tương tác với các servlet mà chúng ta đã tạo. Nói cách khác, nếu chúng ta muốn chạy ứng dụng web của mình trên máy chủ, trước tiên chúng ta phải triển khai một thùng chứa servlet và sau đó đặt các servlet vào đó. Cách thức hoạt động rất đơn giản: khi một máy khách liên hệ với máy chủ, vùng chứa sẽ xử lý yêu cầu của anh ta, xác định servlet nào sẽ xử lý nó và chuyển nó đi. Phần 6. Servlet Container - 2

Cách sử dụng thùng chứa servlet

Ngoài các yêu cầu định tuyến, bộ chứa servlet còn thực hiện các chức năng khác:
  1. Tự động tạo các trang HTML từ các tệp JSP.
  2. Mã hóa/giải mã tin nhắn HTTPS.
  3. Cung cấp quyền truy cập hạn chế cho quản trị servlet.
Nói chung thì nghe có vẻ ổn, việc còn lại là tìm ra cách áp dụng hết. Chà, để học cách sử dụng một thứ gì đó, bạn chỉ cần... thử sử dụng nó :) Vậy hôm nay chúng ta sẽ thực hành! Bộ chứa servlet phổ biến nhất là Apache Tomcat . Nó là nguồn mở và miễn phí sử dụng. Tải xuống Tomcat cho hệ điều hành của bạn từ liên kết này và hãy xem cách làm việc với các vùng chứa đang hoạt động.

Cài đặt và chạy Tomcat

  1. Để cài đặt Tomcat, chỉ cần giải nén kho lưu trữ đã tải xuống vào thư mục mong muốn.

  2. Xin lưu ý rằng Tomcat yêu cầu phiên bản Java 8 trở lên để chạy. Đảm bảo rằng biến môi trường JAVA_HOME đề cập đến phiên bản jdk hiện tại.

  3. Tiếp theo bạn cần cấu hình quyền truy cập của người dùng vào Tomcat . Việc này được thực hiện trong tệp tomcat-users.xml, nằm trong thư mục conf.

    Tomcat được cung cấp sẵn bốn vai trò:

    • manager-gui - truy cập vào giao diện đồ họa và trang trạng thái;
    • tập lệnh quản lý - truy cập vào giao diện văn bản và trang trạng thái;
    • manager-jmx - truy cập vào JMX và trang trạng thái;
    • trạng thái người quản lý - chỉ truy cập vào trang trạng thái.

    Bên trong thẻ <tomcat-users>, chúng ta sẽ viết rõ ràng các vai trò này và gán chúng cho người dùng của mình:

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="user" password="password"
        roles="manager-gui, manager-script, manager-jmx, manager-status"/>

    Bây giờ mọi thứ đã sẵn sàng để khởi động!

  4. Trong thư mục bin, chạy tệp startup.bat (startup.sh trên Linux).

  5. Sau vài giây, hãy mở liên kết http://localhost:8080/ trong trình duyệt của bạn . Trình quản lý đồ họa sẽ xuất hiện ở đó:

    Phần 6: Servlet Container - 3

    Nếu bạn nhìn thấy menu như vậy nghĩa là Tomcat đang chạy.

  6. Nếu nó không hoạt động, hãy kiểm tra thủ công các biến môi trường JAVA_HOME và CATALINA_HOME:

    • JAVA_HOME - phải tham khảo phiên bản hiện tại của Java 8+;
    • CATALINA_HOME - phải đề cập đến Tomcat hoặc vắng mặt (không được trỏ đến phiên bản khác của Tomcat).

Triển khai một ứng dụng lên Tomcat

Chúng tôi đã khởi chạy được Tomcat, vì vậy đã đến lúc triển khai một số loại dự án trong đó. Hãy sử dụng các servlet từ bài viết trước . MainServlet:
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 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" + "
"
); } else { printWriter.write("Hello, " + username + "
"
); } printWriter.write("Page was visited " + visitCounter + " times."); printWriter.close(); } }
IndexServlet:
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 IOException {
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}
Trước khi triển khai, các servlet của chúng tôi phải được đóng gói trong kho lưu trữ chiến tranh. Thông thường Maven được sử dụng cho việc này, nhưng để tạo một kho lưu trữ chiến tranh, bạn cần một tệp web.xml trong đó tất cả các servlet đều được ánh xạ. Chúng tôi đã viết các servlet bằng chú thích @WebServlet mới, vì vậy chúng tôi không có web.xml. May mắn thay, IDEA có thể thực hiện công việc bẩn thỉu cho chúng tôi và gói riêng dự án của chúng tôi vào kho lưu trữ chiến tranh. Để thực hiện việc này, bạn cần mở cấu trúc dự án (Ctrl + Shift + Alt + S) -> Artifacts -> Chọn loại bia mong muốn -> Chọn hộp bên cạnh “Bao gồm trong bản dựng dự án” -> Nhấp vào “OK”. Phần 6: Servlet Container - 4Xây dựng một dự án bằng cách sử dụng tổ hợp Ctrl + F9. Bây giờ kho lưu trữ chiến tranh của chúng tôi nằm trong thư mục đích. Phần 6: Servlet Container - 5Tệp có thể được đổi tên thành cái gì đó đơn giản hơn - ví dụ: servlet.war - và được chuyển đến một nơi thuận tiện hơn - trong C:\my\. Khi bia đã sẵn sàng để sử dụng, hãy đặt nó vào hộp đựng . Điều này có thể được thực hiện theo hai cách.
  1. Qua GUI

    Để thực hiện việc này, hãy theo liên kết http://localhost:8080/manager/html . Tomcat sẽ nhắc bạn đăng nhập và mật khẩu.

    Nếu bạn lặp lại tất cả các bước theo tôi thì thông tin đăng nhập là người dùng, mật khẩu là mật khẩu .

    Sau khi ủy quyền thành công, bạn sẽ thấy Trình quản lý ứng dụng web Tomcat. Phần Ứng dụng đã chứa 5 ứng dụng - đây là những ứng dụng tiện ích Tomcat cần thiết để đơn giản hóa việc làm việc với nó. Chúng có thể được gỡ bỏ trong tương lai.

    Phần 6: Servlet Container - 6

    Dưới đây là phần Triển khai. Sử dụng nó, bạn có thể chọn một kho lưu trữ chiến tranh để triển khai. Hãy nhập đường dẫn và ngữ cảnh theo cách thủ công:

    Phần 6. Servlet Container - 7

    Nhấp vào “Triển khai”, chúng tôi thấy ứng dụng của mình đã xuất hiện trong phần Ứng dụng:

    Phần 6: Servlet Container - 8 Sử dụng GUI Tomcat, chúng ta có thể dừng nó, khởi động lại nó, đặt độ dài phiên và xóa nó. Khi triển khai, chúng tôi đã chỉ định ngữ cảnh /demo, nghĩa là ứng dụng của chúng tôi phải được truy cập thông qua liên kết http://localhost:8080/demo . Kiểm tra, mọi thứ sẽ hoạt động.

  2. Thông qua hệ thống tập tin

    Để triển khai một ứng dụng theo cách này, bạn cần mở thư mục chứa Tomcat được giải nén và truy cập ứng dụng web. Dưới đây là những ứng dụng tiện ích mà chúng ta đã quen thuộc:

    Phần 6: Servlet Container - 9

    Tất cả những gì chúng ta cần làm là di chuyển servlet.war tới đây.

    Chúng ta đợi vài giây thì thấy đã xuất hiện một thư mục servlet mới nghĩa là ứng dụng của chúng ta đã được triển khai. Chúng ta hãy chuyển đến giao diện Trình quản lý ứng dụng quen thuộc - http://localhost:8080/manager/ . Ở đây chúng ta thấy rằng ứng dụng của chúng ta được triển khai trong ngữ cảnh /servlet:

    Phần 6. Servlet Container - 10

    Khi được triển khai theo cách này, ngữ cảnh sẽ tự động được gán cho tên của kho lưu trữ chiến tranh đã triển khai. Để thay đổi ngữ cảnh, bạn có thể đổi tên thư mục vừa tạo bằng ứng dụng, nhưng trước đó bạn cần xóa tệp: nếu không Tomcat sẽ triển khai lại ứng dụng với tên của kho lưu trữ.

    Như bạn có thể thấy, việc triển khai ứng dụng lên Tomcat dễ dàng hơn nhiều so với những gì bạn tưởng. Nhưng các chức năng khác của nó rất dễ sử dụng. Hãy kiểm tra.

Sử dụng giao thức HTTPS thay vì HTTP

Nếu bạn còn nhớ, chúng ta đã thảo luận về sự khác biệt giữa HTTP và HTTPS trong một bài viết riêng . HTTPS là giao thức tương tự như HTTP nhưng sử dụng mã hóa dữ liệu được truyền. Về phía máy khách, mã hóa được trình duyệt xử lý và chúng tôi phải cung cấp mã hóa ở phía máy chủ. Vì các yêu cầu HTTP được Tomcat chấp nhận và định tuyến nên việc ủy ​​quyền mã hóa cho nó là điều hợp lý. Để làm điều này bạn cần:
  1. Tạo chứng chỉ tự ký;
  2. Thực hiện cài đặt máy chủ bổ sung.
Hãy thực hành điều này.

Tạo chứng chỉ

JDK đi kèm với một số lượng lớn các tiện ích, bất kể phiên bản nào, một trong số đó là keytool . Đây là một công cụ để tạo khóa mã hóa và làm việc với chúng. Để sử dụng nó, bằng cách sử dụng dòng lệnh, hãy đi tới thư mục C:\Program Files\Java\jdk1.8.0_181\bin và chạy lệnh keytool -genkey -alias tomcat -keyalg RSA .
  • keytool - khởi chạy tiện ích với các tham số;
  • -genkey - cho biết chúng tôi muốn tạo khóa mới;
  • -alias tomcat — tạo bí danh chính;
  • -keyalg RSA - chọn RSA làm thuật toán tạo khóa.
Sau khi thực hiện lệnh xong tiện ích sẽ bắt đầu đối thoại với chúng ta: Phần 6: Servlet Container - 11Nhập các thông tin cần thiết. Bây giờ chúng tôi đã tạo một kho khóa trong thư mục chính của mình (đối với Windows là C:\Users\{username}\.keystore) và một khóa tomcat trong đó. Chúng tôi đã tạo một chứng chỉ đơn giản mà hầu hết các trình duyệt sẽ chấp nhận. Chứng chỉ này không phù hợp cho các ứng dụng thương mại: nó chỉ có thể được sử dụng cho mục đích thử nghiệm. Trên máy chủ sản xuất, bạn phải sử dụng chứng chỉ từ cơ quan cấp chứng chỉ (ví dụ: https://letsencrypt.org/ ).

Thiết lập máy chủ

Bây giờ chứng chỉ đã sẵn sàng, bạn cần điều chỉnh cài đặt máy chủ, cụ thể là trình kết nối SSL. Việc này được thực hiện trong tệp server.xml, nằm ở apache-tomcat-9.0.30/conf/ . Chúng tôi tìm thấy các khối như:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
 </Connector>
và bên cạnh chúng, chúng tôi đặt cấu hình của mình:
<Connector
       protocol="org.apache.coyote.http11.Http11NioProtocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
       clientAuth="false" sslProtocol="TLS"/>
Chúng tôi chỉ định các tham số keystoreFile và keystorePass các giá trị phù hợp với chúng tôi, lưu và khởi động lại Tomcat bằng cách sử dụng các tệp tắt máy.bat và startup.bat. Bây giờ máy chủ đã sẵn sàng xử lý các yêu cầu https, chỉ cần một chút tại địa chỉ đã thay đổi - https://localhost:8443/demo/hello . Khi nhấp vào liên kết, bạn sẽ thấy cảnh báo về việc chứng chỉ có vấn đề, điều này không có gì đáng ngạc nhiên. Như đã mô tả trước đó một chút, để có được chứng chỉ thông thường, bạn cần sử dụng dịch vụ của một trong các dịch vụ chứng nhận. Nhưng cho đến nay chúng tôi đã đạt được mục tiêu của mình: ứng dụng hoạt động bằng giao thức HTTPS và đây là điều chính!

Tạo các trang HTML động

Bây giờ chúng ta hãy tiếp tục xem xét các tính năng khác của bộ chứa servlet - tạo trang HTML động. Hãy tưởng tượng một thế giới lý tưởng, nơi thay vì mã HTML tĩnh nhàm chán, bạn có thể viết mã JAVA bằng cách sử dụng các biến, vòng lặp, mảng và các cấu trúc ngôn ngữ khác. Bạn có tưởng tượng không? Tin tốt là có thứ tương tự tồn tại, tin xấu là nó không tồn tại hoàn toàn. Nếu bạn chưa đoán ra thì chúng ta đang nói về công nghệ JSP (Java Server Pages). Nói tóm lại, đây là công nghệ cho phép bạn chèn các đoạn mã JAVA vào trang HTML. Đúng, mã này vẫn được chuyển thành HTML trước khi gửi cho khách hàng, nhưng nó sẽ được tạo động có tính đến nhiều yếu tố khác nhau. Ví dụ: bạn có thể sử dụng các cấu trúc có điều kiện và cung cấp các nội dung khác nhau tùy thuộc vào một số điều kiện. Trang JSP ví dụ:
<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>

<body>
<%
String firstName="name";
String secondName="surname";

    if(firstName.equals("name")){
      out.print("Hello :"+firstName+"<br>");
    }

    if(firstName.equals("name") && secondName.equals("surname"))
    {
      out.print("Hello, my dear friend! <br>");
    }
    else
    {
      out.print("I don’t know you. Go away! <br>");
    }
%>
</body>
</html>
Bạn có thể đọc thêm về JSP tại đây . Trên thực tế... chúng tôi không ở đây vì mục đích này mà vì lợi ích của các thùng chứa servlet! JSP có liên quan gì đến nó? Thật đơn giản: việc chuyển đổi mã JAVA từ JSP sang mã HTML được thực hiện bởi bộ chứa servlet. Khi một servlet chuẩn bị trả về nội dung JSP dưới dạng phản hồi, bộ chứa sẽ thông báo và trước tiên biến nó thành một trang HTML có thể đọc được trên trình duyệt trước khi gửi nội dung đó đến máy khách. Ngày nay có rất nhiều công nghệ tương tự của công nghệ JSP - Thymeleaf, FreeMarket, Mustache và những công nghệ khác. Tất cả đều hoạt động trên một nguyên tắc tương tự. Chọn cái nào cho công việc là vấn đề sở thích. Điều này cũng áp dụng cho việc chọn một thùng chứa servlet. Trong các ví dụ, chúng tôi đã sử dụng Tomcat, vùng chứa phổ biến nhất, nhưng một số dự án lại sử dụng các vùng chứa khác. Bạn nên làm quen nhanh với những cái phổ biến nhất và xem xét sự khác biệt của chúng với Tomcat.

Các lựa chọn thay thế cho Tomcat

  1. GlassFish là một vùng chứa mã nguồn mở được Oracle hỗ trợ.

    Không giống như Tomcat, nó là một máy chủ web chính thức, ngoài các servlet, có thể vận hành các thành phần khác từ khung JavaEE. Đồng thời, nó sử dụng nhiều RAM hơn. Linh hoạt hơn khi tinh chỉnh máy chủ, điều này khiến việc sử dụng trở nên khó khăn hơn. Nó rất đáng sử dụng khi phát triển các ứng dụng sử dụng khung JavaEE.

  2. WildFly - trước đây là Jboss . Ngoài ra nguồn mở. Được phát triển bởi Red Hat. Tên đã được thay đổi để tránh nhầm lẫn với một sản phẩm khác của công ty - Nền tảng ứng dụng doanh nghiệp JBoss.

    WildFly, giống như GlassFish, là một máy chủ web chính thức. Nhân tiện, dưới mui xe WildFly sử dụng Tomcat làm thùng chứa servlet. Không giống như GlassFish, WildFly nhẹ hơn và dễ cài đặt hơn.

  3. Jetty - tương tự như những cái trước, là nguồn mở. Được phát triển bởi Eclipse.

    Giống như Tomcat, nó là một thùng chứa servlet đơn giản, không hỗ trợ tất cả các thành phần của khung công tác JavaEE. Đồng thời, nó nhẹ hơn và thậm chí có thể chạy trên điện thoại di động. Nó bắt đầu và dừng lại một cách nhanh chóng và quy mô tốt. Không giống như Tomcat, nó có cộng đồng và nền tảng kiến ​​thức nhỏ hơn.

  4. WebLogic là phần mềm được cấp phép yêu cầu phải mua trước khi sử dụng. Thuộc sở hữu của Oracle.

    So với Tomcat, chức năng của nó rộng hơn một chút. Có thể làm việc với giao thức ftp. Nhưng nó không linh hoạt khi phát triển và thử nghiệm ứng dụng.

  5. WebSphere (chính xác là Máy chủ ứng dụng WebSphere) là một phần mềm trả phí. Được phát triển bởi IBM. Tương tự như WildFly và GlassFish, nó là một máy chủ ứng dụng chính thức. Nhưng nó có giao diện thiết lập thân thiện hơn, cộng thêm độ tin cậy vận hành cao.

    Nhược điểm là sử dụng nhiều tài nguyên, khởi động và dừng lâu, không thuận tiện lắm khi phát triển các dự án nhỏ.

Việc lựa chọn bộ chứa servlet hoặc máy chủ ứng dụng nào tùy thuộc vào dự án cụ thể. Có những dự án mà ngay cả một người ngoài cuộc rõ ràng cũng có thể chứng tỏ bản thân với chất lượng cao nhất, nhưng lúc đầu, tốt hơn là bạn nên hiểu kỹ một điều. Có lẽ ứng cử viên lý tưởng cho vị trí này là Tomcat. Chúng tôi đã thực hiện những bước đầu tiên trong việc nghiên cứu nó và việc đó tùy thuộc vào bạn! Trong bài viết cuối cùng của loạt bài “Giới thiệu về Phát triển Doanh nghiệp”, chúng ta sẽ làm quen với mẫu MVC. Phần 7. Giới thiệu về 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