Как да прехвърлите/пренасочите/изпратите от backing bean към JSF страница по време на отговор

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

Ето примерно какво искам да направя: използвам JSF2 и primefaces

registration.xhtml - начална точка за транзакцията

RegistrationBean - поддържащ bean, използван от registration.xhtml - има метода "create" (също обработва въведените данни и предполагаемо настройва ResultBean), извикан чрез commanButton на registration.xhtml, след което връща низ за навигация ( към result.xhtml)

result.xhtml - UI резултат от транзакцията

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>

.....
.....

RegistrationBean:

@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";
    }
}

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>
.....
.....

ResultBean:

@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);

Трябва да разгледате и обхвата на разговора, който е полезен за съхраняване на зърна за поредица от страници, които принадлежат към един случай на употреба.

person Frank    schedule 10.05.2012
comment
Здравей Франк. Още нещо, обхватът на разговора е на шев или котка, нали? Ако бих използвал това, знаете ли дали има проблеми със съвместимостта между тях и primefaces? - person Charles G; 10.05.2012
comment
Той беше въведен чрез шев, но сега е официален стандарт на Java: CDI. Така че имате нужда от контейнер с активиран CDI, но не е задължително да използвате шев. Потърсете заварка на началната страница на шева, това е реализация на CDI. Можете да го използвате с tomcat, тъй като tomcat не предлага CDI по подразбиране. връзка Primefaces работи и с него. - person Frank; 10.05.2012
comment
Здравей Франк! Благодаря! Най-накрая го разбрах. Използвах обхвата на разговора, както беше предложено, и проработи! Опитах също флаш обхвата, но той нямаше да работи на бобове с обхват на изглед. - 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