CodeGym/Blog Java/Ngẫu nhiên/Phần 6. Bộ chứa Servlet
John Squirrels
Mức độ
San Francisco

Phần 6. Bộ 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. Bộ chứa Servlet - 1Trong bài viết trước, chúng ta đã làm quen với servlet và học cách sử dụng chúng để tạo các ứng dụng web. Đã đến lúc xem xét kỹ hơn một phần thiết yếu của niềm vui này: các thùng chứa servlet.

Mục lục:

Bộ chứa servlet là gì?

Nó 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ột máy chủ, trước tiên chúng ta sẽ triển khai một bộ chứa servlet và sau đó đặt các servlet vào đó. Quy trình làm việc rất đơn giản: khi máy khách truy cập vào máy chủ, bộ chứa sẽ xử lý yêu cầu của nó, xác định servlet nào sẽ xử lý yêu cầu đó, sau đó chuyển yêu cầu theo. Phần 6. Bộ chứa Servlet - 2

Các thùng chứa servlet được sử dụng như thế nào?

Ngoài các yêu cầu định tuyến, một thùng chứa servlet thực hiện các chức năng khác:
  1. Nó tự động tạo các trang HTML từ các tệp JSP.
  2. Nó mã hóa/giải mã các tin nhắn HTTPS.
  3. Nó cung cấp quyền truy cập hạn chế cho quản trị servlet.
Nói chung, tất cả điều này nghe có vẻ tốt. Bây giờ chúng ta chỉ cần tìm ra cách đưa tất cả vào thực tế. Chà, để học cách sử dụng một cái gì đó, chỉ cần lao vào và cố gắng sử dụng nó :) Vì 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à có thể được sử dụng miễn phí. Tải xuống Tomcat cho hệ điều hành của bạn tại đây và chúng ta sẽ khám phá cách làm việc với các vùng chứa "đang hoạt động".

Cài đặt và khởi động Tomcat

  1. Để cài đặt Tomcat, chỉ cần giải nén tệp 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 Java phiên bản 8 trở lên để bắt đầu và chạy. Xác minh rằng biến môi trường Java_HOME tham chiếu phiên bản hiện tại của JDK.

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

    Có bốn vai trò cài sẵn trong Tomcat:

    • manager-gui — Truy cập vào giao diện đồ họa và trang trạng thái
    • manager-script — 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
    • manager-status — Chỉ truy cập vào trang trạng thái

    Bên trong thẻ <tomcat-users>, chúng tôi chỉ định rõ ràng các vai trò này và gán chúng cho người dùng của chúng tôi:

    <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 chạy!

  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. Bạn sẽ thấy một bảng điều khiển đồ họa:

    Phần 6. Bộ chứa Servlet - 3

    Nếu bạn thấy một menu như thế này, nghĩa là Tomcat đang chạy.

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

    • JAVA_HOME — Điều này phải tham chiếu đến phiên bản hiện tại của Java 8+.
    • CATALINA_BASE — Điều này phải tham chiếu đến Tomcat hoặc vắng mặt (không nên tham chiếu đến phiên bản Tomcat khác).

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

