Статьи

Контракты библиотеки ресурсов

Facelets — это система веб-шаблонов с открытым исходным кодом под
лицензией Apache . JavaServer Faces 2.2 (
JSR 344 ) является частью
спецификации
JavaEE 7 , определяющей
контракты библиотеки ресурсов, которая позволяет динамически повторно использовать шаблоны Facelets во всем приложении во время выполнения. Как можно помнить, Facelets была технологией обработчика представления по умолчанию с Java Server Faces версии 2.0. В этом уроке мы обсудим использование контрактов с библиотеками ресурсов.

Что такое контракты?

Контракты в веб-приложении Java — это файлы шаблонов и CSS, которые сгруппированы в каталоге «
контракты » (
другое расположение по умолчанию — каталог META-INF / контракты в CLASSPATH ), родительским объектом которого является корневой каталог. Шаблоны и другие ресурсы каждого контракта (
например, файлы JavaScript, изображения ) находятся в своем собственном каталоге. Файл шаблона контракта называется «
объявленный шаблон, а CSS контракта и другие ресурсы называются
объявленными ресурсами

Требования к использованию

Прежде всего, для использования контрактов необходим объявленный шаблон,
тег
ui: insert, который называется
объявленными точками вставки в этом шаблоне. Объявленные шаблоны, объявленные точки вставки и
необязательные объявленные ресурсы вместе составляют определение библиотеки ресурсов. 

1. Структура каталогов проекта

contracts_body1

2. Зависимости проекта

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.faces</artifactId>
  <version>2.2.0</version>
</dependency>

3. Конфигурационный файл Faces

<application>
        
        <resource-library-contracts>
            
            <contract-mapping>
                <url-pattern>/member/*</url-pattern>
                <contracts>colorless</contracts>
            </contract-mapping>
            
            <contract-mapping>
                <url-pattern>*</url-pattern>
                <contracts>colored</contracts>
            </contract-mapping>
        
        </resource-library-contracts>
    
</application>

Контракт применяется на основе шаблона URL . На основе этой конфигурации в нашей реализации будут применяться «цветные» контракты в корневом каталоге и «бесцветные» контракты с директором-участником. 

4. /index.xhtml

<f:view contracts="#{myContracts.contract}">
            <ui:composition template="/template.xhtml">
                <ui:define name="content">
                    <h:panelGrid>
                        <a href="#{facesContext.externalContext.requestContextPath}/member/index.xhtml">Visit</a> member directory
                        <p>Choose a theme:</p>
                        <h:form>
                            <h:selectOneRadio value="#{myContracts.contract}" layout="pageDirection" required="true">
                                <f:selectItem itemValue="colored" itemLabel="Colored"/>
                                <f:selectItem itemValue="colorless" itemLabel="Colorless"/>
                            </h:selectOneRadio>
                            <h:commandButton value="Apply theme" action="index"/>
                        </h:form>
                    </h:panelGrid>
                </ui:define>
            </ui:composition>
        </f:view>
    </body>

Обратите внимание, что тег f: view содержит тег ui: состав и его атрибут контрактов . Мы обеспечим динамический обмен шаблонами, установив различные имена контрактов во время выполнения для свойства Managed Bean, которое связано с выражением EL для этого атрибута.

5. /member/index.xhtml

<body>
        <ui:composition template="/template.xhtml">
            <ui:define name="content">
                <a href="#{facesContext.externalContext.requestContextPath}/index.xhtml">Visit</a> home directory
                <br/>
            </ui:define>
        </ui:composition>
</body>

6. MyContracts.java

package com.kodcu;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 * @author hakdogan
 */

@ManagedBean
@SessionScoped
public class MyContracts implements Serializable {
    
    String contract = "colored";

    public String getContract() {
        return contract;
    }

    public void setContract(String contract) {
        this.contract = contract;
    }
    
}

7. Демо-приложение

contracts_body2

contracts_body3

Реальный контент выше и демонстрационное приложение, могут быть доступны в 
Resource Library Contracts