JavaRush /Blog Java /Random-VI /Ứng dụng web bằng Java
Viacheslav
Mức độ

Ứng dụng web bằng Java

Xuất bản trong nhóm
Ứng dụng web bằng Java - 1

Giới thiệu

Ngày xửa ngày xưa, Java đã củng cố vị thế của mình nhờ ưu tiên ứng dụng web. Kể từ những ngày đầu, Java đã phải vật lộn để tìm đường đi. Đầu tiên, tôi đề xuất các applet. Điều này đã mang lại nhiều cơ hội cho các nhà phát triển tạo nội dung động trên các trang HTML tĩnh. Tuy nhiên, các applet không đáp ứng được mong đợi vì nhiều lý do: bảo mật, chi phí chung và những lý do khác. Sau đó, các nhà phát triển ngôn ngữ Java đã đề xuất một giải pháp thay thế - API Servlet . Và hóa ra đó là quyết định đúng đắn. API Servlet là đặc tả mà bất kỳ ứng dụng web Java nào được xây dựng, có thể là ứng dụng dựa trên web hoặc dịch vụ web trả về thông tin theo yêu cầu. Do đó, con đường hiểu cách hoạt động của các ứng dụng web Java bắt đầu bằng việc hiểu API Servlet.
Ứng dụng web bằng Java - 2

API servlet

Vì vậy, API Servlet là thứ mà các nhà phát triển ngôn ngữ cung cấp cho các nhà phát triển Java. API Servlet là một đặc tả sẽ trả lời các câu hỏi chính của chúng tôi. Bạn có thể tìm thấy nó ở đây: " Bản phát hành cuối cùng của JSR-000340 JavaTM Servlet 3.1 để đánh giá ". Chương " 1.1 Servlet là gì? " nói rằng servlet là một thành phần web dựa trên công nghệ Java tạo ra nội dung động (tức là nội dung). "Dựa trên Java" có nghĩa là servlet là một lớp Java được biên dịch thành mã byte . Servlet được quản lý bởi một thùng chứa servlet, đôi khi được gọi là Servlet Engine. Bộ chứa servlet là một phần mở rộng của máy chủ web cung cấp chức năng servlet. Đổi lại, các servlet cung cấp sự tương tác với máy khách theo mô hình yêu cầu/phản hồi, được triển khai bởi bộ chứa servlet. Trong chương " 1.2 Thùng chứa Servlet là gì? " người ta nói rằng thùng chứa servlet 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 và phản hồi được gửi đi, các yêu cầu và phản hồi dựa trên MIME được tạo và xử lý . Ngoài ra, các thùng chứa servlet quản lý vòng đời của các servlet (tức là quyết định thời điểm tạo chúng, xóa chúng, v.v.). Tất cả các thùng chứa servlet phải hỗ trợ giao thức HTTP để nhận yêu cầu và gửi phản hồi. Ở đây tôi muốn nói thêm rằng MIME là một tiêu chuẩn, một đặc tả cho biết thông tin phải được mã hóa như thế nào và các tin nhắn được định dạng như thế nào để chúng có thể được gửi qua Internet.
Ứng dụng web bằng Java - 3

Máy chủ web

Máy chủ web là máy chủ chấp nhận các yêu cầu HTTP từ máy khách và cung cấp cho chúng phản hồi HTTP (thường cùng với trang HTML, hình ảnh, tệp hoặc dữ liệu khác). Tài nguyên được yêu cầu được xác định bằng URL. Một trong những máy chủ web phổ biến nhất có hỗ trợ API Servlet là Apache Tomcat . Hầu hết các máy chủ web đều là những cỗ máy phức tạp được tạo thành từ nhiều thành phần khác nhau, mỗi thành phần thực hiện các chức năng cụ thể. Ví dụ:
Ứng dụng web bằng Java - 4

Đầu nối

