JavaRush /Blog Java /Random-VI /Từ Hello World đến Spring Web MVC và servlet có liên quan...
Viacheslav
Mức độ

Từ Hello World đến Spring Web MVC và servlet có liên quan gì đến nó

Xuất bản trong nhóm
Từ Hello World đến Spring Web MVC và servlet có liên quan gì - 1

Giới thiệu

Như chúng ta đã biết, thành công của Java đến chính xác nhờ vào sự phát triển của phần mềm cố gắng kết nối với mạng. Do đó, chúng tôi sẽ lấy ứng dụng bảng điều khiển thông thường “ Hello World ” làm cơ sở và hiểu những gì nó cần để trở thành một ứng dụng mạng từ ứng dụng bảng điều khiển. Vì vậy, trước tiên bạn cần tạo một dự án Java. Lập trình viên là những người lười biếng. Vào thời tiền sử, khi một số người đang săn voi ma mút, những người khác ngồi và cố gắng không bị nhầm lẫn trong toàn bộ các thư viện và cấu trúc thư mục Java. Để nhà phát triển có thể kiểm soát quá trình tạo ứng dụng, để anh ta có thể viết một cách đơn giản “Tôi muốn một thư viện của phiên bản 2 như vậy”, họ đã nghĩ ra các công cụ đặc biệt - xây dựng hệ thống. Hai cái nổi tiếng nhất là MavenGradle . Đối với bài viết này, chúng tôi sẽ sử dụng Gradle. Nếu trước đây chúng ta phải tự tạo cấu trúc thư mục thì bây giờ Gradle, sử dụng Gradle Init Plugin, cho phép chúng ta tạo một dự án Java với cấu trúc thư mục và lớp Main cơ sở trong một lệnh: gradle init --type java-application Lệnh này thực hiện khởi tạo (init) cho cho chúng tôi một ứng dụng Java (java-application ) với bảng điều khiển Hello World. Sau khi hoàn thành, một file sẽ xuất hiện trong thư mục - build.gradle . Đây là tập lệnh xây dựng của chúng tôi - nghĩa là một tập lệnh nhất định để tạo một ứng dụng có mô tả về những hành động cần được thực hiện cho việc này. Hãy mở nó và thêm dòng vào nó: jar.baseName = 'webproject' Gradle cho phép bạn thực hiện nhiều hành động khác nhau trong một dự án và những hành động này được gọi là task . Bằng cách thực thi một lệnh (tác vụ) một tệp JAR sẽ được tạo gradle buildtrong thư mục /build/libs . Và như bạn đã đoán, tên của nó bây giờ sẽ là webproject.jar . Nhưng nếu thực thi java -jar ./build/libs/webproject.jar, chúng ta sẽ gặp lỗi: no main manifest attribute. Điều này là do đối với một ứng dụng java, bạn cần đính kèm một bảng kê khai - đây là mô tả về cách làm việc với ứng dụng, cách nhận biết nó. Sau đó, JVM, sẽ thực thi ứng dụng java, sẽ biết lớp nào là điểm vào của chương trình và các thông tin khác (ví dụ: đường dẫn lớp). Nếu xem xét kỹ hơn nội dung của tập lệnh xây dựng, chúng ta sẽ thấy các plugin đang được kết nối. Ví dụ: apply plugin: 'java' Nếu chúng ta truy cập trang Gradle Java Plugin , chúng ta có thể thấy rằng chúng ta có thể định cấu hình tệp kê khai:
jar {
    manifest {
        attributes 'Main-Class': 'App'
    }
}
Lớp chính, điểm vào của chương trình, được tạo cho chúng tôi bởi Plugin Gradle Init. Và nó thậm chí còn được chỉ định trong tham số mainClassName. Nhưng điều này không phù hợp với chúng tôi, bởi vì... cài đặt này đề cập đến một plugin khác, Plugin ứng dụng Gradle . Như vậy, chúng ta đã có một ứng dụng Java hiển thị Hello World trên màn hình. Ứng dụng Java này được đóng gói trong JAR (Java ARchive). Nó đơn giản, dựa trên bảng điều khiển, không cập nhật. Làm thế nào để biến nó thành một ứng dụng web?
От Hello World до Spring Web MVC и при чём тут сервлеты - 2

