2011-04-07 3 views
4

У меня есть приложение, использующее композицию (для шаблонов страниц). Но мы думаем, что создаем веб-приложение (войну) для размещения всех шаблонов, совместно используемых всеми приложениями в одном и том же хосте всех приложений.Как использовать композицию Facelets с файлами из другого контекста

Как я могу включить шаблон из другого контекста? В это время я использую импорт из http-запроса. Но это звучит плохо.

<ui:composition template="http://localhost:8080/templates/layout/foo.xhtml">

Я использую JBoss Seam 2.x с JSF 1.

ответ

8

Это возможно с помощью ресурса распознаватель пользовательских Facelets. Я бы не разрешил их только HTTP, а просто из класса. Просто упакуйте общие шаблоны, например, в папку /META-INF/resources файла JAR и отпустите класс resolver в том же JAR. Наконец, распространите этот JAR среди всех webapps.

package com.example; 

import java.net.URL; 

import com.sun.facelets.impl.DefaultResourceResolver; 

public class FaceletsResourceResolver extends DefaultResourceResolver { 

    private String basePath; 

    public FaceletsResourceResolver() { 
     this.basePath = "/META-INF/resources"; // TODO: Make configureable? 
    } 

    public URL resolveUrl(String path) { 
     URL url = super.resolveUrl(path); // Resolves from WAR. 

     if (url == null) { 
      url = getClass().getResource(basePath + path); // Resolves from JAR. 
     } 

     return url; 
    } 

} 

Зарегистрируйте в web.xml следующим образом:

<context-param> 
    <param-name>facelets.RESOURCE_RESOLVER</param-name> 
    <param-value>com.example.FaceletsResourceResolver</param-value> 
</context-param> 

Обратите внимание, что это должно быть сделано по-разному в JSF 2.x Facelets см this answer для деталей.

+0

спасибо @BalusC. Я использую JBoss Seam 2.x с JEE 5, и я не могу найти класс ResourceResolver. –

+0

Ах, ты все еще на JSF 1.x, я обновил ответ. – BalusC

+0

Спасибо @BalusC. –

Смежные вопросы