Làm cách nào để kiểm tra xem một biến có tồn tại trong mẫu FreeMarker không?


175

Tôi có một mẫu Freemarker chứa một loạt các trình giữ chỗ cho các giá trị được cung cấp khi mẫu được xử lý. Tôi muốn bao gồm một cách có điều kiện một phần của mẫu nếu biến userName được cung cấp, đại loại như:

[#if_exists userName]
  Hi ${userName}, How are you?
[/#if_exists]

Tuy nhiên, hướng dẫn sử dụng FreeMarker dường như chỉ ra rằng if_exists không được dùng nữa, nhưng tôi không thể tìm ra cách khác để đạt được điều này. Tất nhiên, tôi có thể đơn giản cung cấp một biến boolean bổ sung làUserName và sử dụng như thế này:

[#if isUserName]
  Hi ${userName}, How are you?
[/#if]

Nhưng nếu có cách kiểm tra xem userName có tồn tại hay không thì tôi có thể tránh thêm biến phụ này.

Câu trả lời:


304

Để kiểm tra xem giá trị có tồn tại không:

[#if userName??]
   Hi ${userName}, How are you?
[/#if]

Hoặc với cú pháp freemarker tiêu chuẩn:

<#if userName??>
   Hi ${userName}, How are you?
</#if>

Để kiểm tra xem giá trị có tồn tại và không trống:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>

1
Trong trường hợp bất kỳ ai khác bị loại bỏ bởi điều này, cú pháp #if nên được bao quanh bởi ít hơn và lớn hơn các ký tự thay vì dấu ngoặc. ví dụ: <#if userName ??>
Cameron

Nó thực sự là có thể sử dụng cú pháp này, vì vậy tôi chỉ theo cú pháp của câu hỏi: xem freemarker.sourceforge.net/docs/...
Ulf Lindback

10
Điều này chỉ kiểm tra nếu var tồn tại. Nhưng nếu bạn có một Chuỗi trống trong "userName", <#if userName ??> sẽ trả về đúng !! Xem câu trả lời @ user1546081 trên trang này để giải quyết vấn đề này.
Adrien Be

94

Điều này có vẻ là một phù hợp hơn:

<#if userName?has_content>
... do something
</#if>

http://freemarker.sourceforge.net/docs/ref_builtins_expert.html


2
Có vẻ để kiểm tra xem var tồn tại VÀ nếu nội dung của nó không rỗng hoặc trống (tham khảo Chuỗi rỗng ở đây).
Adrien Be

4
Phải hạ cấp điều này vì về mặt kỹ thuật không chính xác và sẽ dẫn đến hành vi không mong muốn (âm tính giả) nếu biến tồn tại (những gì op muốn kiểm tra) nhưng trống rỗng.
Madbreaks

65

Ngoài ra tôi nghĩ if_exists đã được sử dụng như:

Hi ${userName?if_exists}, How are you?

sẽ không phá vỡ nếu userName là null, kết quả nếu null sẽ là:

Hi , How are you?

if_exists hiện không được dùng nữa và đã được thay thế bằng toán tử mặc định! như trong

Hi ${userName!}, How are you?

toán tử mặc định cũng hỗ trợ một giá trị mặc định, chẳng hạn như:

Hi ${userName!"John Doe"}, How are you?

1
Toán tử giá trị mặc định không thể được sử dụng để đánh giá boolean. Như vậy, nó không thể được sử dụng trong một iftuyên bố như op yêu cầu.
Madbreaks

5

Tôi nghĩ rằng rất nhiều người đang muốn có thể kiểm tra xem liệu biến của họ không trống cũng như nếu nó tồn tại. Tôi nghĩ rằng kiểm tra sự tồn tại và trống rỗng là một ý tưởng tốt trong nhiều trường hợp và làm cho mẫu của bạn mạnh mẽ hơn và ít bị lỗi ngớ ngẩn hơn. Nói cách khác, nếu bạn kiểm tra để đảm bảo biến của bạn không rỗng và không trống trước khi sử dụng nó, thì mẫu của bạn sẽ trở nên linh hoạt hơn, bởi vì bạn có thể ném một biến null hoặc một chuỗi rỗng vào nó và nó sẽ hoạt động như nhau Trong cả hai trường hợp.

<#if p?? && p?has_content>1</#if>

Giả sử bạn muốn đảm bảo rằng đó pkhông chỉ là khoảng trắng. Sau đó, bạn có thể cắt nó trước khi kiểm tra xem nó has_content.

<#if p?? && p?trim?has_content>1</#if>

CẬP NHẬT

Vui lòng bỏ qua đề xuất của tôi - has_contentlà tất cả những gì cần thiết, vì nó thực hiện kiểm tra null cùng với kiểm tra trống. Làm p?? && p?has_contentlà tương đương với p?has_content, vì vậy bạn cũng có thể chỉ cần sử dụng has_content.


2

Đối với các phiên bản trước FreeMarker 2.3.7

Bạn không thể sử dụng ??để xử lý các giá trị bị thiếu, cú pháp cũ là:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.