Có thể đặt các tệp Facelets JSF2 có nội dung chung vào một JAR để sử dụng nó từ các ứng dụng web khác bên trong ví dụ: <ui:composition template>
, <ui:include src>
, <cc:implementation>
, v.v ...? Nếu có, làm thế nào tôi có thể đạt được điều này? Một số cấu hình bổ sung có cần thiết không?Các tệp khuôn mặt bao bì (mẫu, bao gồm, vật liệu tổng hợp) trong một JAR
Trả lời
Bạn có thể đặt các tài nguyên phổ biến trong thư mục /META-INF/resources
của JAR được xử lý giống như thư mục /WEB-INF/resources
của WAR.
Ví dụ:
CommonWebProject
|-- META-INF
| |-- resources
| | `-- common
| | |-- css
| | | `-- some.css
| | |-- js
| | | `-- some.js
| | |-- images
| | | `-- some.png
| | |-- components
| | | `-- somecomposite.xhtml
| | |-- someinclude.xhtml
| | `-- sometemplate.xhtml
| |-- faces-config.xml
| `-- MANIFEST.MF
:
Các nguồn lực của JAR là sau đó có sẵn như sau:
<... xmlns:common="http://xmlns.jcp.org/jsf/composite/common/components">
<h:outputStylesheet library="common" name="css/some.css" />
<h:outputScript library="common" name="js/some.js" />
<h:graphicImage library="common" name="images/some.png" />
<common:somecomposite />
<ui:include src="/common/someinclude.xhtml" />
<ui:composition template="/common/sometemplate.xhtml" />
...
Nếu bạn muốn kích hoạt các máy quét chú thích JSF2 cũng vì vậy mà bạn có thể đặt @ManagedBean
, @FacesValidator
, @FacesConverter
và các phu nhân ở chỗ dự án là tốt, sau đó tạo một JSF2 tương thích /META-INF/faces-config.xml
tệp:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
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-facesconfig_2_0.xsd"
version="2.0">
</faces-config>
Tài nguyên Facelets Trình phân giải chỉ cần thiết nếu tài nguyên không ở trong /META-INF/resources
vì một số lý do hoặc khi bạn không sử dụng Servlet 3.0 nhưng 2.5 hoặc khi bạn đang sử dụng phiên bản JBoss/JSF sớm có lỗi trong giải quyết tài nguyên META-INF. Xem thêm How to create a modular JSF 2.0 application? để biết ví dụ cụ thể.
Đầu tiên đọc ở đây về số difference between war and jar trong một câu hỏi tương tự.
Bạn sẽ phải tạo tệp EAR và đóng gói các cuộc chiến tranh với nhau.
Có, bạn có thể mở rộng com.sun.faces.facelets.impl.DefaultResourceResolver để cung cấp tài nguyên cho JSF.
Một giải pháp chung như sau:
Trong pom.xml add bạn:
<dependency>
<groupId>com.intersult</groupId>
<artifactId>jsf-desktop</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
<repository>
<id>intersult-repo</id>
<name>Intersult Repository</name>
<url>https://intersult.com/svn/public/maven</url>
</repository>
Hoặc chỉ cần thêm https://intersult.com/svn/public/maven/com/intersult/jsf-desktop/1.1-SNAPSHOT/jsf-desktop-1.1-SNAPSHOT.jar để WEB-INF thư mục của bạn// lib.
Trong web.xml add bạn:
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.intersult.jsf_desktop.util.ClassPathResourceResolver</param-value>
</context-param>
Trong bất kỳ JAR bên trong nơi WAR XHTML-Files dưới/META-INF/nguồn/<file.xhtml>
truy cập nó thông qua "http : // < miền >/< web gốc >/< jsf-servlet >/tài nguyên/<file.xhtml> "(ví dụ http://localhost/faces/resource/test.xhtml.) và nó sẽ được trả lại.
Cách tiếp cận này đã không hoạt động trên JBoss 6 (Mojarra 2.0.1). Tôi đã thử nghiệm trên Tomcat 7 và Glassfish 4, và cả hai đều làm việc. JBoss ném ngoại lệ này: 'java.io.FileNotFoundException \t org.apache.naming.resources.DirContextURLConnection.getInputStream (DirContextURLConnection.java: 369) ' –
@Rafael: http://stackoverflow.com/a/6201044 – BalusC
Ấn tượng! Bây giờ làm việc như một say mê! Cảm ơn bạn rất nhiều @BalusC. –