从JSF2中的操作导航时如何传递视图参数?

时间:2010-08-31 00:35:43

标签: jsf jsf-2

从我的bean中的操作,我正在尝试重定向到期望视图参数的另一个页面。在JSF2中建议的方法是什么?

例如,我的源页面是: http://localhost/page1.xhtml

它有一个调用动作的commandButton:

<h:commandButton value="submit" action="#{myBean.submit}" />

我的bean看起来像:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success";
}

现在,我希望'submit'操作的返回导航到 http://localhost/page2.xhtml?id=2

我尝试在我的导航案例中使用view-param执行此操作,但结果很奇怪。 faces-config片段如下所示:

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>id</name>
                <value>#{myBean.id}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

奇怪的行为是,即使myBean设置为请求作用域,它只在我第一次加载应用程序时调用myBean.getId(),并为所有后续调用重用相同的值,从而为page2生成不正确的视图参数。

所以我正在寻找一种更好的方法,或者为什么每次都不会从我的bean请求view-param的原因/解决方案。

5 个答案:

答案 0 :(得分:53)

在JSF中传递参数的不直观之处在于,您不会决定发送什么(在操作中),而是您希望接收的内容(在目标页面中)。

当您执行以重定向结束的操作时,将加载目标页面元数据并读取所有必需参数并将其作为参数附加到URL。

请注意,这与任何其他JSF绑定完全相同:您无法从一个位置读取inputText的值并将其写入其他位置。 viewParam中定义的值表达式既可用于读取(在重定向之前),也可用于写入(在重定向之后)。

使用你的bean你就可以了:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success?faces-redirect=true&includeViewParams=true";
}

// setter and getter for id

如果接收方有:

    <f:metadata>
        <f:viewParam name="id" value="#{myBean.id}" />
    </f:metadata>

它会完全按照您的意愿行事。

答案 1 :(得分:15)

如果没有更好的解决方案,我发现工作只是在bean返回中构建我的查询字符串:

public String submit() {
    // Do something
    return "/page2.xhtml?faces-redirect=true&id=" + id;
}

不是最灵活的解决方案,但似乎按我的意愿行事。

还使用此方法清理构建查询字符串的过程: http://www.warski.org/blog/?p=185

答案 2 :(得分:2)

看看这些:

你需要类似的东西:

<h:link outcome="success">
  <f:param name="foo" value="bar"/>
</h:link>

...和...

<f:metadata>
  <f:viewParam name="foo" value="#{bean.foo}"/>
</f:metadata>

this page判断,这样的事情可能会更容易:

 <managed-bean>
   <managed-bean-name>blog</managed-bean-name>
   <managed-bean-class>com.acme.Blog</managed-bean-class>
   <managed-property>
      <property-name>entryId</property-name>
      <value>#{param['id']}</value>
   </managed-property>
 </managed-bean>

答案 3 :(得分:0)

你可以使用这样的Primefaces来做到这一点:

<p:button 
      outcome="/page2.xhtml?faces-redirect=true&amp;id=#{myBean.id}">
</p:button>

答案 4 :(得分:0)

只需将看到的属性添加到重定向标记,如下所示:

<redirect include-view-params="true">
    <view-param>
        <name>id</name>
        <value>#{myBean.id}</value>
    </view-param>
</redirect>

Here是一些导航示例。