Chúng tôi đã quản lý để khởi chạy Tomcat, vì vậy đã đến lúc triển khai một số dự án trong đó. Hãy sử dụng các servlet từ bài viết trước . Servlet chính:
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();
   }
}
Chỉ mụcServlet:
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, chúng tôi cần đóng gói các servlet của mình trong tệp WAR. Maven thường được sử dụng để làm điều này, nhưng để tạo tệp WAR, bạn cần có tệp web.xml có ánh xạ cho tất cả các servlet. Chúng tôi đã sử dụng chú thích @WebServlet mới để viết các servlet, vì vậy chúng tôi không có tệp 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, gói dự án của chúng tôi trong một tệp WAR. Để thực hiện việc này, hãy mở cấu trúc dự án (Ctrl+Shift+Alt+S) -> Tạo phẩm -> Chọn tệp WAR mong muốn -> Chọn hộp kiểm bên cạnh "Bao gồm trong bản dựng dự án" -> Nhấp vào "OK". Phần 6. Bộ chứa Servlet - 4Hãy xây dựng dự án bằng tổ hợp phím Ctrl+F9. Bây giờ tệp WAR của chúng tôi nằm trong thư mục đích. Phần 6. Bộ chứa Servlet - 5Tệp có thể được đổi tên thành một 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, ví dụ: C:\\my\\.chúng tôi sẽ đặt nó trong một thùng chứa . Có hai cách để làm điều này.
  1. Sử dụng giao diện đồ họa

    Để thực hiện việc này, hãy theo liên kết sau: http://localhost:8080/manager/html . Tomcat nên yêu cầu tên người dùng và mật khẩu.

    Nếu bạn đã theo dõi tôi cho đến thời điểm này, thì tên người dùng là "người dùng" và mật khẩu là "mật khẩu" .

    Sau khi đăng nhập thành công, bạn sẽ thấy Tomcat Web Application Manager. Phần "Ứng dụng" đã có sẵn 5 ứng dụng — đây là các tiện ích của Tomcat, giúp Tomcat dễ làm việc hơn. Chúng có thể bị xóa trong tương lai.

    Phần 6. Bộ chứa Servlet - 6

    Dưới đây là phần "Triển khai". Tại đây, bạn có thể chọn kho lưu trữ WAR để triển khai. Hãy nhập đường dẫn và ngữ cảnh theo cách thủ công:

    Phần 6. Bộ chứa Servlet - 7

    Nhấp vào "Triển khai" và chúng tôi thấy rằng ứng dụng của chúng tôi đã xuất hiện trong phần "Ứng dụng":

    Phần 6. Bộ chứa Servlet - 8Sử dụng giao diện đồ họa của Tomcat, chúng tôi có thể dừng, khởi động lại và xóa phiên cũng như đặt thời lượng phiên. Khi triển khai, chúng tôi đã chỉ định bối cảnh /demo, có nghĩa là ứng dụng của chúng tôi được truy cập bằng cách sử dụng http://localhost:8080/demo . Kiểm tra nó. Mọi thứ nên hoạt động.

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

    Để triển khai ứng dụng theo cách này, bạn cần mở thư mục chứa Tomcat đã được giải nén. Sau đó chuyển đến thư mục "ứng dụng web". Tại đây, bạn sẽ tìm thấy các tiện ích mà chúng tôi đã gặp phải:

    Phần 6. Bộ chứa Servlet - 9

    Tất cả những gì cần thiết là chúng tôi di chuyển tệp servlet.war của mình đến đây.

    Chúng tôi đợi vài giây và sau đó thấy rằng một thư mục "servlet" mới đã xuất hiện. Điều này có nghĩa là ứng dụng của chúng ta đã được triển khai. Chuyển đến giao diện Trình quản lý ứng dụng tại 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. Bộ chứa Servlet - 10

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

    Như bạn có thể thấy, việc triển khai các ứng dụng trong Tomcat dễ dàng hơn nhiều so với vẻ ngoài của nó. Nhưng các chức năng khác của nó cũng dễ sử dụng. Hãy kiểm tra.

Sử dụng HTTPS thay vì HTTP

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

Tạo chứng chỉ

