2009-03-28 49 views
5

Khi tôi viết các ứng dụng web Java, tôi thường sử dụng các thẻ JSTL. Tôi nghĩ rằng các thẻ này là tuyệt vời, ngoại trừ một điều làm tôi bực mình: trong khi ngôn ngữ biểu thức cho phép bạn truy cập các thuộc tính bean, nó không cho phép bạn gọi các phương thức của nó.Các cuộc gọi phương thức trong EL

Trong bản phát hành 1.0, thậm chí không thể lấy độ dài của chuỗi hoặc số phần tử trong bộ sưu tập. Kể từ phiên bản 1.1, fn: chức năng chiều dài đã được thêm vào, vì vậy bạn có thể làm những việc như thế này:

... 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
... 
<c:if test="${fn:length(str) > 10}"> 
    ... 
</c:if> 
... 

Đó là tiết hơn và xấu xí hơn (IMHO đó là) hơn:

... 
<c:if test="${str.length() > 10}"> 
    ... 
</c:if> 
... 

Nó cho thấy rằng JSTL 2.0 sẽ cho phép bạn định nghĩa các hàm mới, nhưng bạn sẽ cần phải viết một lớp đặc biệt cho mục đích đó, trong đó bạn sẽ định nghĩa các phương thức (tĩnh) của bạn, và bạn cũng cần phải viết một tệp TLD sẽ được bao gồm trong mỗi jsp sẽ sử dụng các chức năng này.

Cho dù bạn xác định chức năng tùy chỉnh hoặc bạn sử dụng cách giải quyết khác, bạn có nhiều mã bổ sung để viết.

Tôi đã đọc ở đâu đó rằng JCP đã tự nguyện không cho phép gọi phương thức từ ngôn ngữ biểu thức.

Bất kỳ ai trong các bạn có thể giúp tôi hiểu tại sao JCP lại làm điều này cho chúng tôi?

+0

Đây là cái gì đó đã luôn luôn hoàn toàn nướng mì của tôi. Không thể hiểu tại sao điều này không thể được cho phép trong EL –

Trả lời

3

Tính năng bạn muốn được xác định trong JSR 245 (more here). Nếu bạn muốn ngay bây giờ, hãy tải xuống từ UEL project hoặc triển khai thay thế (ví dụ: JUEL). Nếu bạn cần phải chờ đợi nó là một phần của tiêu chuẩn, nó sẽ được bao gồm trong JEE6. Cho đến lúc đó ... tốt, bạn đã biết các lựa chọn của mình.

0

Tôi hy vọng mục tiêu là để thực thi phân tách chế độ xem theo mô hình chặt chẽ, như trong StringTemplate.

Ý tưởng khá đơn giản: Nếu bạn không có quyền truy cập vào các phương pháp, thì bạn buộc phải tính toán tất cả dữ liệu của mình trong bộ điều khiển và sau đó chỉ định dạng dữ liệu trong chế độ xem. Tất nhiên họ đã lén lút thông điệp bằng cách cho phép bạn có quyền truy cập vào các chức năng và họ không được giúp đỡ bởi việc xây dựng danh sách bản đồ các bộ dữ liệu (đọc: dữ liệu có cấu trúc không có các lớp) trong Java như trong Python, Ruby, v.v.

Dù sao, đây là một bài viết viết một thẻ cho phép bạn gọi arbitrary methods, có thể thấy nó hữu ích.

+0

Tôi không hiểu được: vẫn có thể làm được, điều đó chỉ gây đau đớn hơn. Bên cạnh đó, nó thường buộc các mô hình phải nhận thức được những gì được thực hiện trong quan điểm trong khi IMHO xem nên có khả năng hiển thị trên mô hình và không phải là cách khác xung quanh. –

+0

Hầu hết các điểm của khung nhìn trong MVC trái ngược với thao tác trực tiếp là khung nhìn có logic để chuyển đổi mô hình, giống như một khung nhìn trong SQL có thể nối và lọc nhiều bảng. Hạn chế nó đến một động cơ templating dường như daft. –

4

Bất kỳ ai trong các bạn có thể giúp tôi hiểu tại sao JCP lại làm điều này cho chúng tôi?

Đó là một phần của tư duy bondage and discipline của một tập hợp con các lập trình viên Java nhất định biết The True Way mà mọi người nên viết ứng dụng.

Bạn không thể tin cậy có ngôn ngữ được hỗ trợ đầy đủ khi viết mẫu, bởi vì bạn có thể lạm dụng nó để kết hợp logic kinh doanh và bản trình bày giống như những trình lập trình PHP khủng khiếp, không hoạt động. Eurgh, hãy tưởng tượng!

Người lập trình là kẻ thù, và phải được ngăn cản làm Ác ma. Nó có thể chỉ ra rằng các lập trình viên thực sự chỉ là bạn đang cố gắng để gỡ lỗi một cái gì đó, hoặc đặt một hack nhanh chóng để có được các ứng dụng đang chạy tạm thời.Hoặc nó có thể chỉ ra rằng có một điều như logic trình bày, và làm cho bạn di chuyển công cụ đó ra thành một loạt các lớp tag và bean trong ứng dụng của bạn cũng khó chịu như cách khác.

Nhưng điều đó không quan trọng! Thật đáng tiếc khi bạn phục vụ mục đích bảo vệ sự trinh tiết của Java.

[Xin lỗi vì tiếng súng, nhưng nó đã là một câu hỏi khá rùng rợn.]

PS. Luôn luôn có Groovy.

+1

LOL. Tôi đánh giá cao sự hài hước của bạn –

2

Hãy xem Seam! Với Seam, EL đã trở thành con đường của nó. Các phương thức gọi ngay cả với các tham số hoạt động như một cách dễ dàng.

Các vấn đề liên quan