Что является аналогом jsp .tag-файлов в jsf или как избежать копирования и вставки кода jsf/facelets?

Я думаю, что название достаточно ясно, поэтому я только добавлю пример типичной ситуации.

Первый блок кода:

<div id="mailpanel">
    <h:panelGroup id="sendmailpane" styleClass="sendmailpane" layout="block"
                  rendered="#{userReports.reportRendered}">
        <o:inputTextarea promptText="#{msg['mail.listrules']}" promptTextStyle="color: #333"
               value="#{userReports.mailingList}" styleClass="maillist"/>
        <br/>
        <h:commandLink id="sendlink" value="#{msg['mail.sendLink']}"
                   action="#{userReports.sendMail}"/>
    </h:panelGroup>
</div>

Второй (скопированный) блок кода:

<div id="mailpanel">
    <h:panelGroup id="sendmailpane" styleClass="sendmailpane" layout="block"
                  rendered="#{projectReports.reportRendered}">
        <o:inputTextarea promptText="#{msg['mail.listrules']}" promptTextStyle="color: #333"
               value="#{projectReports.mailingList}" styleClass="maillist"/>
        <br/>
        <h:commandLink id="sendlink" value="#{msg['mail.sendLink']}"
                   action="#{projectReports.sendMail}"/>
    </h:panelGroup>
</div>

Как вы можете видеть, оба блока кода почти одинаковы, но каждый из них использует разные компоненты поддержки (но даже компоненты имеют суперкласс, и все используемые в этом примере методы на самом деле являются методами этого суперкласса).

2 ответа

Решение
<ui:include src="commonFile.jsp">
    <ui:param name="reportsBean" value="#{projectReports}" />
</ui:include>

и в commonFile.jsp у тебя есть:

<h:commandLink id="sendlink" value="#{msg['mail.sendLink']}"
               action="#{reportsBean.sendMail}" />

Вы не можете, увы, указать, какие именно параметры должны быть включены. Вот почему я использую следующую практику: всякий раз, когда вы добавляете параметр, вы помещаете комментарий поверх commonFile.jsp с указанием имени, типа и обязательных / необязательных. Например:

<!-- param: reportsBean, required -->
<!-- param: showLegend, optional, default: false, type: boolean -->

В JSP вы можете использовать собственные теги для этого. В Facelets для этого вы можете использовать шаблоны или составные компоненты JSF 2.0.

Другие вопросы по тегам