2011-11-07 21 views
23

Cách lặp lại đầu ra của một số nội dung trong JSF bằng cách sử dụng chỉ thẻ tiêu chuẩn (ui :, h: v.v ...)? Nói cách khác - làm thế nào để làm tương đương với mã PHP dưới đây trong JSF? Tôi ngay lập tức muốn tận dụng lợi thế của ui:repeat, nhưng nó cần thu thập - Tôi chỉ có số.Làm thế nào để lặp lại đầu ra của văn bản thông qua đơn giản cho vòng lặp trong Facelets mà không có mô hình?

for ($i = 0; $i < 10; $i++) { 
    echo "<div>content</div>"; 
} 

Trả lời

36

Hoặc sử dụng <c:forEach> thay vì (true, trộn JSTL với JSF đôi khi được tán thành, nhưng điều này không nên làm hại trong trường hợp cụ thể của bạn bởi vì bạn dường như muốn tạo quan điểm "tĩnh", nó không phụ thuộc vào bất kỳ biến động):

xmlns:c="http://java.sun.com/jsp/jstl/core" 
... 
<c:forEach begin="1" end="10"> 
    <div>content</div> 
</c:forEach> 

Hoặc tạo ra một chức năng EL để tạo ra một mảng giả cho <ui:repeat>:

package com.example.util; 

public final class Functions { 

    private Functions() { 
     // 
    } 

    public static Object[] createArray(int size) { 
     return new Object[size]; 
    } 
} 

được đăng ký tại /WEB-INF/util.taglib.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" 
    version="2.0"> 
    <namespace>http://example.com/util/functions</namespace> 
    <function> 
     <function-name>createArray</function-name> 
     <function-class>com.example.util.Functions</function-class> 
     <function-signature>Object[] createArray(int)</function-signature> 
    </function> 
</facelet-taglib> 

và đang được sử dụng như sau

xmlns:util="http://example.com/util/functions" 
... 
<ui:repeat value="#{util:createArray(10)}"> 
    <div>content</div> 
</ui:repeat> 

Cập nhật: Tôi chỉ đăng một yêu cầu tăng cường thêm beginend thuộc tính để <ui:repeat>: http://java.net/jira/browse/JAVASERVERFACES-2240

Cập nhật 2: Tôi đã đích thân thực hiện nó cho JSF 2.3 theo https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1102 Kể từ cá móm 2.3-m06 bạn phải có khả năng sử dụng

<ui:repeat begin="1" end="10"> 
    <div>content</div> 
</ui:repeat> 
+1

Thật kỳ lạ, facelets không hỗ trợ điều này ... – jFrenetic

+0

@jFrenetic: Tôi khá chắc chắn rằng điều này đã từng được báo cáo/yêu cầu trong cơ sở dữ liệu vấn đề JSF/Facelets, nhưng sau khi tìm kiếm nhiều hơn 15 phút, tôi không thể tìm thấy gì cả. – BalusC

+0

@BalusC Bạn nghĩ gì về việc trộn JSTL vào ứng dụng web JSF? Tôi đã gặp những ý kiến ​​rằng đây không phải là một cách tiếp cận tốt? – marioosh

13

Kể từ khi nó cần một bộ sưu tập, bạn có thể làm một bộ sưu tập (có chứa các yếu tố càng nhiều càng tốt số lượng thời gian bạn muốn để sản xuất các divs) trong đậu ủng hộ:

public class MyBean { 
    private List list = new ArrayList<Integer(); 

    { ... populate the list with numbers, for example ... } 

    public List getList() { 
    return list; 
    } 
... 
} 

và sau đó:

<ui:repeat value="#{myBean.list}" var="item"> 
    <div>content</div> 
</ui:repeat> 

.. sẽ tạo ra nhiều div như kích thước của thuộc tính list.

+0

Có, nhưng nó cần phải tạo Danh sách trong lớp. Tôi nghĩ về một cái gì đó đơn giản như trong PHP;) – marioosh

+0

Tại sao câu trả lời này không được bình chọn? –

+0

Đây là câu trả lời đúng. ui: lặp lại là cách an toàn để làm jstl của jstl c: foreach – Calabacin

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