JavaRush /Blog Java /Random-VI /Chinh Phục Khởi Động Mùa Xuân
Surplus
Mức độ
Москва

Chinh Phục Khởi Động Mùa Xuân

Xuất bản trong nhóm
Chúc một ngày tốt lành, độc giả thân mến! Và rất vui được gặp bạn, ngay cả khi cái tên khoa trương đó là lý do chính để tìm hiểu chủ đề khiêm tốn về lần đầu làm quen với quá trình phát triển Spring Boot. Tôi muốn chia sẻ kinh nghiệm hoàn thành bài tập nhập môn thực tập trên cổng JavaRush, trình bày cái nhìn tổng quan từ phía một sinh viên đại học kỹ thuật hoàn toàn bình thường muốn kiểm tra sức mạnh kiến ​​​​thức tích lũy của mình. Chinh phục mùa xuân Boot - 1Tôi không thể phủ nhận khả năng có sự thô lỗ trong quy tắc hoặc phương pháp tư duy đính kèm và tôi hoan nghênh những lời chỉ trích mang tính xây dựng, bởi vì chính nhờ những “va chạm và vết bầm tím” mà tôi mới có thể phát triển theo hướng chuyên nghiệp. Hơn nữa, tôi hoàn toàn không giả vờ là “thuốc chữa bách bệnh” trong việc giải quyết các điều kiện nhất định và cố tình bỏ qua từng phần riêng lẻ của chương trình, để lại tầm quan trọng then chốt của việc tham gia vào một chủ đề tương đối phức tạp mà không gây hậu quả nhỏ nhất cho hệ thần kinh. Đó là sự thật, thật liều lĩnh khi phủ nhận một điều hiển nhiên: điều đó thật khó khăn đối với tôi và hoàn toàn không có gì rõ ràng cho đến một thời điểm nhất định. Và nếu bạn trải qua cảm giác tương tự ngay từ lần gặp đầu tiên với nhiệm vụ, thì “Chào mừng!” Hãy viết một ứng dụng web trong Spring Boot bằng cách sử dụng sự tương tự đơn giản của bài kiểm tra đầu vào thực tập bằng cách sử dụng công cụ tạo mẫu Thymeleafquerytruy vấn tới máy chủ MySQL cục bộ để lọc mảng thông tin đến. Vậy hãy bắt đầu!

Khởi động mùa xuân. Nó là loại động vật gì và cách nấu nó như thế nào?

Nói tóm lại và ngắn gọn, đây là một công cụ tuyệt vời của Pivotel để tiết kiệm thời gian quý báu trong quá trình tạo ứng dụng, loại bỏ nhu cầu kết nối trực tiếp các thư viện của bên thứ ba, viết canvas ánh xạ và servlet ấn tượng. Chỉ cần sử dụng trình xây dựng Spring Khởi tạo , được tích hợp vào IntelliJ IDEA Ultimate Edition (Tệp - Mới - Dự án... - Spring Khởi tạo) hoặc nằm trên dịch vụ web start.spring.io , chỉ định các gói để đưa vào là đủ. cung cấp.
Chinh Phục Khởi Động Mùa Xuân - 2
Theo các thông số kỹ thuật được đưa ra, chúng tôi sẽ sử dụng bộ tiêu chuẩn dành cho quý ông để tạo một ứng dụng web đơn giản bằng cơ sở dữ liệu MySQL :
  • WEB là thành phần chính để phát triển ứng dụng web, bao gồm máy chủ Apache Tomcat cục bộ tại địa chỉ tiêu chuẩn localhost:8080 và khung công tác Spring MVC phổ quát.

  • DevTools - được sử dụng để nhanh chóng khởi động lại ứng dụng trong JVM nóng khi phát hiện thấy các thay đổi trong mã hoặc mẫu đã biên dịch; Hơn nữa, nó giải phóng Thymeleaf khỏi việc xóa bộ nhớ đệm nếu công cụ đã chọn được đưa vào dự án.

  • JPA là công nghệ cần thiết để làm việc với cơ sở dữ liệu và cung cấp ánh xạ quan hệ đối tượng của các đối tượng Java, cung cấp API ( Hibernate trong trường hợp của chúng tôi) để quản lý, lưu và truy xuất các thực thể.

  • Thymeleaf (Mustache, AngularJS, Vaadin và hơn thế nữa) - công cụ tạo mẫu để trực quan hóa ứng dụng; Nhờ khá quen thuộc với các nguyên tắc của html, tôi đã chọn Thymeleaf, công ty đã đưa ngôn ngữ này trở thành nền tảng của thế giới.

  • MySQL - kết nối trình điều khiển Kết nối cơ sở dữ liệu Java để thực hiện các truy vấn SQL đối với cơ sở dữ liệu.