API servlet

Để Java có thể hoạt động với mạng, một đặc tả có tên Servlet API đã xuất hiện từ xa xưa . Thông số kỹ thuật này mô tả sự tương tác giữa máy khách và máy chủ, nhận tin nhắn từ máy khách (ví dụ: trình duyệt) và gửi phản hồi (ví dụ: bằng văn bản của một trang). Đương nhiên, rất nhiều thứ đã thay đổi kể từ đó, nhưng vấn đề là để ứng dụng Java trở thành ứng dụng web, API Servlet sẽ được sử dụng. Để không suy đoán vô căn cứ, chúng ta hãy chọn chính đặc điểm kỹ thuật đó: JSR-000340 JavaTM Servlet 3.1 . Trước hết chúng ta quan tâm đến " Chương 1: Tổng quan ". Nó mô tả các khái niệm cơ bản mà chúng ta phải hiểu. Đầu tiên, servlet là gì? Chương " 1.1 Servlet là gì? " nói rằng Servlet là một thành phần Java được quản lý bởi một bộ chứa và tạo ra nội dung động. Giống như các thành phần Java khác, servlet là một lớp Java được biên dịch thành mã byte và có thể được tải vào máy chủ web bằng công nghệ Java. Điều quan trọng là các servlet tương tác với máy khách web (ví dụ: trình duyệt) trong khuôn khổ mô hình yêu cầu/phản hồi, được triển khai bởi Servlet Container. Hóa ra Servlets sống trong một loại Servlet Container nào đó. Cái này là cái gì? Trong chương " 1.2 Servlet Container là gì? " người ta nói rằng Servlet Container là một phần của máy chủ web hoặc máy chủ ứng dụng cung cấp các dịch vụ mạng thông qua đó các yêu cầu được gửi và phản hồi được gửi. Chính Servlet Container này quản lý vòng đời của các servlet. Tất cả các Bộ chứa Servlet được yêu cầu hỗ trợ giao thức HTTP ở mức tối thiểu, nhưng có thể hỗ trợ các giao thức khác. Ví dụ: HTTPS. Điều quan trọng nữa là Servlet Container có thể áp đặt bất kỳ hạn chế nào liên quan đến bảo mật đối với môi trường mà các servlet được thực thi. Điều quan trọng nữa là theo “ Tệp lưu trữ ứng dụng web 10.6 ”, ứng dụng web phải được đóng gói trong tệp WAR (Web ARchive). Nghĩa là, bây giờ chúng ta cần loại bỏ các plugin jar và ứng dụng của mình để làm việc khác. Và đây là plugin Gradle WAR . Và thay vì jar.baseName hãy chỉ định war.baseName Bởi vì Vì chúng tôi không còn sử dụng plugin jar nên chúng tôi cũng đã xóa cài đặt tệp kê khai. Khi chúng tôi khởi chạy JAR, Máy ảo Java (JVM) cần được thông báo qua bảng kê khai cách làm việc với ứng dụng của chúng tôi. Bởi vì JVM đang chạy nó. Rõ ràng, ứng dụng web được thực thi bởi một loại máy chủ web nào đó. Hóa ra bằng cách nào đó anh ấy cần phải nói cho anh ấy biết cách làm việc với ứng dụng web của chúng tôi? Và hóa ra là có. Các ứng dụng web có bản tuyên ngôn đặc biệt của riêng chúng. Nó được gọi là Bộ mô tả triển khai . Toàn bộ phần được dành riêng cho nó: “ 14. Bộ mô tả triển khai ”. Có một phần quan trọng: " Chương 10:". Nó nói về ứng dụng web là gì theo quan điểm của API Servlet. Ví dụ: trong chương " Cấu trúc thư mục 10.5 " nó chỉ ra vị trí của Bộ mô tả triển khai: /WEB-INF/web.xml. Nơi đặt WEB-INF? Như đã nêu trong plugin Gradle WAR, nó thêm một bố cục mới : src/main/webapp. Do đó, chúng ta hãy tạo một thư mục như vậy, bên trong chúng ta sẽ tạo một thư mục WEB-INF và bên trong chúng ta sẽ tạo một tệp web.xml. Điều quan trọng là thư mục đó được gọi là WEB-INF chứ không phải META-INF! Hãy sao chép nó từ ví dụ XML " 14.5.1 A Basic Ví dụ ":
От Hello World до Spring Web MVC и при чём тут сервлеты - 3
Như chúng ta có thể thấy, một tài liệu XML được sử dụng để cấu hình. Một tài liệu XML, để được coi là hợp lệ (Valid), phải tuân theo một số “lược đồ” nào đó. Bạn có thể coi đây là một loại giao diện cho một tài liệu XML. Lược đồ chỉ định những phần tử nào có thể có trong tài liệu XML, loại dữ liệu nào có thể xác định phần tử, thứ tự, yêu cầu và các khía cạnh khác. Ví dụ được sao chép từ tài liệu cho biết phiên bản 2.5 nhưng chúng tôi muốn sử dụng phiên bản 3.1. Đương nhiên, thông số kỹ thuật thay đổi khi các phiên bản thay đổi và các tính năng mới được thêm vào. Do đó, bạn cần sử dụng lược đồ khác với lược đồ được sử dụng cho phiên bản 2.5 (web-app_2_5.xsd). Tôi nên sử dụng sơ đồ nào cho phiên bản 3.1? Tài liệu sẽ giúp chúng ta điều này, chương “ 14.3 Bộ mô tả triển khai ”, trong đó nêu rõ specification is available at http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Nghĩa là, chúng ta cần thay thế liên kết đến lược đồ bằng xsd được chỉ định ở mọi nơi, không quên thay đổi nó version="2.5"thành 3.1 và cũng thay đổi không gian tên ở mọi nơi ( xmlns và trong xsi:schemaLocation). Chúng cho biết chúng ta sẽ làm việc trong không gian tên nào (nói một cách đơn giản là chúng ta có thể sử dụng tên thành phần nào). Nếu bạn mở tệp lược đồ, targetNamespace sẽ chứa cùng một không gian tên mà chúng ta nên chỉ định:
От Hello World до Spring Web MVC и при чём тут сервлеты - 4
Như chúng ta nhớ, trong Bản kê khai của tệp Jar, chúng ta đã viết lớp nào chúng ta muốn sử dụng. Phải làm gì đây? Ở đây chúng ta cần chỉ định lớp servlet nào chúng ta muốn sử dụng khi nhận được yêu cầu từ máy khách web. Bạn có thể đọc mô tả trong chương " 14.4 Sơ đồ mô tả triển khai ". Nó sẽ trông giống thế này:
От Hello World до Spring Web MVC и при чём тут сервлеты - 5
Mọi thứ đều đơn giản ở đây. Serverlet được khai báo và sau đó nó được ánh xạ tới một mẫu nhất định. Trong trường hợp này, trên /app. Khi mẫu được thực thi, phương thức servlet sẽ được thực thi. Để làm đẹp, lớp App nên được chuyển vào gói, không quên sửa cấu hình xml. Nhưng đó không phải là tất cả. Ứng dụng phải là một servlet. Trở thành một servlet có nghĩa là gì? Điều này có nghĩa là chúng ta phải kế thừa từ HttpServlet . Có thể xem một ví dụ trong chương " 8.1.1 @WebServlet ". Theo đó, lớp App của chúng ta sẽ trông như thế này:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class App extends HttpServlet {
    public String getGreeting() {
        return "Hello world.";
    }

	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		response.setContentType("text/html");
		try {
			response.getWriter().println(getGreeting());
		} catch (IOException e) {
			throw new IllegalStateException(e);
		}
	}
}
Nhưng dự án của chúng tôi vẫn chưa sẵn sàng. Bởi vì hiện tại chúng tôi phụ thuộc vào Servlet API phiên bản 3.1. Điều này có nghĩa là trong tập lệnh xây dựng, chúng tôi cần chỉ ra sự phụ thuộc vào API Servlet. JVM cần biết rằng những gì bạn viết trong mã là chính xác và cách sử dụng nó. Như chúng ta nhớ, đặc điểm kỹ thuật về cơ bản chỉ là các giao diện mô tả cách thức hoạt động của tất cả. Và việc triển khai nằm ở phía máy chủ web. Do đó, nếu không có Servlet API sẽ có phần Find the known Library trên Maven Central: javax.servlet-api . Và thêm một mục vào khối phụ thuộc . Trong kho lưu trữ Maven, như bạn đã thấy, nó có dòng chữ được cung cấp. Trước khi sử dụng phần phụ thuộc, bạn phải chỉ định phạm vi. Gradle không có phạm vi có tên là "được cung cấp", nhưng nó có phạm vi " chỉ biên dịch ". Vì vậy, chúng tôi sẽ chỉ ra: providedCompile 'javax.servlet:javax.servlet-api:3.1.0' Ugh, mọi thứ có vẻ ổn? Gradle Build sẽ xây dựng dự án của chúng ta thành một tệp WAR. Và chúng ta nên làm gì tiếp theo với nó? Đầu tiên, chúng ta cần một Máy chủ Web. Trong Google, chúng tôi viết “ danh sách java máy chủ web ” và xem danh sách các máy chủ web. Hãy chọn từ danh sách này, ví dụ: TomCat . Truy cập trang web Apache Tomcat , tải xuống phiên bản mới nhất (hiện tại là phiên bản 9) dưới dạng kho lưu trữ zip (nếu dành cho Windows). Giải nén nó vào một thư mục nào đó. Hoan hô, chúng tôi có một máy chủ web. Từ thư mục máy chủ web trong thư mục con bin , chúng tôi thực thi catalina từ dòng lệnh và xem các tùy chọn có sẵn. Chúng ta hãy làm: catalina start. Mỗi máy chủ web có một thư mục mà máy chủ web giám sát. Nếu một tệp ứng dụng web xuất hiện ở đó, máy chủ web sẽ bắt đầu cài đặt nó. Quá trình cài đặt này được gọi là triển khai hoặc triển khai . Vâng vâng, đó là lý do tại sao " bộ mô tả triển khai ". Tức là làm thế nào để triển khai ứng dụng đúng cách. Trong Tomcat thư mục này là webapps . Hãy sao chép cuộc chiến mà chúng tôi đã thực hiện bằng cách sử dụng gradle build ở đó. Sau này, trong nhật ký chúng ta sẽ thấy nội dung như: Deployment of web application archive [tomcat\webapps\webproject.war] has finished in [время] ms Để hiểu rõ hơn nữa, trong thư mục Tomcat, chúng ta sẽ chỉnh sửa tệp \conf\tomcat-users.xml, thêm các dòng sau:
От Hello World до Spring Web MVC и при чём тут сервлеты - 6
Bây giờ chúng ta khởi động lại máy chủ (dừng catalina, bắt đầu catalina) và đi đến địa chỉ http://127.0.0.1:8080/manager Ở đây chúng ta sẽ thấy đường dẫn của tất cả các ứng dụng. Dự án web của chúng tôi rất có thể đã được cung cấp đường dẫn /webproject. Con đường này là gì? Đặc tả trong chương " 10.1 Ứng dụng web trong máy chủ web " nêu rõ rằng một ứng dụng web được liên kết với một số đường dẫn trong ứng dụng (trong trường hợp này là /webproject). Tất cả các yêu cầu thông qua đường dẫn này sẽ được liên kết với cùng một ServletContext. Đường dẫn này còn được gọi là contextRoot . Và theo " 10.2 Mối quan hệ với ServletContext " thùng chứa servlet liên kết ứng dụng web và ServletContext một với một. Tức là mỗi ứng dụng web đều có ServletContext riêng. ServletContext là gì ? Như đặc tả nêu rõ, ServletContext là một đối tượng cung cấp cho các servlet một “chế độ xem ứng dụng ” mà chúng đang chạy trong đó. Bối cảnh Servlet được mô tả chi tiết hơn trong Chương 4 của đặc tả API Servlet. Điều đáng ngạc nhiên là API Servlet trong phiên bản 3.1 không còn yêu cầu phải có web.xml nữa. Ví dụ: bạn có thể xác định một servlet bằng các chú thích:
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("/app2")
public class App2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.getWriter().println("app2");
    }
}
Cũng được đề xuất về chủ đề: " Phỏng vấn Java EE - API JEE Servlet (Hỏi đáp) ". Vì vậy, chúng ta có một Servlet - nó chịu trách nhiệm đưa ra phản hồi nào cho máy khách web. Chúng tôi có một ServletContainer nhận yêu cầu từ người dùng, khớp với đường dẫn được truy cập với đường dẫn đến servlet và nếu tìm thấy kết quả khớp, sẽ thực thi Servlet. Khỏe. Mùa xuân chiếm vị trí nào trong bức tranh thế giới này ?

