Как передать/перенаправить/отправить из резервного компонента на страницу JSF во время ответа

У меня есть веб-приложение, которое в основном обрабатывает записи пользователя при нажатии commandButton, затем получает сообщение ответа/результата транзакции и должно отображаться на другой странице JSF.

Вот пример того, что я хочу сделать: я использую JSF2 и простые лица.

registration.xhtml — начальная точка для транзакции

RegistrationBean — вспомогательный компонент, используемый Registration.xhtml — имеет метод «создать» (также обрабатывает введенные данные и предположительно настраивает ResultBean), вызываемый через commanButton в Registration.xhtml, а затем возвращает строку для навигации ( в результат.xhtml)

result.xhtml — пользовательский интерфейс результата транзакции.

ResultBean — содержит значения, необходимые для result.xhtml.

Я искал образцы в Интернете и, кажется, не могу найти. Есть ли способ сделать это? И если нет, может быть, обходной путь? Я новичок, пользуюсь этим. Любая помощь будет принята с благодарностью. Заранее спасибо! См. ниже пример кода.

registration.xhtml:

<h:form style="position: absolute" id="basicPartyRegistration">
<h:panelGroup>
    <h:commandButton id="createButton1"  action="#{partyRegistration.create}" value="Create">
    </h:commandButton>
    <h:button outcome="welcome" value="Main Page" id="mainPageButton" />
</h:panelGroup>
<br />
<h:panelGroup>
    <p:panelGrid columns="2">
    <h:outputText value="Receiver:" />
    <h:inputText id="receiver"
        value="#{partyRegistration.partyRegistrationInfo.receiverGLN}"
        size="15" maxlength="13" />
    <h:outputText value="TransmittingData:" />
    <h:inputText id="transmittingDataPool"
        value="#{partyRegistration.partyRegistrationInfo.transmittingDataPool}"
        size="15" maxlength="13" />
    <h:outputText value="PartyData:" />
    <h:inputText id="partyData"
        value="#{partyRegistration.partyRegistrationInfo.partyDataPool}"
         size="15" maxlength="13" />
</p:panelGrid>

.....
.....

Компонент регистрации:

@ManagedBean (name = "partyRegistration")
@viewScoped //Changed to @ConversationScoped
public class RegistrationBean implements Serializable{
    private String receiver
    private String transmittingData;
    private String partyDataPool;
    @ManagedProperty (value = "resultBean")
    private Result result;
    // more variables
    //public getters and setters

    public String create(){
       // do some processing
       // some magic way to set RESULT bean to be used in the next page
       return "result";
    }
}

результат.xhtml

<h:form style="position: absolute" id="partyRegistrationResponse">
<h:panelGroup>
<h:button outcome="welcome" value="Main Page" id="mainPageButton" />
</h:panelGroup>
<br/>
<h:panelGroup>
<p:panelGrid columns="4">
    <h:outputText value="Last Date Changed: " />
    <p:inputText id="lastDateChg" value="#{partyResponse.lastChangedDateItem}"
        title="Last Date Changed" size="15" >
    </p:inputText>

</p:panelGrid>
<h4>Response Identification</h4>
.....
.....

Результирующий компонент:

@ManagedBean (name = "partyResponse")
@ViewScoped //changed to @ConversationScoped
public Class ResultBean implements Serializable{
    private Date lastChangedDateItem;
    //more variables
    //getters and setters
}

faces-config.xml

<navigation-rule>
    <navigation-case>
        <from-outcome>result</from-outcome>
        <to-view-id>/result.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

person Charles G    schedule 10.05.2012    source источник
comment
Извините, мне непонятно, чего вы пытаетесь достичь. В чем проблема? (правило навигации не требуется в JSF 2.0)   -  person Matt Handy    schedule 10.05.2012
comment
Спасибо, Мэтт. Здесь я пытаюсь добиться того, чтобы result.xhtml содержал ResultBean (который был установлен в createButton). Мне нужны ответные сообщения (из процесса ResultBean) на странице result.xhtml.   -  person Charles G    schedule 10.05.2012


Ответы (2)


Попробуйте создать ResultBean в методе create() вашего RegistrationBean и поместить его в квалифицированную область программным способом. ViewScope может быть неправильным выбором, так как вы выходите из режима регистрации.

Чтобы пережить перенаправление, поместите его в область флэш-памяти.

FacesContext.getCurrentInstance().getExternalContext().getFlash().putNow("partyResponse", resultBean);

Вы также должны взглянуть на область диалога, которая полезна для хранения bean-компонентов для последовательности страниц, принадлежащих одному варианту использования.

person Frank    schedule 10.05.2012
comment
Привет, Фрэнк. Еще одна вещь, сфера беседы находится на шве или коте, верно? Если бы я использовал это, знаете ли вы, есть ли проблемы совместимости между ними и простыми лицами? - person Charles G; 10.05.2012
comment
Он был представлен швом, но теперь является официальным стандартом Java: CDI. Таким образом, вам нужен контейнер с поддержкой CDI, но не обязательно использовать шов. Ищите сварку на домашней странице шва, это реализация CDI. Вы можете использовать его с tomcat, так как tomcat по умолчанию не предлагает CDI. ссылка Primefaces с ним тоже работает. - person Frank; 10.05.2012
comment
Привет Фрэнк! Спасибо! Наконец-то я понял. Я использовал область разговора, как было предложено, и это сработало! Я также пробовал область flash, но она не работала с bean-компонентами с областью видимости. - person Charles G; 10.05.2012

Если вам нужна только простая строка, почему бы не использовать FacesMessage?

public String create(){
    FacesContext.getCurrentInstance()
       .addMessage(null, new FacesMessage("Add your message here"));
    return "result";
}

и в вашем result.xhtml используйте тег <h:messages>:

<h4>Response Identification</h4>
<h:messages/>

В противном случае, если вам потребуется больше, чем сообщение о результате, вам следует действительно продумать свой дизайн и поместить ResultBean в более широкую область (разговор или сеанс).

Например, с bean-компонентом с областью сеанса, который содержит текущий результат:

@ManagedBean
@SessionScoped
public Class SessionBean
  private Result currentResult;
  // getter and setter
}

и в вашем регистрационном компоненте:

// inject the session scoped bean
@ManagedProperty(value="#{sessionBean}")
private SessionBean sessionBean;

public String create(){
  sessionBean.setCurrentResult(myResult);
  return "result";
}
person Matt Handy    schedule 10.05.2012
comment
Спасибо, Мэтт. Но я думаю, что это было бы обходным путем, если бы я не смог заполнить ResultBean. Обратите внимание, что ResultBean состоит из дат, статуса и некоторого списка значений. - person Charles G; 10.05.2012
comment
Тогда вы должны использовать более широкий охват. Обновил мой ответ. - person Matt Handy; 10.05.2012