Bất kể phiên bản nào, JDK bao gồm một số lượng lớn các tiện ích. Một trong số đó là keytool . Đây là một công cụ để tạo và làm việc với các khóa mã hóa. Để sử dụng nó, trên dòng lệnh, hãy chuyển đến thư mục C:\\Program Files\\Java\\jdk1.8.0_181\\bin và chạy lệnh keytool -genkey -alias tomcat -keyalg RSA .
  • keytool — Tên của tiện ích mà chúng tôi đang chạy với các tùy chọn dòng lệnh
  • -genkey — Cho biết rằng 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, tiện ích bắt đầu đối thoại với chúng tôi: Phần 6. Bộ chứa Servlet - 11Nhập 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, đây 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ẽ phàn nàn. Chứng chỉ như vậ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 cần sử dụng chứng chỉ từ cơ quan cấp chứng chỉ (ví dụ: https://letsencrypt.org/ ).

Cấu hình máy chủ

Bây giờ chứng chỉ đã sẵn sàng, chúng ta cần điều chỉnh cài đặt máy chủ, cụ thể là trình kết nối SSL. Điều này được thực hiện trong tệp server.xml, nằm trong apache-tomcat-9.0.30/conf/ . Trong đó, chúng tôi tìm thấy các khối như thế này:
<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à chúng tôi đặt cấu hình của mình bên cạnh chúng:
<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 gán các giá trị mới nhất cho các tham số keystoreFile và keystorePass, lưu tệp rồi khởi động lại Tomcat bằng cách sử dụng các tệp shutdown.bat và startup.bat. Bây giờ máy chủ đã sẵn sàng xử lý các yêu cầu HTTPS. Địa chỉ đã thay đổi một chút: https://localhost:8443/demo/hello . Khi nhấp vào liên kết, bạn sẽ nhận được cảnh báo về độ tin cậy của chứng chỉ, điều này không có gì đáng ngạc nhiên. Như chúng tôi đã nói trước đó một chút, bạn cần sử dụng dịch vụ của một trong các cơ quan cấp chứng chỉ để có được chứng chỉ thông thường. Nhưng hiện tại, chúng tôi đã đạt được mục tiêu của mình: ứng dụng chạy bằng giao thức HTTPS và điều đó rất quan trọng!

Tự động tạo các trang HTML

Bây giờ chúng ta sẽ tiếp tục tổng quan về các bộ chứa servlet bằng cách xem xét một tính năng khác: tạo các trang HTML động. Hãy tưởng tượng một thế giới hoàn hảo, nơi thay vì mã HTML tĩnh nhàm chán, bạn có thể viết mã Java, 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ó thể tưởng tượng nó? Tin tốt là có một cái gì đó tương tự tồn tại. Tin xấu là nó không hoàn toàn đạt được điều tưởng tượng này. Nếu bạn chưa đoán ra, thì chúng ta đang nói về JavaServer Pages (JSP). 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ã Java này vẫn được chuyển đổi thành HTML trước khi nó được gửi tới máy khách, nhưng HTML đó sẽ được tạo động, có tính đến các yếu tố khác nhau. Ví dụ, bạn có thể sử dụng các câu điều kiện và trả về 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. Vào cuối ngày, bài viết này không phải là về JSP — chúng tôi ở đây để nói về các bộ chứa servlet! Vậy tại sao chúng tôi lại đề cập đến JSP? Thật đơn giản: một thùng chứa servlet là thứ chuyển đổi mã Java từ JSP sang HTML. Khi một servlet sẽ trả về nội dung JSP dưới dạng phản hồi, vùng chứa sẽ lưu ý và trước tiên chuyển đổi nội dung đó thành một trang HTML thân thiện với trình duyệt trước khi gửi nội dung đó tới máy khách. Ngày nay, có nhiều công nghệ tương tự với công nghệ JSP — Thymeleaf, FreeMarket, Mustache, và những thứ khác. Tất cả họ đều làm việc trong một thời trang tương tự. Lựa chọn nào trong số chúng cho công việc của bạn 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ụ này, chúng tôi đã sử dụng Tomcat, vùng chứa phổ biến nhất nhưng một số dự án sử dụng các vùng chứa khác. Thật đáng để xem xét ngắn gọn những cái phổ biến nhất và xem xét chúng khác với Tomcat như thế nào.

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

  1. GlassFish là một bộ chứa mã nguồn mở được Oracle hỗ trợ phát triển.

    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ể hoạt động với các thành phần khác từ khung công tác JavaEE. Điều đó nói rằng, nó sử dụng nhiều RAM hơn. Có tính linh hoạt cao hơn khi tinh chỉnh máy chủ, điều này làm phức tạp việc sử dụng nó. Nó nên được sử dụng khi phát triển các ứng dụng trên khung công tác JavaEE.

  2. WildFly trước đây được gọi là JBoss . Nó cũng là mã nguồn mở. Nó được phát triển bởi RedHat. 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 — JBoss Enterprise Application Platform.

    Giống như GlassFish, WildFly là một máy chủ web chính thức. Ngẫu nhiê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ấu hình hơn.

  3. Cầu tàu , giống như những cái trước, là mã nguồn mở. Nó đượ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ợ cho 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 nhanh chóng và mở rộng quy mô tốt. Không giống như Tomcat, nó có một cộng đồng và cơ sở tri thức nhỏ hơn.

  4. WebLogic là phần mềm được cấp phép phải được mua trước khi sử dụng. Nó thuộc về Oracle.

    Nó có chức năng rộng hơn một chút so với Tomcat. Nó có thể hoạt động với giao thức FTP. Nhưng nó không linh hoạt như vậy khi phát triển và thử nghiệm các ứng dụng.

  5. WebSphere (chính xác là Máy chủ ứng dụng WebSphere) là phần mềm trả phí. Nó đượ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 hoàn chỉnh. Nhưng nó có giao diện cấu hình thân thiện hơn, cộng với độ tin cậy cao khi vận hành.

    Những thiếu sót của nó bao gồm thực tế là nó sử dụng nhiều tài nguyên và mất nhiều thời gian để bắt đầu và dừng lại, điều này 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 phù hợp phụ thuộc vào dự án cụ thể. Có những dự án mà ngay cả một kẻ kém cỏi rõ ràng cũng có thể chứng tỏ là một lựa chọn tuyệt vời, nhưng trước tiên, tốt nhất bạn nên thực hiện một nghiên cứu chuyên sâu về một thùng chứa servlet. Tomcat có lẽ là ứng cử viên hoàn hảo cho nghiên cứu này. Và chúng tôi đã thực hiện những bước đầu tiên trong việc nghiên cứu nó, nhưng từ đây, điều đó tùy thuộc vào bạn! Trong phần cuối của loạt bài "Giới thiệu về phát triển doanh nghiệp", chúng ta sẽ tìm hiểu về mẫu MVC. Phần 7. Giới thiệu mẫu MVC (Model-View-Controller)
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào