2012-02-15 29 views
12

Như mọi khi, tôi hơi bối rối.JSF facelets mẫu bao bì

Ở đây https://community.jboss.org/wiki/ModularWebAppsWithJSF2 tôi đã học được rằng thật dễ dàng và hoạt động ra khỏi hộp để gộp mẫu trong các jars riêng biệt kể từ JSF 2.0.

Vấn đề duy nhất là: tôi không thể làm cho nó hoạt động. Tôi chỉ cần triển khai một "page.xhtml" trong tất cả các hương vị (thư mục META-INF, thư mục tài nguyên, root; có và không có faces-config.xml) trong một jar được bao gồm trong ứng dụng web WEB-INF/lib và yêu cầu một cái gì đó như http://host/demo/faces/page.xhtml hoặc thực hiện "bao gồm" hoặc "trang trí" trên mẫu. Tôi nhận được một ngoại lệ.

Ở đây Java EE6> Packaging JSF facelets (xhtml) and ManagedBeans as JAR giáo viên JSF yêu thích của tôi giải thích để sử dụng ResourceResolver tùy chỉnh để thực hiện chính xác điều này. Khi tôi gỡ rối các tài nguyên giải quyết tôi không có nghi ngờ rằng điều này sẽ làm việc và sẽ cung cấp cho nó một thử.

Đây là câu hỏi về cơ học - sự khác biệt giữa hai cách tiếp cận là gì?

Tự động tìm tài nguyên nào trong META-INF/tài nguyên?

Trả lời

19

Facelets tác phẩm (như vậy, chỉ đơn giản *.xhtml trang, các mẫu và bao gồm các file) đều được giải quyết bằng cách ExternalContext#getResource() mà các đại biểu để ServletContext#getResource(). Điều này đòi hỏi một container tương thích Servlet 3.x vì /WEB-INF/lib/*.jar!/META-INF/resources giải quyết từ mới là Servlet 3.0. Nếu bạn chưa sử dụng Servlet 3.x, hoặc muốn đặt các JAR đó trên một vị trí khác vì một lý do nào đó, thì bạn cần phải tạo một tùy chỉnh ResourceResolver. Xem thêm How to create a modular JSF 2.0 application?

Facelets thành phần composite và các tài nguyên tĩnh (như vậy, <cc:xxx> thành phần và nguồn CSS/JS/hình ảnh đó sẽ được nạp bởi <h:outputStylesheet>, <h:outputScript><h:graphicImage>) đều được giải quyết từ classpath bởi ClassLoader#getResource(). Để bao gồm tệp JAR trong quét lớp đường dẫn của JSF, bạn cần phải bao gồm tệp JSF 2.x tương thích faces-config.xml trong thư mục /META-INF của tệp JAR. Cùng một câu chuyện áp dụng cho @ManagedBean, @FacesValidator, @FacesConverter, @FacesComponent và các đồ tạo tác JSF khác.


Khi phát triển trong Eclipse, bạn có thể chọn web> Web Fragment Dự án để tạo ra một dự án mô-đun đó. Nó không khác nhiều so với dự án Java bình thường, hy vọng rằng nó sẽ ngầm bao gồm khía cạnh JavaScript và thời gian chạy được nhắm mục tiêu, tự động tạo tệp /META-INF/web-fragment.xml và liên kết với một dự án hiện tại Dynamic Web Project bằng cách thêm chính nó như là một hội đồng triển khai dự án.

Bạn cũng có thể sử dụng tiêu chuẩn hiện tại dự án Java với cấu trúc thư mục phù hợp đã chuẩn bị. Thư mục /META-INF phải đi trong thư mục nguồn Java. Tệp web-fragment.xml là tùy chọn. Bạn chỉ cần thêm thủ công dự án Java vào phần Triển khai Assembly của thuộc tính dự án web chính. Làm không thêm nó làm dự án khác trong phần Đường dẫn Xây dựng của dự án.

Khi bạn (thủ công) xây dựng tệp JAR ra khỏi nó, bạn cần đảm bảo rằng các mục nhập thư mục được thêm vào JAR, nếu không thì không thể giải quyết các bố cục Facelets. Nếu bạn đang xây dựng bằng cách xây dựng các công cụ như Eclipse/Ant/Maven/etc, điều này cũng phải được tính đến. Nếu điều này là không thể kiểm soát, một tùy chỉnh ResourceResolver là cách tiếp cận đáng tin cậy nhất.

+2

Một lần nữa cảm ơn rất nhiều. Trường hợp bạn có tất cả thông tin chi tiết này từ đâu. Bạn có một thực hiện các spec của riêng bạn :-) Các ResourceResolver là đơn giản và lên và chạy - bây giờ tôi sẽ cố gắng để nuôi một mảnh web để quái vật maven của chúng tôi ... – mtraut

+0

Không làm việc cho tôi: Tôi đang sử dụng một hiện tại dự án Java được chia sẻ chuẩn mà tôi đã loại bỏ khỏi Đường dẫn Xây dựng của Dự án đang triển khai và bây giờ nó chỉ được thêm vào như một hội đồng triển khai. Nhưng vẫn còn ManagedProperty của tôi bị bỏ qua trong chú thích hoặc khuôn mặt-config. – djmj

+0

@djmj: JAR phải có trình biên dịch JSF 2.0 '/ META-INF/faces-config.xml' và' faces-config.xml' của webapp chính không được có 'metadata-complete =" true "'. – BalusC

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