— Ở đầu vào, chúng ta có Trình kết nối (tức là trình kết nối) chấp nhận các yêu cầu đến từ khách hàng. Trình kết nối HTTP trong Tomcat được triển khai bằng thành phần "Coyote". Trình kết nối nhận dữ liệu từ máy khách và chuyển dữ liệu đó tới Công cụ Tomcat. Ngược lại, Servlet Container - Tomcat Engine xử lý yêu cầu nhận được từ máy khách bằng cách sử dụng thành phần "Catalina", là một thùng chứa servlet. Xem tài liệu Tomcat: " Tổng quan về kiến ​​trúc " để biết thêm chi tiết. Có các máy chủ web khác hỗ trợ đặc tả API Servlet. Ví dụ: " Jetty " hoặc " Undertow ". Kiến trúc của chúng tương tự nhau nên hiểu nguyên tắc làm việc với một thùng chứa servlet, bạn có thể chuyển sang làm việc với một thùng chứa servlet khác.
Ứng dụng web bằng Java - 5

Ứng dụng web

Vì vậy, để chạy một ứng dụng web, chúng ta cần một máy chủ web hỗ trợ API Servlet (nghĩa là một máy chủ có thành phần mở rộng triển khai hỗ trợ API Servlet cho máy chủ web). Khỏe. Dù sao thì ứng dụng web là gì? Theo chương " 10 ứng dụng web " của đặc tả API Servlet, ứng dụng Web là tập hợp các servlet, trang HTML, lớp và các tài nguyên khác tạo nên ứng dụng cuối cùng trên máy chủ Web. Theo chương " Tệp lưu trữ ứng dụng web 10.6 ", một ứng dụng web có thể được đóng gói trong Web ARchive (một kho lưu trữ có phần mở rộng WAR). Như đã nêu trên trang " Glossary-219 ":
Ứng dụng web bằng Java - 6
Tức là WAR được tạo ra thay vì JAR để thể hiện rằng đây là một ứng dụng web. Thực tế quan trọng tiếp theo: chúng ta phải có một cấu trúc thư mục nhất định trong kho lưu trữ WAR của mình. Trong đặc tả API Servlet ở chương " Cấu trúc thư mục 10.5 ". Chương này nói rằng có một thư mục đặc biệt tên là "WEB-INF". Thư mục này đặc biệt ở chỗ nó không hiển thị với máy khách và không được hiển thị trực tiếp cho nó, nhưng nó có thể truy cập được bằng mã servlet. Nó cũng cho biết thư mục WEB-INF có thể chứa những gì:
Ứng dụng web bằng Java - 7
Từ toàn bộ danh sách này, hiện tại chúng tôi không biết và không hiểu mục về một số tệp web.xml có tên là bộ mô tả triển khai . Nó là gì? Chương " 14. Bộ mô tả triển khai " được dành cho bộ mô tả triển khai. Nói tóm lại, bộ mô tả triển khai là một tệp xml mô tả cách triển khai (nghĩa là chạy) ứng dụng web của chúng tôi trên máy chủ web. Ví dụ: bộ mô tả triển khai cho biết URL nào sẽ được sử dụng để truy cập vào ứng dụng của chúng tôi, cài đặt bảo mật liên quan đến ứng dụng của chúng tôi, v.v. được chỉ định. Chương " 14.2 Quy tắc xử lý triển khai " nói rằng web.xml sẽ được xác thực lược đồ trước khi ứng dụng của chúng tôi được định cấu hình và khởi chạy (nghĩa là sẽ kiểm tra xem nội dung của web.xml có được viết chính xác theo lược đồ không) . Và trong chương " 14.3 Deployment Descriptor " có chỉ ra rằng sơ đồ ở đây: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Nếu nhìn vào nội dung của tệp, chúng ta có thể thấy:
Ứng dụng web bằng Java - 8
Lược đồ được sử dụng cho các tệp XML là gì? Các lược đồ chỉ ra cách điền chính xác vào một tài liệu XML: những phần tử nào có thể được sử dụng, loại dữ liệu nào có thể được chỉ định trong các phần tử, các phần tử nên đi theo thứ tự nào, những phần tử nào được yêu cầu, v.v. Bạn có thể so sánh lược đồ của một tài liệu XML với một giao diện trong Java, vì lược đồ trong Java cũng chỉ định cách viết các lớp thỏa mãn một giao diện nhất định (nghĩa là triển khai một giao diện nhất định). Vì vậy, chúng ta đã trang bị kiến ​​thức bí mật và sẵn sàng tạo ứng dụng web đầu tiên của mình!
Ứng dụng web bằng Java - 9

Tạo một ứng dụng web

Thật khó để tưởng tượng làm việc với một ứng dụng Java hiện đại mà không sử dụng hệ thống xây dựng dự án tự động. Một số hệ thống phổ biến nhất là Maven và Gradle . Chúng tôi sẽ sử dụng Gradle cho bài đánh giá này. Việc cài đặt Gradle được mô tả trên trang web chính thức . Để tạo một ứng dụng mới, chúng ta cần một plugin được tích hợp sẵn trong Gradle: " Build Init Plugin ". Để tạo một ứng dụng Java, bạn cần chạy lệnh sau: gradle init --type java-application
Ứng dụng web bằng Java - 10
Sau khi tạo dự án, chúng ta sẽ cần chỉnh sửa file build.gradle . Đây được gọi là Build Script (để biết thêm chi tiết, hãy xem tài liệu Gradle: " Viết Build Scripts "). Tệp này mô tả cách tập hợp dự án và các khía cạnh khác khi làm việc với dự án Java. Khối plugin mô tả " plugin Gradle " nào sẽ được sử dụng cho dự án Gradle hiện tại. Plugin mở rộng khả năng của dự án của chúng tôi. Ví dụ: plugin mặc định là " java ". Plugin này luôn được sử dụng nếu chúng tôi cần hỗ trợ Java. Nhưng chúng tôi không cần plugin “ ứng dụng ”, bởi vì... mô tả của nó nói rằng nó được sử dụng để tạo một "ứng dụng JVM có thể thực thi", tức là. chạy các ứng dụng JVM. Chúng ta cần tạo một ứng dụng Web ở dạng kho lưu trữ WAR. Và nếu tìm từ WAR trong tài liệu Gradle, chúng ta sẽ tìm thấy “ War Plugin ”. Do đó, chúng tôi sẽ chỉ định các plugin sau:
plugins {
    id 'java'
    id 'war'
}
Ngoài ra, trong " Cài đặt mặc định của plugin War " người ta nói rằng thư mục chứa tất cả nội dung của ứng dụng web phải là "src/main/webapp", nên có cùng thư mục WEB-INF trong đó web.xml phải có xác định vị trí. Hãy tạo một tập tin như vậy. Chúng ta sẽ điền nó sau một chút, bởi vì... chúng tôi chưa có đủ thông tin cho việc này. Trong khối "phụ thuộc", chúng tôi chỉ ra các phụ thuộc của dự án của chúng tôi, nghĩa là các thư viện/khuôn khổ đó mà ứng dụng của chúng tôi không thể hoạt động nếu không có. Trong trường hợp này, chúng ta đang viết một ứng dụng web, có nghĩa là chúng ta không thể làm việc nếu không có API Servlet:
dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testCompile 'junit:junit:4.12'
}
cung cấpCompile có nghĩa là phần phụ thuộc không cần phải được đưa vào kho lưu trữ WAR của ứng dụng web của chúng tôi: nó chỉ cần để biên dịch. Và khi được thực thi, sự phụ thuộc này sẽ được cung cấp bởi người khác (tức là máy chủ web). Chà, chúng tôi để lại thông tin trong tập lệnh xây dựng về kho lưu trữ phụ thuộc nào chúng tôi muốn sử dụng - tất cả các phụ thuộc được chỉ định sẽ được tải xuống từ đó:
repositories {
    jcenter()
}
Chúng tôi xóa mọi thứ khác khỏi tệp tập lệnh xây dựng. Bây giờ hãy chỉnh sửa lớp src\main\java\App.java. Hãy tạo một servlet từ nó. Đặc tả API Servlet trong chương " CHƯƠNG 2. Giao diện Servlet " nói rằng Giao diện Servlet có triển khai cơ bản là HttpServlet , điều này là đủ trong hầu hết các trường hợp và các nhà phát triển chỉ cần kế thừa từ nó. Và trong chương " 2.1.1 Phương pháp xử lý yêu cầu cụ thể HTTP " các phương thức chính xử lý yêu cầu đến sẽ được chỉ ra. Vì vậy, hãy viết lại lớp App.java:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.IOException;

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

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 		// https://www.oracle.com/technetwork/java/servlet-142430.html
 		PrintWriter out = resp.getWriter();
 		out.println(this.getGreeting());
 		out.close();
 	}
}
Vì vậy, chúng tôi dường như đã chuẩn bị sẵn sàng mọi thứ. Tất cả những gì còn lại là viết chính xác bộ mô tả triển khai. Từ sơ đồ, sao chép văn bản sau vào web.xml:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="..."
      version="3.1">
      ...
</web-app>
Và cũng là đường dẫn đến lược đồ được chỉ ra trong đó: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Bây giờ chúng ta hãy xem ví dụ về giao diện của web.xml trong đặc tả API Servlet. Ví dụ này được đưa ra trong chương " 14.5.1 Một ví dụ cơ bản ". Hãy kết hợp những gì được chỉ ra trong sơ đồ với ví dụ được chỉ ra trong thông số kỹ thuật. Chúng tôi nhận được những điều sau đây:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
      version="3.1">
      <display-name>A Simple Web Application</display-name>
      <servlet>
		<servlet-name>app</servlet-name>
		<servlet-class>App</servlet-class>
	  </servlet>
	  <servlet-mapping>
		<servlet-name>app</servlet-name>
		<url-pattern>/app</url-pattern>
	  </servlet-mapping>
</web-app>
Như bạn có thể thấy, chúng tôi đã sử dụng lược đồ và SchemaLocation đã được chỉ định trước đó. Và phần mô tả về các phần tử được lấy từ ví dụ ở Chương 14.5.1. Nếu chúng tôi đã làm mọi thứ chính xác, chúng tôi sẽ thực thi tác vụ gradle war mà không gặp lỗi:
Ứng dụng web bằng Java - 11
Ứng dụng web bằng Java - 12

Khởi chạy một ứng dụng web

Làm thế nào để một ứng dụng web khởi chạy? Trước tiên hãy giải quyết tùy chọn phức tạp hơn. Trước đây chúng tôi đã nói rằng có một máy chủ web Apache Tomcat hỗ trợ API Servlet. Điều này có nghĩa là chúng tôi có thể triển khai kho lưu trữ chiến tranh đã thu thập của mình (họ cũng nói “triển khai”) trên máy chủ này. Trên trang " Tải xuống Tomcat ", tải xuống từ phần "Phân phối nhị phân" loại phân phối "Lõi" ở định dạng zip. Và giải nén kho lưu trữ đã tải xuống vào một số thư mục, ví dụ như trong C:\apache-Tomcat-9.0.14. Trước khi khởi động máy chủ, hãy mở tệp để chỉnh sửa conf\tomcat-users.xmlvà thêm dòng sau vào đó: <user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/> Bây giờ, trên dòng lệnh, hãy chuyển đến thư mục bin và thực thi catalina.bat start. Theo mặc định, bảng điều khiển máy chủ sẽ có sẵn tại http://localhost:8080/manager. Thông tin đăng nhập và mật khẩu giống như thông tin đăng nhập mà chúng tôi đã chỉ định trong tomcat-users.xml. Tomcat có thư mục "webapps", chứa các ứng dụng web. Nếu chúng tôi muốn triển khai kho lưu trữ của riêng mình, chúng tôi phải sao chép kho lưu trữ chiến tranh của mình ở đó. Khi chúng tôi chạy lệnh chiến tranh gradle trước đây, \build\libs\một kho lưu trữ chiến tranh đã được tạo trong thư mục. Đây là những gì chúng ta cần sao chép. Sau khi sao chép, hãy tải lại trang http://localhost:8080/managervà xem:
Ứng dụng web bằng Java - 13
Sau khi hoàn thành http://localhost:8080/javaweb/app, chúng ta sẽ chuyển sang servlet của mình, bởi vì Trước đây chúng tôi đã “ánh xạ” (nghĩa là đã ánh xạ) yêu cầu /app tới servlet Ứng dụng. Có một cách nhanh hơn để kiểm tra cách ứng dụng hoạt động. Và hệ thống lắp ráp lại giúp chúng tôi điều này. Trong tập lệnh xây dựng của dự án Gradle, chúng ta có thể thêm plugin mới " Gretty " vào phần plugin: id "org.gretty" version "2.3.1" Và bây giờ chúng ta có thể thực hiện tác vụ gradle để chạy ứng dụng của mình:gradle appRun
Ứng dụng web bằng Java - 14
Xem " Thêm plugin grtty và chạy ứng dụng " để biết chi tiết.
Ứng dụng web bằng Java - 15

API mùa xuân và Servlet

Servlets là nền tảng của mọi thứ. Và ngay cả Spring Framework phổ biến hiện nay cũng không gì khác hơn là một tiện ích bổ sung cho API Servlet. Để bắt đầu, Spring Framework là một phần phụ thuộc mới cho dự án của chúng tôi. Vì vậy, chúng ta hãy thêm nó vào build script trong khối phụ thuộc: compile 'org.springframework:spring-webmvc:5.1.3.RELEASE' Trong tài liệu Spring Framework có một chương " 1.1. DispatcherServlet ". Nó nói rằng Spring Framework được xây dựng trên mẫu "front control" - đây là khi có một servlet trung tâm được gọi là " DispatcherServlet ". Tất cả các yêu cầu đều đến servlet này và nó ủy quyền các cuộc gọi đến các thành phần cần thiết. Bạn thấy đấy, ngay cả ở đây cũng có servlet. Bạn cần thêm trình nghe vào bộ mô tả triển khai:
<listener>
	&ltlistener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Đây là trình xử lý sự kiện ngữ cảnh của servlet. Tức là khi Servlet Context khởi động thì Spring context (WebApplicationContext) cũng khởi động. Bối cảnh Servlet là gì? Nó được mô tả trong đặc tả Servle API ở chương " CHAPTER 4. Servlet Context ". Ngữ cảnh servlet là "chế độ xem" của ứng dụng web trong đó các servlet đang chạy. Mỗi ứng dụng web đều có Ngữ cảnh Servlet riêng. Tiếp theo, để kích hoạt Spring Framework, bạn cần chỉ định context-param - tham số khởi tạo cho bối cảnh servlet.
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
Và định nghĩa DispatcherServlet hoàn tất cấu hình :
<servlet>
	<servlet-name>app</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
 		<param-value></param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>app</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
Và bây giờ chúng ta chỉ cần điền vào file được chỉ định trong contextConfigLocation. Cách thực hiện việc này được mô tả trong tài liệu Spring Framework ở chương "1.3.1.Tuyên bố":
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="ru.javarush.javaweb"/>
    <mvc:annotation-driven/>
</beans>
Điều quan trọng ở đây không chỉ là chỉ ra gói nào cần quét mà còn là việc chúng ta muốn điều khiển theo chú thích, tức là kiểm soát các chú thích về cách Spring sẽ hoạt động. Tất cả những gì còn lại là tạo gói ru.javarush.javaweb và đặt lớp trình điều khiển Spring vào đó:
package ru.javarush.javaweb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SpringController {

    @GetMapping("/app")
    @ResponseBody
    public String getGreeting() {
        return "Hello world.";
    }
}
Bây giờ đang chạy gradle appRun và đi tới địa chỉ, http://127.0.0.1:8080/javaweb/appchúng ta sẽ nhận được Hello World tương tự. Như bạn có thể thấy, Spring Framework có mối liên hệ chặt chẽ với API Servlet và sử dụng nó để hoạt động dựa trên API đó.
Ứng dụng web bằng Java - 16

Chú thích

Như chúng ta đã thấy, chú thích rất tiện lợi. Và chúng tôi không phải là những người duy nhất nghĩ như vậy. Do đó, trong đặc tả API Servlet, bắt đầu từ phiên bản 3.0, chương “ CHƯƠNG 8 Chú thích và khả năng cắm ” đã xuất hiện, trong đó chỉ định rằng các bộ chứa servlet phải hỗ trợ khả năng chỉ định những gì đã được chỉ định trước đó trong Bộ mô tả triển khai thông qua các chú thích. Do đó, web.xml có thể được loại bỏ hoàn toàn khỏi dự án và phía trên lớp servlet, bạn có thể chỉ định chú thích @WebServlet và chỉ ra đường dẫn nào để ánh xạ servlet tới. Mọi thứ có vẻ rõ ràng ở đây. Nhưng điều gì sẽ xảy ra nếu chúng ta kết nối Spring với dự án yêu cầu cài đặt phức tạp hơn? Ở đây mọi thứ phức tạp hơn một chút. Đầu tiên, tài liệu Spring nói rằng để định cấu hình Spring mà không cần web.xml, bạn cần sử dụng lớp của riêng mình để triển khai WebApplicationInitializer. Để biết thêm chi tiết, xem chương " 1.1. DispatcherServlet ". Hóa ra đây là lớp Spring. API Servlet được sử dụng ở đây như thế nào? Trên thực tế, ServletContainerInitializer đã được thêm vào Servlet API 3.0 . Sử dụng một cơ chế đặc biệt trong Java (được gọi là SPI ), Spring chỉ định trình khởi tạo vùng chứa servlet của nó được gọi là SpringServletContainerInitializer. Đổi lại, nó sẽ tìm kiếm các triển khai WebApplicationInitializer và gọi các phương thức cần thiết cũng như thực hiện các cài đặt cần thiết. Xem " Cách bộ chứa servlet tìm thấy triển khai WebApplicationInitializer " để biết thêm chi tiết. Các cài đặt trên có thể được thực hiện như thế này:
package ru.javarush.javaweb.config;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class AppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        // регистрируем конфигурацию созданую высше
        ctx.register(AppConfig.class);
        // добавляем в контекст слушателя с нашей конфигурацией
        servletContext.addListener(new ContextLoaderListener(ctx));

        ctx.setServletContext(servletContext);

        // настраиваем маппинг Dispatcher Servlet-а
        ServletRegistration.Dynamic servlet =
                servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
}
Bây giờ, bằng cách sử dụng " Cấu hình dựa trên Java ", chúng tôi sẽ chỉ ra gói nào cần quét + bật chú thích:
package ru.javarush.javaweb.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "ru.javarush.javaweb.controllers")
public class AppConfig {
}
Và bản thân SpringController đã được chuyển đến ru.javarush.javaweb.controllers, để khi quét, cấu hình sẽ không tự tìm thấy mà chỉ tìm kiếm các bộ điều khiển.
Ứng dụng web bằng Java - 17

Tóm tắt

Tôi hy vọng phần tổng quan này đã làm sáng tỏ cách các ứng dụng web hoạt động trong Java. Đây chỉ là phần nổi của tảng băng chìm, nhưng nếu không hiểu những điều cơ bản thì khó có thể hiểu được các công nghệ dựa trên nền tảng này hoạt động như thế nào. API Servlet là phần trung tâm của bất kỳ ứng dụng web Java nào và chúng tôi đã xem xét cách các khung công tác khác phù hợp với nó. Để tiếp tục, bạn có thể xem các tài liệu sau: #Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION