如何在响应期间从辅助bean传递/重定向/分派到JSF页面

时间:2012-05-10 10:08:41

标签: jsf-2 primefaces

我有一个Web应用程序,它基本上在命令commandButton时处理用户的条目,然后接收事务的响应/结果消息,并且应该显示在另一个JSF页面中。

以下是我想要做的示例:我正在使用JSF2和primefaces

registration.xhtml - 交易的起点

RegistrationBean - registration.xhtml使用的支持bean    - 具有“create”(也处理输入的数据并假设设置ResultBean)方法,通过register.xhtml上的commanButton调用然后返回字符串进行导航(到result.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>

.....
.....

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
}

面-config.xml中

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

2 个答案:

答案 0 :(得分:1)

尝试在RegistrationBean的create()方法中创建ResultBean,并以编程方式将其放在合格范围内。 ViewScope可能不是正确的选择,因为您将离开注册视图。

要重定向,请将其放入闪存范围。

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

您还应该查看会话范围,这对于存储属于一个用例的一系列页面的bean非常有用。

答案 1 :(得分:0)

如果需要简单字符串,为什么不使用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
}

并在您的注册bean中:

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

public String create(){
  sessionBean.setCurrentResult(myResult);
  return "result";
}