Chủ đề này trình bày cách triển khai cơ bản về cách tạo tệp HTML bằng Java. Bạn có thể tạo tài liệu HTML bằng Java bằng các lệnh gọi API đơn giản. Các tệp HTML có thể được tạo nhanh chóng theo chương trình và có thể được sử dụng trong các ứng dụng khác nhau như tạo báo cáo hoặc hóa đơn
Các bước để tạo tệp HTML bằng Java
- Định cấu hình dự án của bạn bằng cách thêm Aspose. Tệp JAR HTML từ Kho lưu trữ Maven
- Khởi tạo một thể hiện đối tượng HTMLDocument trống
- Thêm thể hiện của lớp phần tử Văn bản để giữ văn bản cho tài liệu HTML
- Chèn phần tử Văn bản bên trong nội dung HTML
- Lưu tệp HTML đã tạo vào đĩa
Để tạo tệp HTML bằng Java, trước tiên chúng tôi sẽ tạo phiên bản HTMLDocument Class mặc định. Sử dụng phương thức createTextNode, chúng tôi sẽ thêm văn bản HTML mong muốn cho tài liệu. Sau đó, chúng tôi sẽ sử dụng Lớp văn bản để thêm văn bản HTML bên trong phần thân của HTML. Cuối cùng, chúng tôi sẽ lưu tài liệu HTML vào đĩa trong Java bằng cách sử dụng các lệnh gọi API đơn giản
Mã để tạo tài liệu HTML trong Java
Trong chủ đề trước, chúng ta đã học cách trích xuất văn bản từ tệp DXF bằng Java. Trong khi chủ đề này trong Java tạo tài liệu HTML có thể được sử dụng cho các báo cáo hoặc hóa đơn có thể được hiển thị trong trình duyệt
Cập nhật. kỹ thuật này không còn hoạt động vì phản ánh tên đã bị xóa trong các phiên bản Java sau này. Đây là một cách tiếp cận khác. Một cách sử dụng khác của phản xạ tham số lambda có thể là viết nội tuyến html trong Java. Nó cho phép chúng tôi tạo các trình xây dựng như thế này, bằng Java, nơi mà trước đây chúng tôi phải sử dụng một ngôn ngữ như Kotlin và một thư viện như Kara
String doc = html[ head[ meta[charset -> "utf-8"], link[rel->stylesheet, type->css, href->"/my.css"], script[type->javascript, src -> "/some.js"] ], body[ h1["Hello World", style->"font-size:200%;"], article[ p["Here is an interesting paragraph"], p[ "And another", small["small"] ], ul[ li["An"], li["unordered"], li["list"] ] ] ] ].asString[];
Chuỗi doc = html[ head[ meta[charset -> "utf-8"], link[rel->stylesheet, type->css, href->"/my. css"], script[type->javascript, src -> "/some. js"] ], nội dung [ h1["Xin chào thế giới", kiểu->"cỡ chữ. 200%;"], bài viết[ p["Đây là một đoạn thú vị"], p[ "Và một đoạn khác", small["nhỏ"] ], ul[ li["An"], li["không có thứ tự"], . với kiểu là chuỗi[];
Cái nào tạo ra html như
Hello World
Here is an interesting paragraph
And anothersmall
- An
- unordered
- list
Xin chào thế giới
Đây là một đoạn thú vị
Và một đoạn khác
Tạo mã
Tại sao bạn sẽ làm điều này? . e. g. chúng ta có thể lập trình tạo các đoạn văn
body[ asList["one","two","three"] .stream[] .map[number -> "Paragraph " + number] .map[content -> p[content]] ]
nội dung [ asList["một","hai","ba"]. dòng[]. map[số -> "Đoạn" + số]. map[nội dung -> p[nội dung]] ]
Trợ giúp từ Hệ thống Loại
Chúng tôi cũng có thể sử dụng hệ thống loại Java để giúp chúng tôi viết mã hợp lệ
Nó sẽ là một lỗi thời gian biên dịch để chỉ định một thuộc tính không hợp lệ cho liên kết rel
Đó là một lỗi thời gian biên dịch để bỏ qua một thẻ bắt buộc
Nó cũng là một lỗi thời gian biên dịch để có một thẻ body bên trong một thẻ p, bởi vì body không phải là
Chúng tôi cũng có thể đảm bảo rằng kích thước hình ảnh tính bằng pixel
Sự an toàn
Chúng tôi cũng có thể giúp giảm thiểu các cuộc tấn công chèn khi chèn nội dung từ người dùng vào phần đánh dấu của chúng tôi, bằng cách mã hóa html DSL bất kỳ nội dung nào được chuyển vào
e. g
assertEquals[ "<script src="attack.js"></script>
", p[""].asString[] ];
assertEquals[ "
", p[""].asString[] ];Làm thế nào nó hoạt động?
Xem bài đăng trên blog trước đây cho biết cách lấy tên tham số lambda với sự phản chiếu. Điều này cho phép chúng tôi chỉ định các cặp giá trị khóa cho các thuộc tính html khá rõ ràng
Tôi đã tạo một Attributetype chuyển đổi lambda thành thuộc tính html
public interface Attribute extends NamedValue { default String asString[] { return name[] + "=\"" + value[]+"\""; } }
public interface Attribute extends NamedValue { default String asString[] { return name[] + "=\"" + value[]+"\""; } }
Đối với bản thân các thẻ, chúng tôi khai báo một giao diện cho mỗi thẻ, với hệ thống phân cấp để cho phép các thẻ nhất định trong các ngữ cảnh nhất định. Ví dụ: Small là PhrasingContent và có thể nằm trong thẻ P
public interface Small extends PhrasingContent { default Small small[String content] { return [] -> tag["small", content]; } }
giao diện công cộng Mở rộng nhỏ PhrasingContent { mặc định Nhỏ nhỏ [Nội dung chuỗi] { return [] -> thẻ ["nhỏ", nội dung];
Để dễ dàng có sẵn tất cả các tên thẻ trong ngữ cảnh mà không cần phải nhập tĩnh nhiều thứ, chúng ta có thể tạo giao diện “mixin” kết hợp tất cả các thẻ
public interface HtmlDsl extends Html, Head, Body, Link, Meta, P, Script, H1, Li, Ul, Article, Small, Img ...
giao diện công khai HtmlDsl mở rộng Html, Head, Body, Link, Meta, P, Script, H1, Li, Ul, Article, Small, Img
Sau đó, nơi chúng tôi muốn viết html, chúng tôi chỉ cần làm cho lớp của chúng tôi triển khai HtmlDsl [Hoặc chúng tôi có thể nhập tĩnh các phương thức thay thế
Chúng tôi có thể đặt các hạn chế đối với thẻ nào hợp lệ bằng cách sử dụng các phương thức quá tải cho tên thẻ. e. g. HTML
public interface Html extends NoAttributes { default Html html[Head head, Body body] { ...
giao diện công khai Html extends NoAttributes { default Html html[Head head, Body body] {
và hạn chế các loại thuộc tính bằng cách sử dụng enum hoặc các loại trình bao bọc khác. Ở đây thẻ Img chỉ có thể có số đo bằng pixel
________số 8
public interface Img extends NoChildren { default Img img[Attribute src, Attribute dim1, Attribute dim2] { ...
Tất cả các mã có sẵn trên github để chơi với. Hãy xem bài kiểm tra này để biết các ví dụ thực thi. N. b. nó chỉ là một bằng chứng về khái niệm vào thời điểm này. Chỉ có đủ mã tồn tại để minh họa các ví dụ trong bài đăng trên blog này