Giới thiệu cách chơi trong Java

1. Khái quát chung

Mục đích của hướng dẫn giới thiệu này là khám phá Play Framework và tìm ra cách chúng ta có thể tạo ứng dụng web với nó.

Play là một khung ứng dụng web năng suất cao dành cho các ngôn ngữ lập trình có mã được biên dịch và chạy trên JVM, chủ yếu là Java và Scala. Nó tích hợp các thành phần và API chúng ta cần để phát triển ứng dụng web hiện đại.

2. Thiết lập khung chơi

Hãy truy cập trang chính thức của khung Play và tải xuống phiên bản mới nhất của bản phân phối. Tại thời điểm hướng dẫn này, phiên bản mới nhất là phiên bản 2.7.

Chúng tôi sẽ tải xuống thư mục zip hướng dẫn Play Java Hello World và giải nén tệp vào một vị trí thuận tiện. Tại thư mục gốc của thư mục này, chúng tôi sẽ tìm thấy một tệp thực thi sbt mà chúng tôi có thể sử dụng để chạy ứng dụng. Ngoài ra, chúng tôi có thể cài đặt sbt từ trang chính thức của họ.

Để sử dụng sbt từ thư mục đã tải xuống, hãy làm như sau:

cd /path/to/folder/ ./sbt run

Lưu ý rằng chúng tôi đang chạy một tập lệnh trong thư mục hiện tại, do đó sử dụng cú pháp ./ .

Nếu chúng tôi cài đặt sbt, thì chúng tôi có thể sử dụng nó thay thế:

cd /path/to/folder/ sbt run

Sau khi chạy lệnh này, chúng ta sẽ thấy một câu lệnh có nội dung “(Máy chủ đã khởi động, sử dụng Enter để dừng và quay lại bảng điều khiển…)”. Điều này có nghĩa là ứng dụng của chúng tôi đã sẵn sàng, do đó, bây giờ chúng tôi có thể truy cập // localhost: 9000 , nơi chúng tôi sẽ được giới thiệu với trang Chào mừng Play:

3. Giải phẫu các ứng dụng Play

Trong phần này, chúng ta sẽ hiểu rõ hơn về cách ứng dụng Play được cấu trúc và mỗi tệp và thư mục trong cấu trúc đó được sử dụng để làm gì.

Nếu bạn muốn thử thách bản thân với một ví dụ đơn giản ngay lập tức, hãy chuyển sang phần tiếp theo.

Đây là các tệp và thư mục chúng tôi tìm thấy trong một ứng dụng Play Framework điển hình:

├── app → Application sources │   ├── assets → Compiled Asset sources │   │   ├── javascripts → Typically Coffee Script sources │   │   └── stylesheets → Typically LESS CSS sources │   ├── controllers → Application controllers │   ├── models → Application business layer │   └── views → Templates ├── build.sbt → Application build script ├── conf → Configurations files and other non-compiled resources (on classpath) │   ├── application.conf → Main configuration file │   └── routes → Routes definition ├── dist → Arbitrary files to be included in your projects distribution ├── lib → Unmanaged libraries dependencies ├── logs → Logs folder │   └── application.log → Default log file ├── project → sbt configuration files │   ├── build.properties → Marker for sbt project │   └── plugins.sbt → sbt plugins including the declaration for Play itself ├── public → Public assets │   ├── images → Image files │   ├── javascripts → Javascript files │   └── stylesheets → CSS files ├── target → Generated files │   ├── resolution-cache → Information about dependencies │   ├── scala-2.11 │   │   ├── api → Generated API docs │   │   ├── classes → Compiled class files │   │   ├── routes → Sources generated from routes │   │   └── twirl → Sources generated from templates │   ├── universal → Application packaging │   └── web → Compiled web assets └── test → source folder for unit or functional tests 

3.1. Các ứng dụng thư mục

Thư mục này chứa mã nguồn Java, các mẫu web và các nguồn của tài sản đã biên dịch - về cơ bản, tất cả các nguồn và tất cả các tài nguyên thực thi.

Thư mục ứng dụng chứa một số thư mục con quan trọng, mỗi thư mục đóng gói một phần của mẫu kiến ​​trúc MVC:

  • mô hình - đây là lớp nghiệp vụ ứng dụng, các tệp trong gói này có thể sẽ mô hình hóa các bảng cơ sở dữ liệu của chúng tôi và cho phép chúng tôi truy cập lớp bền vững
  • chế độ xem - tất cả các mẫu HTML có thể được hiển thị cho trình duyệt đều được chứa trong thư mục này
  • bộ điều khiển - một thư mục con trong đó chúng ta có bộ điều khiển của mình. Bộ điều khiển là các tệp nguồn Java chứa các hành động được thực thi cho mỗi lệnh gọi API. Các hành động là các phương thức công khai xử lý các yêu cầu HTTP và trả về kết quả giống như các phản hồi HTTP
  • nội dung - một thư mục con chứa các nội dung đã biên dịch như CSS và javascript. Các quy ước đặt tên ở trên rất linh hoạt, chúng ta có thể tạo các gói của mình, ví dụ như gói app / utils . Chúng tôi cũng có thể tùy chỉnh ứng dụng đặt tên gói / com / baeldung / controllers

Nó cũng chứa các tệp và thư mục tùy chọn khi ứng dụng cụ thể cần.

3.2. Các công mục

Các tài nguyên được lưu trữ trong thư mục công cộng là các tài sản tĩnh được phục vụ trực tiếp bởi máy chủ Web.

Thư mục này thường có ba thư mục con cho các tệp hình ảnh, CSS và JavaScript. Chúng tôi khuyên bạn nên tổ chức các tệp nội dung như thế này để có tính nhất quán trong tất cả các ứng dụng Play.

3.3. Các conf mục

Thư mục conf chứa các tệp cấu hình ứng dụng. Các application.conf là nơi chúng tôi sẽ đặt hầu hết các thuộc tính cấu hình cho ứng dụng Play. Chúng tôi sẽ xác định các điểm cuối cho ứng dụng trong các tuyến .

Nếu ứng dụng cần bất kỳ tệp cấu hình bổ sung nào, chúng nên được đặt trong thư mục này.

3.4. Các lib mục

Thư mục lib là tùy chọn và chứa các phụ thuộc thư viện không được quản lý. Nếu chúng tôi có bất kỳ lọ nào không được chỉ định trong hệ thống xây dựng, chúng tôi đặt chúng vào thư mục này. Chúng sẽ được thêm tự động vào classpath của ứng dụng.

3.5. Các build.sbt file

Tệp build.sbt là tập lệnh xây dựng ứng dụng. Đây là nơi chúng tôi liệt kê các phụ thuộc cần thiết để chạy ứng dụng, chẳng hạn như thư viện kiểm tra và độ bền.

3.6. Các dự án mục

Tất cả các tệp cấu hình quá trình xây dựng dựa trên SBT đều được tìm thấy trong thư mục dự án .

3.7. Các mục tiêu mục

Thư mục này chứa tất cả các tệp được tạo bởi hệ thống xây dựng - ví dụ: tất cả các tệp .class .

Sau khi xem và khám phá cấu trúc thư mục cho ví dụ Play Framework Hello World mà chúng tôi vừa tải xuống, bây giờ chúng ta có thể xem qua các nguyên tắc cơ bản của khung bằng cách sử dụng một ví dụ.

4. Ví dụ đơn giản

Trong phần này, chúng tôi sẽ tạo một ví dụ rất cơ bản về ứng dụng web. Chúng tôi sẽ sử dụng ứng dụng này để tự làm quen với các nguyên tắc cơ bản của khung Play.

Thay vì tải một dự án ví dụ và xây dựng từ nó, chúng ta hãy xem một cách khác chúng ta có thể tạo ra một ứng dụng Play Framework, bằng cách sử dụng mới SBT lệnh .

Hãy mở dấu nhắc lệnh, điều hướng đến vị trí bạn chọn và thực hiện lệnh sau:

sbt new playframework/play-java-seed.g8

Đối với điều này, chúng tôi sẽ cần phải cài đặt sbt như đã giải thích trong Phần 2.

Lệnh trên sẽ nhắc chúng ta đặt tên cho dự án trước tiên. Tiếp theo, nó sẽ yêu cầu miền (ngược lại, cũng như quy ước đặt tên gói trong Java) sẽ được sử dụng cho các gói. Chúng tôi nhấn Enter mà không cần nhập tên nếu chúng tôi muốn giữ các giá trị mặc định được đặt trong dấu ngoặc vuông.

Ứng dụng được tạo bằng lệnh này có cấu trúc giống như ứng dụng được tạo trước đó. Do đó, chúng tôi có thể tiến hành chạy ứng dụng như đã làm trước đây:

cd /path/to/folder/ sbt run

Lệnh trên, sau khi hoàn thành thực thi, sẽ tạo ra một máy chủ trên cổng số 9000 để hiển thị API của chúng tôi , chúng tôi có thể truy cập thông qua // localhost: 9000 . Chúng ta sẽ thấy thông báo “Chào mừng bạn đến với Chơi” trên trình duyệt.

API mới của chúng tôi có hai điểm cuối mà bây giờ chúng tôi có thể thử lần lượt từ trình duyệt. Điểm đầu tiên - mà chúng tôi vừa tải - là điểm cuối gốc, tải một trang chỉ mục với thông báo "Chào mừng bạn đến với Chơi!" thông điệp.

The second one, at //localhost:9000/assets, is meant for downloading files from the server by adding a file name to the path. We can test this endpoint by getting the favicon.png file, which was downloaded with the application, at //localhost:9000/assets/images/favicon.png.

5. Actions and Controllers

A Java method inside a controller class that processes request parameters and produces a result to be sent to the client is called an action.

A controller is a Java class that extends play.mvc.Controller that logically groups together actions that may be related to results they produce for the client.

Let's now head over to app-parent-dir/app/controllers and pay attention to HomeController.java.

The HomeController‘s index action returns a web page with a simple welcome message:

public Result index() { return ok(views.html.index.render()); }

This web page is the default index template in the views package:

@main("Welcome to Play") {  }

As shown above, the index page calls the main template. The main template then handles the rendering of the page header and body tags. It takes two arguments: a String for the title of the page and an Html object to insert into the body of the page.

@(title: String)(content: Html)    @* Here's where we render the page title `String`. *@ @title     @* And here's where we render the `Html` object containing * the page content. *@ @content   

Let's change the text in the index file a little:

@main("Welcome to Baeldung") {  }

Reloading the browser will give us a bold heading:

Welcome to Play Framework Tutorial on Baeldung!

We can do away with the template completely by removing the render directive in the index() method of the HomeController so that we can return plain text or HTML text directly:

public Result index() { return ok("REST API with Play by Baeldung"); }

After editing the code, as shown above, we'll have only the text in the browser. This will just be plain text without any HTML or styling:

REST API with Play by Baeldung

We could just as well output HTML by wrapping the text in the header tags and then passing the HTML text to the Html.apply method. Feel free to play around with it.

Let's add a /baeldung/html endpoint in routes:

GET /baeldung/html controllers.HomeController.applyHtml

Now let's create the controller that handles requests on this endpoint:

public Result applyHtml() { return ok(Html.apply("")); }

When we visit //localhost:9000/baeldung/html we'll see the above text formatted in HTML.

We've manipulated our response by customizing the response type. We'll look into this feature in more detail in a later section.

We have also seen two other important features of the Play Framework.

First, reloading the browser reflects the most recent version of our code; that's because our code changes are compiled on the fly.

Secondly, Play provides us with helper methods for standard HTTP responses in the play.mvc.Results class. An example is the ok() method, which returns an OK HTTP 200 response alongside the response body we pass to it as a parameter. We've already used the method displaying text in the browser.

There are more helper methods such as notFound() and badRequest() in the Results class.

6. Manipulating Results

We have been benefiting from Play's content negotiation feature without even realizing it. Play automatically infers response content type from the response body. This is why we have been able to return the text in the ok method:

return ok("text to display");

And then Play would automatically set the Content-Type header to text/plain. Although this works in most cases, we can take over control and customize the content type header.

Hãy tùy chỉnh phản hồi cho hành động HomeController.customContentType thành văn bản / html :

public Result customContentType() { return ok("This is some text content").as("text/html"); }

Mô hình này cắt trên tất cả các loại nội dung. Tùy thuộc vào định dạng của dữ liệu mà chúng tôi chuyển đến phương thức trợ giúp ok , chúng tôi có thể thay thế văn bản / html bằng văn bản / đơn giản hoặc ứng dụng / json .

Chúng ta có thể làm điều gì đó tương tự như đặt tiêu đề:

public Result setHeaders() { return ok("This is some text content") .as("text/html") .withHeader("Header-Key", "Some value"); }

7. Kết luận

Trong bài viết này, chúng ta đã tìm hiểu những kiến ​​thức cơ bản về Play Framework. Chúng tôi cũng có thể tạo một ứng dụng web Java cơ bản bằng Play.

Như thường lệ, mã nguồn cho hướng dẫn này có sẵn trên GitHub.