Sau lần lựa chọn cuối cùng các thành phần và quá trình tạo, chúng ta sẽ có được một kiến ​​trúc ứng dụng web thông thường với các thư mục sẵn sàng để điền thêm. Các phân đoạn để tương tác với phần trực quan, có thể là kiểu đồ họa CSS, trang HTML tiêu chuẩn hoặc chức năng JavaScript, phải được đặt trong “tài nguyên” và thành phần phụ trợ, theo đó, phải được đặt trong “java”. Chúng ta cũng nên chú ý đến tệp pom.xml trong phạm vi gốc, nơi lưu trữ cấu trúc dự án và các phần phụ thuộc giữa các thành phần. Nếu bạn muốn mở rộng hơn nữa chức năng với các gói bổ sung hoặc loại bỏ những thứ không cần thiết, bạn nên thực hiện các thao tác giữa các thẻ <dependencies></dependencies>theo phương pháp tương tự.
Chinh Phục Khởi Động Mùa Xuân - 3

Những bước đi đầu tiên cho một tương lai tươi sáng

Tiếp theo, một câu hỏi khá thú vị và khá logic được đặt ra: “Làm gì bây giờ? Điều này sẽ hoạt động như thế nào? Chương trình được xây dựng trên nguyên tắc Model-View-Controller: tổ chức việc đọc các thực thể từ cơ sở dữ liệu được kết nối (Model) và hiển thị trong giao diện người dùng với các điều khiển (View); Việc giao tiếp giữa các thành phần và thực hiện các hành động theo yêu cầu được truyền đi được thực hiện nhờ Bộ điều khiển. Đó là việc tạo ra các yếu tố chính đóng vai trò là điểm tham chiếu cho sự phát triển liên tục. Để tránh trơn trượt và duy trì sự tôn trọng của đồng đội trên công trường, bạn nên đặt các thành phần vào các thư mục thích hợp (ví dụ: đặt tệp Controller trong thư mục Controllers trong nhánh “java”) và cẩn thận giữ lại. trật tự tại nơi làm việc.

Bản chất là một phần nhỏ trong cơ chế lớn

Hay nói cách khác là Model của chúng ta theo các điều kiện đặt ra trong bài toán. Bắt đầu từ chủ đề thảo luận và quay trở lại dự án giới thiệu, chúng tôi có thể tự tin khẳng định rằng có sự khác biệt tối thiểu giữa các nhiệm vụ và tuân thủ khái niệm trung bình khi xem xét thêm. Giả sử, ghi chú vào một cuốn sổ, bao gồm:
  • Số nhận dạng để xác định vị trí trong luồng chung;
  • Một tin nhắn văn bản có số lượng ký tự nhất định;
  • Ngày người dùng thêm nó vào danh sách chung;
  • Biến Boolean để xác định “Xong hay chưa xong” (“Đọc hay không đọc”).
Do đó, hãy tạo một lớp Ghi chú trong thư mục có tên là “thực thể” và thêm các trường thích hợp:
@Entity
public class Note {

   @Id
   @GeneratedValue
   private int id;
   private String message;
   private Date date;
   private boolean done;

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}
Một sai lệch khác so với chủ đề thảo luận để hiểu rõ hơn về những gì đang xảy ra từ quan điểm lý thuyết. Việc kết nối giữa các thành phần trong Spring được chỉ định bằng các chú thích - các con trỏ đặc biệt ở phía trước các đối tượng, mỗi chú thích đóng một vai trò cụ thể trong cơ chế và bắt đầu bằng ký hiệu “@”. Chú thích @Entity cho Spring Boot biết rằng dữ liệu lớp tiếp theo thuộc về “Thực thể”, đồng thời @Id và @GeneratedValue chỉ định trường đã chọn làm mã định danh với khả năng tự động tạo một trình vòng lặp khi xử lý một mảng thông tin. Tôi cố tình bỏ qua việc thêm Getter và Setter tiêu chuẩn để tăng tính gọn nhẹ của định dạng trực quan. Tiếp theo, tính đến việc sử dụng cơ sở dữ liệu để lưu trữ các bản ghi, chúng ta chuyển sang bước tiếp theo trong quá trình phát triển ứng dụng: chúng ta sẽ tạo giao diện NoteRepository trong thư mục “repository”, một phần tử kết nối trong chuỗi trao đổi và kế thừa nhiều nhất kho lưu trữ phù hợp cho công việc tiếp theo, chỉ ra thực thể được lưu trữ và trình vòng lặp số nguyên để truy cập.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
Trên thực tế, đó là tất cả. Ngắn gọn và súc tích. Bây giờ Spring Boot sẽ sử dụng thành phần đã tạo để tổ chức các tương tác với cơ sở dữ liệu. Có tương đối nhiều loại kho lưu trữ kế thừa với tiềm năng hoạt động khác nhau. JpaRepository nằm ở vị trí cao nhất và có tiềm năng nhất, bao gồm CrudRepository và PageAndSortingRepository bên dưới. Chúng tôi sẽ không đi xa hơn và đi chệch khỏi chủ đề vì một số chi tiết có thể được tìm thấy trên trang web Pivotel trong tài liệu kỹ thuật. Bây giờ, sau khi triển khai hình ảnh dữ liệu và chỉ định các phương thức giao tiếp ở phía ứng dụng, bạn cần chú ý tạo cơ sở dữ liệu MySQL trong môi trường bên ngoài thích hợp “MySQL Workbench”, được cài đặt sẵn trên nền tảng máy tính để bàn trong một tập hợp từ nhà phát triển chính thức với các gói bổ sung để tạo máy chủ cục bộ:
Chinh Phục Khởi Động Mùa Xuân - 4
Tiếp theo, làm theo hướng dẫn của môi trường sau khi nhấp vào biểu tượng có máy chủ cục bộ hiện tại trong cửa sổ chính, chúng tôi tạo sơ đồ bảng theo các trường của thực thể chúng tôi (Lưu ý) và điền dữ liệu thích hợp vào đó. Cần phải làm rõ một cách riêng biệt sự tinh tế của phương ngữ MySQL, điều này đòi hỏi sự chú ý khẩn cấp để đạt được kết quả mong muốn một cách thành công:
  • Không có loại Boolean riêng biệt như vậy. Mọi hành động xử lý yêu cầu sẽ chuyển đổi “true” hoặc “false” thành giá trị bit tương ứng là “1” hoặc “0”;
  • Ngày được lưu trữ hoàn toàn trong loại Dấu thời gian. Nếu bạn sử dụng Ngày, vốn quen thuộc với cốt lõi, bạn sẽ phải giới hạn bản thân chỉ ở vị trí trong lịch.
Chinh Phục Khởi Động Mùa Xuân - 5
Sau khi hoàn thành lần cuối các bước chuẩn bị, chúng tôi chỉ ra “Bàn làm việc MySQL” để gửi dữ liệu đến máy chủ cục bộ bằng cách nhấp vào biểu tượng “tia chớp” trên thanh công cụ. Bây giờ, nếu việc thêm thông tin được hoàn thành chính xác, chúng ta có thể tự tin quay lại IDE gốc của mình để tiếp tục phát triển bằng cách thêm cấu hình cơ sở dữ liệu hiện tại vào application.properties (thường nằm trong thư mục “resources”):
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
Và cuối cùng ràng buộc thực thể Note với MySQL bằng chú thích. @Table cho biết việc sử dụng bảng có tên và lược đồ đã chọn và @Column cho biết rằng các biến thuộc về một trường cụ thể.
@Entity
@Table(name = "test", schema = "test", catalog = "")
public class Note {

   @Id
   @GeneratedValue
   private int id;
   @Column(name = "message")
   private String message;
   @Column(name = "date")
   private Date date;
   @Column(name = "done")
   private boolean done;

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}

Xem hoặc giao diện người dùng

Than ôi, chúng ta có thể nói một cách an toàn như sau: “Việc hình dung ứng dụng sẽ trở thành trở ngại chính nếu không có một chút kiến ​​​​thức lý thuyết hoặc thực tế nào”. Thành thật mà nói, thành phần front-end chiếm một khối lượng công việc đáng kinh ngạc và khiến tôi tự tin căng thẳng trong một thời gian dài. Nhưng nhờ sự đơn giản đến kinh ngạc của Thymeleaf, người ta đã có thể tìm ra sự thỏa hiệp phù hợp sau chuỗi thất bại đầy mê hoặc. Cuộc thảo luận sâu hơn sẽ là về sự phức tạp của việc sử dụng công cụ đã chọn, mặc dù khái niệm chung vẫn tuân theo quan điểm tương tự. Kỹ thuật chính là khả năng sử dụng HTML thuần túy nhất và tập hợp màn hình cuối cùng từ các mảnh riêng lẻ để tránh lặp lại nhiều lần các phần giống hệt nhau. Giả sử kiến ​​trúc giao diện người dùng bao gồm một trang chính bao gồm một thanh điều hướng có các điều khiển (thêm mục nhập mới, quay lại trang chính) và một bảng động để hiển thị các thực thể được sắp xếp theo thời gian ghi chú được thêm vào theo thứ tự tăng dần (ASC) hoặc giảm dần ( DESC) hướng.ý nghĩa. Chúng ta hãy coi vị trí tiêu chuẩn là hiển thị tất cả các bản ghi theo thứ tự tăng dần. Theo chính sách phân cấp của công cụ tạo mẫu đã chọn, các thành phần trực quan hóa thành phần phải được đặt trên nhánh “mẫu” trong thư mục “tài nguyên”. Do đó, các thao tác tiếp theo với các thành phần sẽ tính đến các điều kiện được đưa ra. Hãy tạo một trang chính với tên “index” (hoặc bất kỳ tên nào khác tùy theo sở thích cá nhân) trên mẫu html5. Ví dụ:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/head :: head"></head>
<body>
<div class="container">
   <div th:replace="fragments/header :: header"></div>
   <div th:if="${not #lists.isEmpty(notes)}">
       <div th:replace="operations/list :: notebook"></div>
   </div>
   <div th:replace="fragments/footer :: footer"></div>
</div>
</body>
</html>
Vì vậy, hãy chia nhỏ các thành phần chính của ứng dụng cuối cùng. Thymeleaf sử dụng một cú pháp riêng để chỉ ra cách sử dụng các thủ tục và bắt đầu bằng từ khóa “th:”, liên kết tới thư viện mà nhất thiết phải có trong thẻ mở <html>.
<div th:if="${not #lists.isEmpty(notes)}">
Thao tác “if” hoàn toàn không khác với cách thực hiện thông thường và kiểm tra thuộc tính “ghi chú” đến để biết sự hiện diện của các đối tượng để hiển thị thêm. Điều đáng nói riêng là sự chồng chéo của chủ đề với việc sử dụng Bộ điều khiển, có tính đến việc sử dụng nó để tổ chức sự tương tác của mô hình và trực quan hóa. Nhiều khoảnh khắc mơ hồ hình thành trong tương lai, cứ quay lại nếu muốn.
<head th:replace="operations/list :: notebook"></head>
Hoạt động “thay thế” biểu thị việc thay thế một “sơ khai” hoặc một khối hoạt động bằng một đoạn được chọn từ trang hiện tại hoặc trang riêng biệt - trường hợp sau được thấy rõ trong ví dụ. Chúng tôi sao chép đoạn có tên “notebook” từ “list.html” của thư mục “hoạt động” vào <div></div> của tệp “index”, thay thế hoàn toàn nội dung ở đích cuối cùng. Bản gửi đi có nội dung như sau:
<!DOCTYPE html>
<!--suppress ALL -->
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">

<div th:fragment="notebook">
   <table class="table table-bordered table-hover horizontal-align">
       <thead>
       <tr>
           <th style="width: 5%">#</th>
           <th style="width: 60%">Message</th>
           <th class="dropdown" style="width: 20%">Date
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}"><i class="fa fa-chevron-circle-up"></i></a>
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'DESC')}"><i class="fa fa-chevron-circle-down"></i></a>
           </th>
           <th style="width: 5%">Done</th>
           <th style="width: 5%">Edit</th>
           <th style="width: 5%">Delete</th>
       </tr>
       </thead>
       <tbody>
       <tr th:each="note : ${notes}">
           <td th:text="${note.id}" style="text-align: center">#</td>
           <td th:text="${note.message}">Message</td>
           <td th:text="${#dates.format(note.date, 'EEE, d MMM yyyy HH:mm')}" style="text-align: center">Date</td>
           <td style="text-align: center">
               <i th:if="${note.done} == true" class="fa fa-plus-square-o" style="font-size:20px;color:#337ab7"></i>
               <i th:if="${note.done} == false" class="fa fa-minus-square-o" style="font-size:20px;color:#337ab7"></i>
           </td>
           <td style="text-align: center"><a th:href="@{'/edit/{id}'(id=${note.id})}"><i class="fa fa-edit" style="font-size:20px"></i></a></td>
           <td style="text-align: center"><a th:href="@{'/delete/{id}'(id=${note.id})}"><i class="fa fa-trash" style="font-size:20px"></i></a></td>
       </tr>
       </tbody>
   </table>
</div>
</html>
Chúng ta hãy quay lại phần tổng quan mang tính xây dựng và xem qua các hàm Thymeleaf được sử dụng theo thứ tự, bỏ qua cú pháp HTML hoặc kiểu đồ họa tiêu chuẩn được sử dụng và tập trung cụ thể vào việc tìm hiểu cơ chế công cụ tạo mẫu.
<div th:fragment="notebook">
Hoạt động “đoạn” chỉ định tên của đoạn và cho phép sử dụng nội dung của khối cho lệnh “thay thế”. Hơn thế nữa! Việc sử dụng nhiều lần trong một trang không bị loại trừ, một lần nữa đưa ra sự tương tự với các thủ tục hoặc hàm trong ngôn ngữ lập trình.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
Lệnh gọi tới chú thích @PostMapping được sử dụng trong Bộ điều khiển với ánh xạ “/sort/{sortDate}”, trong đó {sortDate} là thuộc tính hướng sắp xếp gửi đi. Có thể thấy điều gì đó tương tự trong khối sau, khối này thêm một thay đổi động tùy thuộc vào vị trí của phần tử do người dùng chọn trong vòng lặp:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
Việc liệt kê các giá trị rất giống với cách sử dụng khối for quen thuộc trong cú pháp Java: biến “note” lấy phần tử hiện tại từ mảng thuộc tính đầu vào ${notes}—một mảng các thực thể—và được sử dụng để thay đổi các giá trị ​​sau này. Thành thật mà nói, chúng ta có thể dành một bài viết riêng để liệt kê nhiều khả năng của Thymeleaf cùng với các ví dụ về ứng dụng thực tế - công cụ tạo mẫu cực kỳ đơn giản và hoàn toàn không yêu cầu phải học một loạt cú pháp bổ sung ấn tượng. Các chức năng được mô tả ở trên được nêu trong tài liệu kỹ thuật trên trang web chính thức của nhà phát triển và đóng vai trò quan trọng trong việc tổ chức liên lạc với back-end. Vì vậy, bạn có thể tự tin chuyển sang phần tiếp theo và phần cuối cùng. Tất nhiên, bằng cách đính kèm các thành phần trực quan còn lại trong một liên kết đến ứng dụng đã hoàn thành ở cuối bài viết.

Kiểm soát viên, quản trị viên trong một công ty nhỏ

“Nền tảng trong kiến ​​trúc của một ứng dụng web” - có lẽ không có cách nào mô tả chính xác hơn về tầm quan trọng của thành phần Controller trong việc tổ chức công việc của chương trình: hầu hết các thao tác đều được thực hiện chính xác bởi phần tử kết nối giữa mô hình và khung nhìn. Nhờ cơ chế hoạt động của Spring Boot, bạn có thể tự tin sử dụng các phương thức ánh xạ và yêu cầu GET/POST mà không gặp bất kỳ vấn đề nhỏ nào và tự động kết nối kho lưu trữ dữ liệu. Hãy tạo lớp NoteController trong một tệp riêng biệt trong thư mục “controllers”, một lần nữa đề cập đến việc sử dụng chú thích thích hợp:
@Controller
public class NoteController {

   private NoteService service;

   @Autowired
   public void setNoteService(NoteService service) {
       this.service = service;
   }

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Nếu quan sát kỹ có thể nhận thấy một thay đổi quan trọng trong thiết kế kiến ​​trúc ứng dụng liên quan đến việc bổ sung một dịch vụ nhằm tách logic nghiệp vụ khỏi hoạt động với dịch vụ quản lý cơ sở dữ liệu. Các hành động đã hoàn thành được yêu cầu để tăng tính linh hoạt của sản phẩm hoàn chỉnh và cung cấp phạm vi rộng để thay đổi chức năng của giao diện người dùng mà không cần thay đổi phương thức giao tiếp với cơ sở dữ liệu. Cách biểu diễn tiêu chuẩn không có gì nổi bật so với đám đông những cái tương tự: giao diện nằm trong một thư mục riêng và được triển khai bởi một lớp có chú thích @Service để phát hiện Spring Boot:
public interface NoteService {
   Note getNoteById(Integer id);
   void saveNote(Note note);
   void updateNote(Integer id, String message, boolean done);
   void deleteNote(Integer id);
   List<Note> findAll();
}

@Service
public class NoteServiceImpl implements NoteService{

   private NoteRepository repository;

   @Autowired
   public void setProductRepository(NoteRepository repository) {
       this.repository = repository;
   }

   @Override
   public Note getNoteById(Integer id) {
       return repository.findOne(id);
   }

   @Override
   public void saveNote(Note note) {
       repository.save(note);
   }

   @Override
   public void updateNote(Integer id, String message, boolean done) {
       Note updated = repository.findOne(id);
       updated.setDone(done);
       updated.setMessage(message);
       repository.save(updated);
   }

   @Override
   public void deleteNote(Integer id) {
       repository.delete(id);
   }

   @Override
   public List<Note> findAll() {
       return repository.findAll();
   }
}
Chúng ta hãy quay lại xem xét bộ điều khiển và xem xét sự phức tạp của việc tổ chức công việc bằng các phương pháp Spring Boot. Chú thích @Autowired cho biết nhu cầu tự động liên kết dịch vụ với một biến được chỉ định thuộc loại thích hợp và thiết lập kết nối với cơ sở dữ liệu. Cần chú ý nhiều hơn đến cách giao tiếp của chế độ xem, được biểu thị bằng chú thích @GetMapping("/"), chú thích này sẽ trả về một trang có tên là “index” khi nhận được lệnh gọi tới localhost:8080. Bạn có thể sử dụng một cách tiếp cận khác, chỉ định mô tả mở rộng @RequestMapping(value = "/", Method =RequestMethod.GET) hoặc thay thế kiểu trả về bằng ModelAndView được tạo sẵn. Tuy nhiên, theo kinh nghiệm hiện tại trong ứng dụng thực tế, tôi không nhận thấy bất kỳ khác biệt cơ bản nào trong kết quả cuối cùng và sử dụng tùy chọn thông thường. Hãy mở rộng bộ điều khiển bằng cách thêm các phần tử mới bằng tab bổ sung. Sau khi người dùng nhấp vào một thành phần trên thanh điều hướng, @GetMapping("/new") được gọi và chuyển hướng đến trang “mới” từ thư mục “hoạt động”, trả về một tham số có tên “tin nhắn” khi xác nhận dữ liệu đã nhập bằng nút và chuyển hướng đến khối chính. Yêu cầu phải khớp hoàn toàn tên biến trong cửa sổ nhập với tên của giá trị được truyền cần được đề cập đặc biệt.
<input type="text" class="form-control" id="message" th:name="message" placeholder="Enter your note." maxlength="100"/>
@GetMapping("/new")
public String newNote() {
   return "operations/new";
}

@PostMapping("/save")
public String updateNote(@RequestParam String message) {
   service.saveNote(new Note(message));
   return "redirect:/";
}
Một kỹ thuật tương tự được sử dụng để cập nhật một bản ghi. Sau khi nhấp vào điều khiển, ánh xạ @GetMapping("/edit/{id}") được gọi và mã định danh từ chuỗi URL được chuyển, thuộc tính “ghi chú” được thêm vào với một mục nhập để chỉnh sửa thêm. @RequestParam(value = "done", require = false) boolean done) việc chỉ định một giá trị cụ thể đóng vai trò chính trong việc sử dụng hộp kiểm khi sử dụng công cụ mẫu Thymeleaf và được đặt thành “false” theo mặc định.
@GetMapping("/edit/{id}")
public String edit(@PathVariable Integer id, Model model) {
   Note note = service.getNoteById(id);
   model.addAttribute("note", note);
   return "operations/edit";
}

@PostMapping("/update")
public String saveNote(@RequestParam Integer id, @RequestParam String message,
                      @RequestParam(value = "done", required = false) boolean done) {
   service.updateNote(id, message, done);
   return "redirect:/";
}
Việc xóa các mục khỏi cơ sở dữ liệu cực kỳ đơn giản và không yêu cầu bất kỳ thao tác đáng kể nào bằng cách gọi hàm dịch vụ thích hợp bằng giá trị được truyền:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
Bây giờ, hãy thực hiện những điều chỉnh nhỏ cho các đoạn đã hoàn thiện và chuyển sang giao tiếp thú vị với MySQL bằng cách sử dụng các truy vấn truy vấn trong Spring Data JPA, thêm riêng một chức năng để quản lý việc lọc đơn giản trước khi đóng Bộ điều khiển.
@Controller
public class NoteController {

   private String sortDateMethod = "ASC";

   @GetMapping("/")
   public String list(Model model) {
       List<Note> notebook = filterAndSort();
       model.addAttribute("notes", notebook);
       model.addAttribute("sort", sortDateMethod);
       return "index";
   }

private List<Note> filterAndSort() {
   List<Note> notebook = null;
   switch (sortDateMethod) {
       case "ASC":
           notebook = service.findAllByOrderByDateAsc();
           break;
       case "DESC":
           notebook = service.findAllByOrderByDateDesc();
           break;
   }
   return notebook;
}

Truy vấn rất nhỏ nhưng rất quan trọng.

Thật xấu hổ khi thừa nhận, việc lọc các giá trị, trái với mong đợi, hóa ra lại là một trở ngại khác trong việc hoàn thành nhiệm vụ kỹ thuật, tự tin vượt qua ngưỡng phức tạp do phân trang thiết lập - chia mảng dữ liệu thành các trang riêng biệt có kích thước nhất định để hiển thị thêm. Rất có thể, sự mệt mỏi tích tụ đang dần ảnh hưởng đến bạn, nhưng... nguồn cảm hứng đến sau một cuộc gặp gỡ hoàn toàn tình cờ với các truy vấn Truy vấn.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA cung cấp khả năng tạo các truy vấn cơ sở dữ liệu có độ chi tiết cao giúp loại bỏ nhu cầu sắp xếp thông tin sau khi nhận được và có nhiều tiềm năng ứng dụng. Ví dụ:
List<Note> findAllByOrderByDateAsc();
Phương thức này sẽ được chuyển đổi thành truy vấn SQL và hiển thị tất cả các bản ghi (findAll) được sắp xếp (byOrder) theo ngày (byDate) theo thứ tự tăng dần (Asc). Hơn nữa, bạn có thể tạo các kết hợp và mẫu phức tạp trên nhiều trường với một yêu cầu duy nhất. Giả sử, chọn tất cả các bản ghi (findAll) đã hoàn thành (byDoneTrue) theo thứ tự (byOrder) giảm dần (Decs) theo giá trị ngày (byDate):
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Kết luận hoặc lời thú nhận khác của một lập trình viên mới làm quen

Tất cả! Bạn có thể khởi chạy ứng dụng web một cách an toàn bằng cách sử dụng tổ hợp Shift+F10 hoặc bằng cách nhấp vào biểu tượng tương ứng. Spring Boot sẽ xây dựng chương trình trên Apache Maven và cài đặt máy chủ Apache Tomcat cục bộ tại localhost:8080. Bây giờ bạn chỉ cần theo liên kết trong bất kỳ trình duyệt nào.
Chinh phục mùa xuân Boot - 6
Và tất nhiên, phát triển một phương pháp để đáp ứng các yêu cầu kinh doanh khác. Tiềm năng của ứng dụng bị giới hạn bởi nỗ lực, sự tháo vát và trí tưởng tượng của nhà phát triển.
Chinh Phục Khởi Động Mùa Xuân - 7
Thẳng thắn và chú ý đến con đường đã đi, tôi hết lần này đến lần khác bị thuyết phục về tính đúng đắn của hướng đi đã chọn và nhận ra lợi ích của việc học trên cổng giáo dục JavaRush. Nhờ có nhiều nhiệm vụ thực tế khác nhau, người ta đã có thể lấy lại niềm hứng thú học lập trình vốn đã bị dập tắt hoàn toàn trong chương trình lỗi thời và nhàm chán đến bất ngờ của một cơ sở giáo dục đại học cùng hướng. Bốn tháng tích cực nghiên cứu tài liệu trong kho công nghệ phụ trợ đã đầu tư nhiều kiến ​​thức hơn so với cả năm tham dự các bài giảng và lớp học trong phòng thí nghiệm. Tin hay không. Tôi mong các bạn đừng nhượng bộ những khó khăn khi tiếp cận những tài liệu phức tạp, bởi vì nhờ vượt qua những trở ngại mà chúng ta trở nên tốt hơn và phát triển về mặt nghề nghiệp và cá nhân. Tôi hy vọng câu chuyện nhỏ này đã giúp tôi khám phá một số ý tưởng mới để sử dụng công cụ tuyệt vời có tên SpringBoot. PS Github .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION