Передача параметров в качестве параметров в шаблонах в JSF 2.0 - PullRequest
1 голос
/ 17 февраля 2012

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

Например, для простых лиц вы можете написать следующую логику для создания кнопки:

<p:commandButton action="#{printBean.print}">
  <f:attribute name="report" value="report.jrxml" />
</p:commandButton>

Это нормально, когда мне не нужно передавать параметры.Однако мне нужно создать шаблон, который позволит мне указать параметры для динамической передачи в отчет.Моей первой попыткой было сделать следующее:

<p:commandButton actionListener="#{printBean.print}">
  <f:attribute name="report" value="report.jrxml" />
  <ui:insert name="reportParams" />
</p:commandButton>

, что позволило бы мне использовать шаблон следующим образом:

<ui:decorate template="templates/report.xhtml" >
  <ui:define name="reportParams>
    <f:attribute name="reportParam1" value="paramVal1" />
    <f:attribute name="reportParam2" value="paramVal2" />
    <f:attribute name="reportParam3" value="paramVal3" />        
    ...
  </ui:define>
</ui:decorate>

Однако переданные таким образом параметры не принимаются вмой слушатель действия в printBean, но параметр "report" есть.Я думаю, что атрибуты, передаваемые таким образом, интерпретируются как означающие, что они ссылаются на тег ui: define, а не на вставку в шаблон, как мне хотелось бы.

Есть ли альтернативный способ достижения того же пути?Имейте в виду, что я использую JSF 2.0 и Primefaces, но не Seam или любые добавленные библиотеки, и в идеале мне не нужно было бы добавлять какие-либо библиотеки, чтобы это работало.

Я прошу прощения, если ответ на этот вопрос уже существует, но поиск ответа на этот вопрос сводит с ума.

РЕДАКТИРОВАТЬ : число параметров является переменным, то есть я не могу просто использовать ui: param и поставить значение этого параметрав качестве значения атрибута в шаблоне, поскольку таких параметров может быть много.

1 Ответ

3 голосов
/ 17 февраля 2012

Используйте составной компонент вместо шаблона.

Создать этот файл /resources/mycomponents/printReport.xhtml:

<ui:component
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:p="http://primefaces.org/ui"
>
    <cc:interface>
        <!-- No attributes. -->
    </cc:interface>
    <cc:implementation>
        ...
        <p:commandButton value="Print" action="#{printBean.print}" />
        ...
    </cc:implementation>
</ui:component>

Используйте его следующим образом:

xmlns:my="http://java.sun.com/jsf/composite/mycomponents"
...
<my:printReport>
    <f:attribute name="reportParam1" value="paramVal1" />
    <f:attribute name="reportParam2" value="paramVal2" />
    <f:attribute name="reportParam3" value="paramVal3" />
</my:printReport>

Перепишите метод print следующим образом:

public void print() {
    UIComponent composite = UIComponent.getCurrentCompositeComponent(FacesContext.getCurrentInstance());
    String reportParam1 = (String) composite.getAttributes().get("reportParam1");
    String reportParam2 = (String) composite.getAttributes().get("reportParam2");
    String reportParam3 = (String) composite.getAttributes().get("reportParam3");
    // ...
}
...