MVC mùa xuân

Tuyệt vời, chúng tôi có một ứng dụng web. Bây giờ chúng ta cần kết nối Spring. Làm thế nào chúng ta có thể làm điều này? Trước tiên, bạn cần tìm ra cách kết nối Spring với dự án của mình một cách chính xác. Hóa ra trước đó có thể thực hiện việc này theo tài liệu của dự án nền tảng Spring , nhưng bây giờ “ Nền tảng sẽ hết thời gian hỗ trợ vào ngày 9 tháng 4 năm 2019 ”, tức là không nên làm như vậy sử dụng nó, bởi vì nó sẽ sớm không còn được hỗ trợ nữa. Lối thoát duy nhất là " Người dùng Nền tảng được khuyến khích bắt đầu sử dụng tính năng quản lý phụ thuộc của Spring Boot ". Vì vậy, chúng ta hãy chuyển sang tài liệu Spring Boot . Hãy để tôi làm rõ rằng chúng tôi không sử dụng Spring Boot mà chỉ sử dụng Dependency Management từ Spring Boot. Tức là dự án Spring Boot có thể cung cấp kiến ​​thức về phiên bản nào của thư viện sẽ sử dụng (bao gồm cả Spring MVC). Ở đó chúng ta sẽ tìm thấy 3.2. Sử dụng quản lý phụ thuộc của Spring Boot một cách riêng biệt . Theo tài liệu, hãy thêm phần sau vào tập lệnh xây dựng:
plugins {
    id 'org.springframework.boot' version '2.0.4.RELEASE' apply false
}
apply plugin: 'io.spring.dependency-management'
dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}
Như bạn có thể thấy, chúng tôi đã chỉ ra apply false, tức là Bản thân chúng tôi không sử dụng Spring Boot mà sử dụng tính năng quản lý phụ thuộc từ đó. Việc quản lý phụ thuộc này còn được gọi là BOM - " Bill Of Materials ". Bây giờ chúng ta đã sẵn sàng kết nối chính dự án Spring Web MVC. Spring Web MVC là một phần của dự án Spring Framework và chúng ta quan tâm đến phần " Web Servlet ". Hãy thêm phần phụ thuộc vào tập lệnh xây dựng: compile 'org.springframework:spring-webmvc'. Như chúng ta có thể thấy, chúng ta thiết lập biên dịch phạm vi, bởi vì máy chủ web không cung cấp cho chúng tôi Spring. Dự án của chúng ta buộc phải đưa thư viện Spring vào bên trong chính nó. Tiếp theo, điều quan trọng là chúng ta phải đọc phần " 1.2. DispatcherServlet ", trong đó nói rằng Spring MVC được xây dựng xung quanh mẫu " Front Controller ", trong đó có một số loại servlet trung tâm cung cấp cấu hình và ủy quyền cho các thành phần khác . Người điều phối có thể được dịch là người điều phối. Vì vậy, trước hết trong web.xml chúng ta khai báo:
От Hello World до Spring Web MVC и при чём тут сервлеты - 7
Như chúng ta có thể thấy, đây thực sự là một Listener thông thường được xác định trong đặc tả API Servlet. Nói chính xác hơn thì đây là một ServletContextListener, tức là nó được trigger để khởi tạo Servlet Context cho ứng dụng web của chúng ta. Tiếp theo, bạn cần chỉ định một cài đặt sẽ cho Spring biết vị trí của cấu hình xml đặc biệt với các cài đặt:
От Hello World до Spring Web MVC и при чём тут сервлеты - 8
Như bạn có thể thấy, đây chỉ là một cài đặt thông thường được lưu trữ ở cấp Servlet Context, nhưng sẽ được Spring sử dụng khi khởi tạo Application Context. Bây giờ bạn cần khai báo, thay vì tất cả các servlet, một bộ điều phối duy nhất sẽ phân phối tất cả các yêu cầu khác.
От Hello World до Spring Web MVC и при чём тут сервлеты - 9
Và không có phép thuật ở đây. Nếu chúng ta nhìn, thì đó là một HttpServlet, nơi Spring thực hiện rất nhiều thứ để biến nó thành một khung công tác. Tất cả những gì còn lại là tương quan (ánh xạ) một mẫu URL cụ thể với servlet:
От Hello World до Spring Web MVC и при чём тут сервлеты - 10
Mọi thứ vẫn giống như chúng tôi đã làm trước đây. Bây giờ hãy tạo thứ gì đó mà máy chủ web của chúng ta sẽ hiển thị. Ví dụ: hãy tạo một thư mục con pages trong WEB-INF của chúng ta và sẽ có một tệp hello.jsp. Nội dung có thể là nguyên thủy nhất. Ví dụ: bên trong thẻ html có thẻ h1 với dòng chữ " Hello World ". Và đừng quên tạo tệp applicationContext.xmlmà chúng tôi đã chỉ định trước đó. Hãy lấy một ví dụ từ tài liệu Spring: " 1.10.3. Tự động phát hiện các lớp và đăng ký định nghĩa đậu ".
От Hello World до Spring Web MVC и при чём тут сервлеты - 11
Bởi vì Chúng tôi kích hoạt tính năng tự động phát hiện theo cách này, giờ đây chúng tôi có thể tạo 2 lớp (chúng sẽ được coi là Spring Beans do sử dụng các chú thích Spring đặc biệt), Spring hiện sẽ tự tạo và tùy chỉnh ứng dụng của chúng tôi với sự trợ giúp của chúng:
  1. Cấu hình web ví dụ cấu hình kiểu Java:

    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/pages/", ".jsp");
        }
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }

    Ví dụ này được mô tả trong tài liệu Spring Framework: " 1.11. MVC Config ".

    Ở đây chúng tôi đăng ký ViewResolver, nó sẽ giúp xác định vị trí của các trang jsp. Phương pháp thứ hai đảm bảo rằng " Default servlet " được bật.

    Bạn có thể đọc thêm về vấn đề này tại đây: " Sự cần thiết và cách sử dụng của default-servlet-handler là gì ".

  2. Bộ điều khiển HelloController để mô tả ánh xạ các yêu cầu tới một JSP cụ thể

    @Controller
    public class HelloController {
        @GetMapping("/hello")
        public String handle(Model model) {
            return "hello";
        }
    }

    Ở đây chúng tôi đã sử dụng chú thích @Controller được mô tả trong tài liệu ở chương " 1.4. Bộ điều khiển được chú thích ".

Bây giờ, khi ứng dụng của chúng ta được triển khai, khi chúng ta gửi yêu cầu /webproject/hello(trong đó /webproject là gốc ngữ cảnh), DispatcherServlet sẽ được xử lý trước tiên. Anh ta, với tư cách là người điều phối chính, sẽ xác định rằng chúng ta /* khớp với yêu cầu hiện tại, điều đó có nghĩa là DispatcherServlet phải làm điều gì đó. Sau đó, nó sẽ đi qua tất cả các ánh xạ mà nó tìm thấy. Nó sẽ thấy rằng có một HelloController với phương thức xử lý được ánh xạ tới /hello và sẽ thực thi nó. Phương thức này sẽ trả về văn bản "xin chào". Văn bản này sẽ được ViewResolver nhận, nó sẽ cho máy chủ biết nơi tìm các tệp jsp cần được hiển thị cho máy khách. Vì vậy, khách hàng cuối cùng sẽ nhận được trang rất được yêu thích đó.

Phần kết luận

Tôi hy vọng bài viết sẽ làm rõ rằng từ “bối cảnh” không đáng sợ. Thông số kỹ thuật đó hóa ra rất hữu ích. Và tài liệu là bạn của chúng ta, không phải kẻ thù của chúng ta. Tôi hy vọng sẽ rõ ràng Spring dựa trên cái gì, nó kết nối như thế nào và API Servlet có liên quan gì với nó.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION