Groovy - Thợ xây

Trong quá trình phát triển phần mềm, đôi khi các nhà phát triển dành nhiều thời gian để tạo cấu trúc dữ liệu, lớp miền, XML, bố cục GUI, luồng đầu ra, v.v. Và đôi khi mã được sử dụng để tạo các yêu cầu cụ thể này dẫn đến việc thay đổi lại cùng một đoạn mã mã ở nhiều nơi. Đây là nơi các nhà xây dựng Groovy phát huy tác dụng. Groovy có các trình xây dựng có thể được sử dụng để tạo các đối tượng và cấu trúc tiêu chuẩn. Những trình xây dựng này tiết kiệm thời gian vì nhà phát triển không cần phải viết mã của riêng họ để tạo những trình xây dựng này. Trong phần kết của chương này, chúng ta sẽ xem xét các trình xây dựng khác nhau có sẵn trong Groovy.

Người xây dựng xích đu

Trong Groovy, người ta cũng có thể tạo giao diện người dùng đồ họa bằng cách sử dụng các trình tạo swing có sẵn trong groovy. Lớp chính để phát triển các thành phần swing là lớp SwingBuilder. Lớp này có nhiều phương thức để tạo các thành phần đồ họa như:

  • JFrame - Cái này để tạo phần tử khung.

  • JTextField - Điều này được sử dụng để tạo thành phần trường văn bản.

Hãy xem một ví dụ đơn giản về cách tạo một ứng dụng Swing bằng cách sử dụng lớp SwingBuilder. Trong ví dụ sau, bạn có thể thấy những điểm sau:

  • Bạn cần nhập các lớp groovy.swing.SwingBuilder và javax.swing. *.

  • Tất cả các thành phần được hiển thị trong ứng dụng Swing là một phần của lớp SwingBuilder.

  • Đối với chính khung, bạn có thể chỉ định vị trí và kích thước ban đầu của khung. Bạn cũng có thể chỉ định tiêu đề của khung.

  • Bạn cần đặt thuộc tính Visibility thành true để khung được hiển thị.

import groovy.swing.SwingBuilder 
import javax.swing.* 

// Create a builder 
def myapp = new SwingBuilder()

// Compose the builder 
def myframe = myapp.frame(title : 'Tutorials Point', location : [200, 200], 
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE {         
      label(text : 'Hello world')
   } 
	
// The following  statement is used for displaying the form 
frame.setVisible(true)

Kết quả của chương trình trên được đưa ra dưới đây. Kết quả đầu ra sau đây cho thấy một JFrame cùng với một JLabel với nội dung Hello World.

Hãy xem ví dụ tiếp theo của chúng tôi để tạo màn hình nhập với các hộp văn bản. Trong ví dụ sau, chúng ta muốn tạo một biểu mẫu có các hộp văn bản cho Tên học sinh, môn học và Tên trường. Trong ví dụ sau, bạn có thể thấy những điểm chính sau:

  • Chúng tôi đang xác định bố cục cho các điều khiển của chúng tôi trên màn hình. Trong trường hợp này, chúng tôi đang sử dụng Bố cục Lưới.
  • Chúng tôi đang sử dụng thuộc tính căn chỉnh cho các nhãn của chúng tôi.
  • Chúng tôi đang sử dụng phương thức textField để hiển thị các hộp văn bản trên màn hình.
import groovy.swing.SwingBuilder 
import javax.swing.* 
import java.awt.*
 
// Create a builder 
def myapp = new SwingBuilder() 

// Compose the builder 
def myframe = myapp.frame(title : 'Tutorials Point', location : [200, 200], 
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) { 
      panel(layout: new GridLayout(3, 2, 5, 5)) { 
         label(text : 'Student Name:', horizontalAlignment : JLabel.RIGHT) 
         textField(text : '', columns : 10) 
			
         label(text : 'Subject Name:', horizontalAlignment : JLabel.RIGHT) 
         textField(text : '', columns : 10)
			
         label(text : 'School Name:', horizontalAlignment : JLabel.RIGHT) 
         textField(text : '', columns : 10) 
      } 
   } 
	
// The following  statement is used for displaying the form 
myframe.setVisible(true)

Đầu ra của chương trình trên được đưa ra dưới đây:

Trình xử lý sự kiện

Bây giờ chúng ta hãy xem xét các trình xử lý sự kiện. Bộ xử lý sự kiện được sử dụng cho nút để thực hiện một số loại xử lý khi một nút được nhấn. Mỗi lệnh gọi giả hiệu nút bao gồm tham số actionPerformed. Điều này đại diện cho một khối mã được trình bày dưới dạng đóng.

Hãy xem ví dụ tiếp theo để tạo một màn hình có 2 nút. Khi nhấn một trong hai nút, một thông báo tương ứng sẽ được gửi đến màn hình điều khiển. Trong ví dụ sau, bạn có thể thấy những điểm chính sau:

  • Đối với mỗi nút được xác định, chúng tôi đang sử dụng phương thức actionPerformed và xác định một cách đóng để gửi một số đầu ra đến bảng điều khiển khi nút được nhấp.

import groovy.swing.SwingBuilder 
import javax.swing.* 
import java.awt.* 

def myapp = new SwingBuilder()
  
def buttonPanel = {
   myapp.panel(constraints : BorderLayout.SOUTH) {
	
      button(text : 'Option A', actionPerformed : {
         println 'Option A chosen'
      })
		
      button(text : 'Option B', actionPerformed : {
         println 'Option B chosen'
      })
   }
}
  
def mainPanel = {
   myapp.panel(layout : new BorderLayout()) {
      label(text : 'Which Option do you want', horizontalAlignment : 
      JLabel.CENTER,
      constraints : BorderLayout.CENTER)
      buttonPanel()
   }
}
  
def myframe = myapp.frame(title : 'Tutorials Point', location : [100, 100],
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE){
      mainPanel()
   }
	
myframe.setVisible(true)

Kết quả của chương trình trên được đưa ra dưới đây. Khi bạn nhấp vào một trong hai nút, thông báo bắt buộc sẽ được gửi đến màn hình nhật ký bảng điều khiển.

Một biến thể khác của ví dụ trên là xác định các phương thức có thể hoạt động như trình xử lý. Trong ví dụ sau, chúng tôi đang xác định 2 trình xử lý DisplayA và DisplayB.

import groovy.swing.SwingBuilder 
import javax.swing.* 
import java.awt.* 

def myapp = new SwingBuilder()
  
def DisplayA = {
   println("Option A") 
} 

def DisplayB = {
   println("Option B")
}

def buttonPanel = {
   myapp.panel(constraints : BorderLayout.SOUTH) {
      button(text : 'Option A', actionPerformed : DisplayA) 
      button(text : 'Option B', actionPerformed : DisplayB)
   }
}  

def mainPanel = {
   myapp.panel(layout : new BorderLayout()) {
      label(text : 'Which Option do you want', horizontalAlignment : JLabel.CENTER,
      constraints : BorderLayout.CENTER)
      buttonPanel()
   }
}  

def myframe = myapp.frame(title : 'Tutorials Point', location : [100, 100],
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) {
      mainPanel()
   } 
	
myframe.setVisible(true)

Đầu ra của chương trình trên sẽ vẫn giống như ví dụ trước đó.

Trình tạo DOM

Trình tạo DOM có thể được sử dụng để phân tích cú pháp HTML, XHTML và XML và chuyển đổi nó thành cây DOM W3C.

Ví dụ sau cho thấy cách sử dụng trình tạo DOM.

String records = '''
   <library>
	
      <Student>
         <StudentName division = 'A'>Joe</StudentName>
         <StudentID>1</StudentID>
      </Student>
	  
      <Student>
         <StudentName division = 'B'>John</StudentName>
         <StudentID>2</StudentID>
      </Student>
	  
      <Student>
         <StudentName division = 'C'>Mark</StudentName>
         <StudentID>3</StudentID>
      </Student>
		
   </library>'''
   
def rd = new StringReader(records) 
def doc = groovy.xml.DOMBuilder.parse(rd)

JsonBuilder

JsonBuilder được sử dụng để tạo các đối tượng kiểu json.

Ví dụ sau đây cho thấy cách sử dụng trình tạo Json.

def builder = new groovy.json.JsonBuilder() 

def root = builder.students {
   student {
      studentname 'Joe'
      studentid '1'
		
      Marks(
         Subject1: 10,
         Subject2: 20,
         Subject3:30,
      )
   } 
} 
println(builder.toString());

Kết quả của chương trình trên được đưa ra dưới đây. Kết quả clearlt đầu ra cho thấy Jsonbuilder đã có thể xây dựng đối tượng json từ một tập hợp các nút có cấu trúc.

{"students":{"student":{"studentname":"Joe","studentid":"1","Marks":{"Subject1":10,
"S ubject2":20,"Subject3":30}}}}

Jsonbuilder cũng có thể lấy một danh sách và chuyển đổi nó thành một đối tượng json. Ví dụ sau đây cho thấy cách này có thể được thực hiện.

def builder = new groovy.json.JsonBuilder() 
def lst = builder([1, 2, 3]) 
println(builder.toString());

Kết quả của chương trình trên được đưa ra dưới đây.

[1,2,3]

JsonBuilder cũng có thể được sử dụng cho các lớp. Ví dụ sau đây cho thấy cách các đối tượng của một lớp có thể trở thành đầu vào cho trình tạo json.

def builder = new groovy.json.JsonBuilder() 

class Student {
   String name  
} 

def studentlist = [new Student (name: "Joe"), new Student (name: "Mark"), 
   new Student (name: "John")] 
	
builder studentlist, { Student student ->name student.name} 
println(builder)

Kết quả của chương trình trên được đưa ra dưới đây.

[{"name":"Joe"},{"name":"Mark"},{"name":"John"}]

NodeBuilder

NodeBuilder được sử dụng để tạo cây lồng nhau của các đối tượng Node để xử lý dữ liệu tùy ý. Dưới đây là một ví dụ về cách sử dụng Nodebuilder.

def nodeBuilder = new NodeBuilder() 

def studentlist = nodeBuilder.userlist {
   user(id: '1', studentname: 'John', Subject: 'Chemistry')
   user(id: '2', studentname: 'Joe', Subject: 'Maths')
   user(id: '3', studentname: 'Mark', Subject: 'Physics') 
} 

println(studentlist)

FileTreeBuilder

FileTreeBuilder là một trình xây dựng để tạo cấu trúc thư mục tệp từ một đặc tả. Sau đây là một ví dụ về cách sử dụng FileTreeBuilder.

tmpDir = File.createTempDir() 
def fileTreeBuilder = new FileTreeBuilder(tmpDir) 

fileTreeBuilder.dir('main') {
   dir('submain') {
      dir('Tutorial') {
        file('Sample.txt', 'println "Hello World"')
      }
   } 
}

Từ việc thực thi đoạn mã trên, một tệp có tên là sample.txt sẽ được tạo trong thư mục main / submain / Tutorial. Và tệp sample.txt sẽ có nội dung là “Hello World”.